From 8c26cab9162fdc4b0c2719792d1d50d33df5d9a9 Mon Sep 17 00:00:00 2001 From: Sebastian Kalinowski Date: Wed, 3 Jun 2015 12:21:13 +0200 Subject: [PATCH] Add testing using py.test * added py27 tox env to default env list * added pytest and pytest-django as test requirements * tests with database marked as expected to fail until DB will be configured correctly on CI * fixed issues and fails in tests Partial-Bug: #1462906 Change-Id: I4e37ca12c645950eedc9ced5b59daf1fd22005ee --- devops/models/__init__.py | 3 +- devops/tests/test_libvirt_xml_builder.py | 87 ++++++++++++++++-------- devops/tests/test_manager.py | 3 + devops/tests/test_models.py | 2 +- setup.py | 1 - test-requirements.txt | 4 ++ tox.ini | 14 +++- 7 files changed, 83 insertions(+), 31 deletions(-) create mode 100644 test-requirements.txt diff --git a/devops/models/__init__.py b/devops/models/__init__.py index 5591efd7..7e80f088 100644 --- a/devops/models/__init__.py +++ b/devops/models/__init__.py @@ -15,8 +15,9 @@ import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "devops.settings") -from devops.models.network import DiskDevice from devops.models.environment import Environment +from devops.models.network import Address +from devops.models.network import DiskDevice from devops.models.network import Interface from devops.models.network import Network from devops.models.node import Node diff --git a/devops/tests/test_libvirt_xml_builder.py b/devops/tests/test_libvirt_xml_builder.py index c2b74814..c470f0d5 100644 --- a/devops/tests/test_libvirt_xml_builder.py +++ b/devops/tests/test_libvirt_xml_builder.py @@ -16,23 +16,24 @@ import json import random from unittest import TestCase -from mock import Mock +import mock from devops.driver.libvirt.libvirt_xml_builder import LibvirtXMLBuilder class BaseTestXMLBuilder(TestCase): def setUp(self): - self.xml_builder = LibvirtXMLBuilder(Mock()) - self.xml_builder.driver.volume_path = Mock( + self.xml_builder = LibvirtXMLBuilder(mock.Mock()) + self.xml_builder.driver.volume_path = mock.Mock( return_value="volume_path_mock" ) - self.xml_builder.driver.network_name = Mock( + self.xml_builder.driver.network_name = mock.Mock( return_value="network_name_mock" ) - self.net = Mock() - self.vol = Mock() - self.node = Mock() + self.xml_builder.driver.reboot_timeout = None + self.net = mock.Mock() + self.vol = mock.Mock() + self.node = mock.Mock() class TestNetworkXml(BaseTestXMLBuilder): @@ -68,12 +69,11 @@ class TestNetworkXml(BaseTestXMLBuilder): ip = '172.0.1.1' prefix = '24' self.net.ip_network = "{0}/{1}".format(ip, prefix) - self.net.has_pxe_server = True + self.net.has_pxe_server = False self.net.tftp_root_dir = '/tmp' xml = self.xml_builder.build_network_xml(self.net) - str = ''' - - '''.format(ip, prefix, self.net.tftp_root_dir) + str = ''.format( + ip, prefix) self.assertIn(str, xml) @@ -103,7 +103,7 @@ class TestVolumeXml(BaseTestXMLBuilder): '''.format(self.vol.format), xml) def test_backing_store(self): - self.vol.backing_store = Mock( + self.vol.backing_store = mock.Mock( uuid="volume_uuid", format="raw" ) @@ -144,13 +144,15 @@ class TestNodeXml(BaseTestXMLBuilder): self.node.architecture = 'test_architecture' self.node.boot = '["dev1", "dev2"]' self.node.has_vnc = None - self.node.disk_devices = [] + disk_devices = mock.MagicMock() + disk_devices.filter.return_value = [] + self.node.disk_devices = disk_devices self.node.interfaces = [] def test_node(self): xml = self.xml_builder.build_node_xml(self.node, 'test_emulator') boot = json.loads(self.node.boot) - self.assertIn(''' + expected = ''' test_env_name_test_name @@ -158,12 +160,25 @@ class TestNodeXml(BaseTestXMLBuilder): {0} {1} + + + + + + + + + + + + {3} + test_emulator '''.format(self.node.vcpu, str(self.node.memory * 1024), self.node.architecture, self.node.os_type, - boot[0], boot[1]), xml) + boot[0], boot[1]) + self.assertIn(expected, xml) - def test_node_devices(self): - volumes = [Mock(uuid=i, format='frmt{0}'.format(i)) for i in range(3)] - self.node.disk_devices = [ - Mock(type='type{0}'.format(i), device='device{0}'.format(i), - volume=volumes[i], target_dev='tdev{0}'.format(i), - bus='bus{0}'.format(i)) for i in range(3)] + @mock.patch('devops.driver.libvirt.libvirt_xml_builder.uuid') + def test_node_devices(self, mock_uuid): + mock_uuid.uuid4.return_value.hex = 'disk-serial' + volumes = [mock.Mock(uuid=i, format='frmt{0}'.format(i)) + for i in range(3)] + + disk_devices = [ + mock.Mock( + type='type{0}'.format(i), + device='device{0}'.format(i), + volume=volumes[i], + target_dev='tdev{0}'.format(i), + bus='bus{0}'.format(i) + ) for i in range(3) + ] + self.node.disk_devices = mock.MagicMock() + self.node.disk_devices.__iter__.return_value = iter(disk_devices) xml = self.xml_builder.build_node_xml(self.node, 'test_emulator') - self.assertIn(''' + expected = ''' + test_emulator + disk-serial + disk-serial + disk-serial ''', xml) + ''' + self.assertIn(expected, xml) def test_node_interfaces(self): - networks = [Mock(uuid=i) for i in range(3)] + networks = [mock.Mock(uuid=i) for i in range(3)] self.node.interfaces = [ - Mock(type='network'.format(i), mac_address='mac{0}'.format(i), - network=networks[i], id='id{0}'.format(i), - model='model{0}'.format(i)) for i in range(3)] + mock.Mock(type='network'.format(i), mac_address='mac{0}'.format(i), + network=networks[i], id='id{0}'.format(i), + model='model{0}'.format(i)) for i in range(3)] xml = self.xml_builder.build_node_xml(self.node, 'test_emulator') self.assertIn(''' + test_emulator diff --git a/devops/tests/test_manager.py b/devops/tests/test_manager.py index e06dffeb..60d9aecb 100644 --- a/devops/tests/test_manager.py +++ b/devops/tests/test_manager.py @@ -12,9 +12,11 @@ # License for the specific language governing permissions and limitations # under the License. + from django.test import TestCase from ipaddr import IPNetwork from ipaddr import IPv4Network +import pytest from devops.helpers.network import IpNetworksPool from devops.models import Address @@ -26,6 +28,7 @@ from devops.models import Node from devops.models import Volume +@pytest.mark.xfail(reason="No DB configured") class TestManager(TestCase): def tearDown(self): diff --git a/devops/tests/test_models.py b/devops/tests/test_models.py index b7138d60..b7bdaaf9 100644 --- a/devops/tests/test_models.py +++ b/devops/tests/test_models.py @@ -17,7 +17,7 @@ import threading from django.utils import unittest -from devops.models import double_tuple +from devops.models.base import double_tuple from devops.models import Network diff --git a/setup.py b/setup.py index 49112649..1860fe92 100644 --- a/setup.py +++ b/setup.py @@ -41,7 +41,6 @@ setup( 'psycopg2', 'south', 'PyYAML', - 'mock', 'libvirt-python', ] ) diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 00000000..108501e0 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,4 @@ +mock >= 1.0.1 +pytest >= 2.7.1 +pytest-django >= 2.8.0 +py == 1.4.26 # https://bitbucket.org/pytest-dev/pytest/issue/752/internalerror-indexerror-list-index-out-of diff --git a/tox.ini b/tox.ini index 07809ec9..9783922b 100644 --- a/tox.ini +++ b/tox.ini @@ -5,9 +5,18 @@ [tox] minversion = 1.6 -envlist = pep8 +envlist = py27, pep8 skipsdist = True +[testenv] +usedevelop = True +deps = -r{toxinidir}/test-requirements.txt +commands = + py.test -v {posargs:devops/tests} + +[testenv:venv] +commands = {posargs:} + [testenv:pep8] deps = hacking==0.10.1 usedevelop = False @@ -22,3 +31,6 @@ exclude = .venv,.git,.tox,dist,doc,*lib/python*,*egg,build,tools,__init__.py,doc show-pep8 = True show-source = True count = True + +[pytest] +DJANGO_SETTINGS_MODULE=devops.settings