Also add flake8 target in tests Makefile and rewrite some parts to be more pythonic. Signed-off-by: Katerina Koukiou <kkoukiou@xxxxxxxxxx> --- HACKING.md | 2 +- test/Makefile.am | 15 ++++++++++++--- test/conftest.py | 15 +++++++++++++++ test/libvirttest.py | 51 ++++++++++++++++++++++++++++----------------------- test/test_connect.py | 35 +++++++++++++++-------------------- test/test_domain.py | 39 +++++++++++++++++---------------------- test/travis-run | 4 ++-- 7 files changed, 90 insertions(+), 71 deletions(-) create mode 100644 test/conftest.py diff --git a/HACKING.md b/HACKING.md index 75aa6d0..30d321c 100644 --- a/HACKING.md +++ b/HACKING.md @@ -35,7 +35,7 @@ Running from git repository make check ``` - The test tool requires python3 and python3-dbus. + The test tool requires python3, pytest and python3-dbus. * To run libvirt-dbus directly from the build dir without installing it diff --git a/test/Makefile.am b/test/Makefile.am index d3997f3..554c433 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,17 +1,26 @@ test_helpers = \ - libvirttest.py + libvirttest.py \ + conftest.py test_programs = \ test_connect.py \ test_domain.py -TESTS = $(test_programs) - EXTRA_DIST = \ $(test_helpers) \ $(test_programs) \ travis-run +TEST_PATH=./ + +lint: + flake8 --exclude=.tox --ignore=E501 + +test: + py.test --verbose --color=yes $(TEST_PATH) + +check: lint test + TESTS_ENVIRONMENT = \ abs_top_builddir=$(abs_top_builddir) \ VIRT_DBUS_INTERFACES_DIR=$(abs_top_srcdir)/data diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 0000000..a468599 --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,15 @@ +import os +import subprocess +import pytest + + +@pytest.fixture(scope="session", autouse=True) +def dbus_daemon_session(): + """Fixture to start D-Bus message bus session daemon for use in the whole test suite. + """ + dbus_daemon = subprocess.Popen(['dbus-daemon', '--session', '--print-address'], + stdout=subprocess.PIPE, universal_newlines=True) + os.environ['DBUS_SESSION_BUS_ADDRESS'] = dbus_daemon.stdout.readline().strip() + yield + dbus_daemon.terminate() + dbus_daemon.wait(timeout=10) diff --git a/test/libvirttest.py b/test/libvirttest.py index 6a00aea..fc8c5c4 100644 --- a/test/libvirttest.py +++ b/test/libvirttest.py @@ -1,34 +1,33 @@ #!/usr/bin/python3 -from dbus.mainloop.glib import DBusGMainLoop -from gi.repository import GLib -import dbus import os import subprocess import time -import unittest +import pytest +from gi.repository import GLib +from dbus.mainloop.glib import DBusGMainLoop +import dbus -root = os.environ.get('abs_top_builddir', os.path.dirname(os.path.dirname(__file__))) -exe = os.path.join(root, 'src', 'libvirt-dbus') +ROOT = os.environ.get('abs_top_builddir', os.path.dirname(os.path.dirname(__file__))) +EXE = os.path.join(ROOT, 'src', 'libvirt-dbus') DBusGMainLoop(set_as_default=True) -class TestCase(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.bus = subprocess.Popen(['dbus-daemon', '--session', '--print-address'], - stdout=subprocess.PIPE, universal_newlines=True) - os.environ['DBUS_SESSION_BUS_ADDRESS'] = cls.bus.stdout.readline().strip() - @classmethod - def tearDownClass(cls): - cls.bus.terminate() - cls.bus.wait(timeout=10) +class BaseTestClass(): + """ Base test class for whole test suite + """ + connect = None + bus = None + libvirt_dbus = None + loop = False - def setUp(self): + @pytest.fixture(autouse=True) + def libvirt_dbus_setup(self, request): + """Start libvirt-dbus for each test function + """ os.environ['LIBVIRT_DEBUG'] = '3' - - self.daemon = subprocess.Popen([exe]) + self.libvirt_dbus = subprocess.Popen([EXE]) self.bus = dbus.SessionBus() for i in range(10): @@ -41,12 +40,18 @@ class TestCase(unittest.TestCase): obj = self.bus.get_object('org.libvirt', '/org/libvirt/Test') self.connect = dbus.Interface(obj, 'org.libvirt.Connect') - def tearDown(self): - self.daemon.terminate() - self.daemon.wait(timeout=10) + @pytest.fixture(autouse=True) + def libvirt_dbus_teardown(self): + """Terminate libvirt-dbus at the teardown of each test + """ + yield + self.libvirt_dbus.terminate() + self.libvirt_dbus.wait(timeout=10) def main_loop(self): - self.assertFalse(getattr(self, 'loop', False)) + """Initializes the mainloop + """ + assert getattr(self, 'loop', False) is False def timeout(): self.loop.quit() diff --git a/test/test_connect.py b/test/test_connect.py index 4ec3fe0..14f70d5 100755 --- a/test/test_connect.py +++ b/test/test_connect.py @@ -1,10 +1,9 @@ -#!/usr/bin/python3 - import dbus import libvirttest -import unittest -minimal_xml = ''' + +class TestConnect(libvirttest.BaseTestClass): + minimal_xml = ''' <domain type="test"> <name>foo</name> <memory>1024</memory> @@ -12,16 +11,15 @@ minimal_xml = ''' <type>hvm</type> </os> </domain> -''' + ''' -class TestConnect(libvirttest.TestCase): def test_list_domains(self): domains = self.connect.ListDomains(0) - self.assertEqual(type(domains), dbus.Array) - self.assertEqual(len(domains), 1) + assert isinstance(domains, dbus.Array) + assert len(domains) == 1 for path in domains: - self.assertEqual(type(path), dbus.ObjectPath) + assert isinstance(path, dbus.ObjectPath) domain = self.bus.get_object('org.libvirt', path) # ensure the path exists by calling Introspect on it @@ -29,29 +27,26 @@ class TestConnect(libvirttest.TestCase): def test_create(self): def domain_started(name, path): - self.assertEqual(name, 'foo') - self.assertEqual(type(path), dbus.ObjectPath) + assert name == 'foo' + assert isinstance(path, dbus.ObjectPath) self.loop.quit() self.connect.connect_to_signal('DomainStarted', domain_started) - path = self.connect.CreateXML(minimal_xml, 0) - self.assertEqual(type(path), dbus.ObjectPath) + path = self.connect.CreateXML(self.minimal_xml, 0) + assert isinstance(path, dbus.ObjectPath) self.main_loop() def test_define(self): def domain_defined(name, path): - self.assertEqual(name, 'foo') - self.assertEqual(type(path), dbus.ObjectPath) + assert name == 'foo' + assert isinstance(path, dbus.ObjectPath) self.loop.quit() self.connect.connect_to_signal('DomainDefined', domain_defined) - path = self.connect.DefineXML(minimal_xml) - self.assertEqual(type(path), dbus.ObjectPath) + path = self.connect.DefineXML(self.minimal_xml) + assert isinstance(path, dbus.ObjectPath) self.main_loop() - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/test/test_domain.py b/test/test_domain.py index b1ab7a5..b176c29 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -1,10 +1,8 @@ -#!/usr/bin/python3 - import dbus import libvirttest -import unittest -class TestDomain(libvirttest.TestCase): + +class TestDomain(libvirttest.BaseTestClass): def domain(self): path = self.connect.ListDomains(0)[0] obj = self.bus.get_object('org.libvirt', path) @@ -14,21 +12,21 @@ class TestDomain(libvirttest.TestCase): obj, domain = self.domain() props = obj.GetAll('org.libvirt.Domain', dbus_interface=dbus.PROPERTIES_IFACE) - self.assertEqual(type(props['Name']), dbus.String) - self.assertEqual(type(props['UUID']), dbus.String) - self.assertEqual(type(props['Id']), dbus.UInt32) - self.assertEqual(type(props['Vcpus']), dbus.UInt32) - self.assertEqual(type(props['OSType']), dbus.String) - self.assertEqual(type(props['Active']), dbus.Boolean) - self.assertEqual(type(props['Persistent']), dbus.Boolean) - self.assertEqual(type(props['State']), dbus.String) - self.assertEqual(type(props['Autostart']), dbus.Boolean) + assert isinstance(props['Name'], dbus.String) + assert isinstance(props['UUID'], dbus.String) + assert isinstance(props['Id'], dbus.UInt32) + assert isinstance(props['Vcpus'], dbus.UInt32) + assert isinstance(props['OSType'], dbus.String) + assert isinstance(props['Active'], dbus.Boolean) + assert isinstance(props['Persistent'], dbus.Boolean) + assert isinstance(props['State'], dbus.String) + assert isinstance(props['Autostart'], dbus.Boolean) # Call all methods except Reset and GetStats, because the test backend # doesn't support those xml = domain.GetXMLDesc(0) - self.assertEqual(type(xml), dbus.String) + assert isinstance(xml, dbus.String) domain.Reboot(0) domain.Shutdown() @@ -38,8 +36,8 @@ class TestDomain(libvirttest.TestCase): def test_shutdown(self): def domain_stopped(name, path): - self.assertEqual(name, 'test') - self.assertEqual(type(path), dbus.ObjectPath) + assert name == 'test' + assert isinstance(path, dbus.ObjectPath) self.loop.quit() self.connect.connect_to_signal('DomainStopped', domain_stopped) @@ -48,14 +46,14 @@ class TestDomain(libvirttest.TestCase): domain.Shutdown() state = obj.Get('org.libvirt.Domain', 'State', dbus_interface=dbus.PROPERTIES_IFACE) - self.assertEqual(state, 'shutoff') + assert state == 'shutoff' self.main_loop() def test_undefine(self): def domain_undefined(name, path): - self.assertEqual(name, 'test') - self.assertEqual(type(path), dbus.ObjectPath) + assert name == 'test' + assert isinstance(path, dbus.ObjectPath) self.loop.quit() self.connect.connect_to_signal('DomainUndefined', domain_undefined) @@ -65,6 +63,3 @@ class TestDomain(libvirttest.TestCase): domain.Undefine() self.main_loop() - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/test/travis-run b/test/travis-run index 7577253..c2ab729 100755 --- a/test/travis-run +++ b/test/travis-run @@ -22,7 +22,7 @@ sudo chroot "$CHROOT" << EOF set -ex # install build deps apt-get update -apt-get install -y dh-autoreconf pkg-config libvirt-dev libglib2.0-dev libtool python3-gi python3-dbus dbus +apt-get install -y dh-autoreconf pkg-config libvirt-dev libglib2.0-dev libtool python3-gi python3-dbus dbus pytest # run build and tests as user chown -R buildd:buildd /build @@ -31,6 +31,6 @@ set -ex cd /build/src ./autogen.sh make -j4 -make check || { cat test-suite.log; exit 1; } +make check EOU EOF -- 2.15.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list