diff --git a/TESTING.rst b/TESTING.rst index 0d6814e8e..64a217f83 100644 --- a/TESTING.rst +++ b/TESTING.rst @@ -4,16 +4,16 @@ Testing Neutron Overview -------- -The unit tests are meant to cover as much code as possible and should -be executed without the service running. They are designed to test -the various pieces of the neutron tree to make sure any new changes -don't break existing functionality. +The unit tests (neutron/test/unit/) are meant to cover as much code as +possible and should be executed without the service running. They are +designed to test the various pieces of the neutron tree to make sure +any new changes don't break existing functionality. -The functional tests are intended to validate actual system -interaction. Mocks should be used sparingly, if at all. Care -should be taken to ensure that existing system resources are not -modified and that resources created in tests are properly cleaned -up. +The functional tests (neutron/tests/functional/) are intended to +validate actual system interaction. Mocks should be used sparingly, +if at all. Care should be taken to ensure that existing system +resources are not modified and that resources created in tests are +properly cleaned up. Development process ------------------- @@ -100,6 +100,16 @@ Neutron source code:: tox +To run functional tests that do not require sudo privileges or +specific-system dependencies:: + + tox -e functional + +To run all the functional tests in an environment that has been configured +by devstack to support sudo and system-specific dependencies:: + + tox -e dsvm-functional + For more information on the standard Tox-based test infrastructure used by OpenStack and how to do some common test/debugging procedures with Testr, see this wiki page: diff --git a/neutron/tests/functional/agent/linux/base.py b/neutron/tests/functional/agent/linux/base.py index 5891c872e..29198004a 100644 --- a/neutron/tests/functional/agent/linux/base.py +++ b/neutron/tests/functional/agent/linux/base.py @@ -29,7 +29,7 @@ class BaseLinuxTestCase(functional_base.BaseSudoTestCase): try: utils.execute(cmd, root_helper=root_helper) except RuntimeError as e: - if error_text in str(e): + if error_text in str(e) and not self.fail_on_missing_deps: self.skipTest(skip_msg) raise diff --git a/neutron/tests/functional/agent/linux/test_ovsdb_monitor.py b/neutron/tests/functional/agent/linux/test_ovsdb_monitor.py index 9d8570ded..3f37ce0ed 100644 --- a/neutron/tests/functional/agent/linux/test_ovsdb_monitor.py +++ b/neutron/tests/functional/agent/linux/test_ovsdb_monitor.py @@ -47,8 +47,6 @@ class BaseMonitorTest(linux_base.BaseOVSLinuxTestCase): def _check_test_requirements(self): self.check_sudo_enabled() - self.check_command(['which', 'ovsdb-client'], - 'Exit code: 1', 'ovsdb-client is not installed') self.check_command(['ovsdb-client', 'list-dbs'], 'Exit code: 1', 'password-less sudo not granted for ovsdb-client', diff --git a/neutron/tests/functional/base.py b/neutron/tests/functional/base.py index 471acaea6..fe25535fa 100644 --- a/neutron/tests/functional/base.py +++ b/neutron/tests/functional/base.py @@ -46,8 +46,12 @@ class BaseSudoTestCase(base.BaseTestCase): def setUp(self): super(BaseSudoTestCase, self).setUp() - self.root_helper = os.environ.get('OS_ROOTWRAP_CMD', SUDO_CMD) + env = os.environ + self.sudo_enabled = env.get('OS_SUDO_TESTING') in base.TRUE_STRING + self.root_helper = env.get('OS_ROOTWRAP_CMD', SUDO_CMD) + self.fail_on_missing_deps = ( + env.get('OS_FAIL_ON_MISSING_DEPS') in base.TRUE_STRING) def check_sudo_enabled(self): - if os.environ.get('OS_SUDO_TESTING') not in base.TRUE_STRING: + if not self.sudo_enabled: self.skipTest('testing with sudo is not enabled') diff --git a/tox.ini b/tox.ini index d459887c3..5891515f4 100644 --- a/tox.ini +++ b/tox.ini @@ -18,6 +18,14 @@ setenv = OS_TEST_PATH=./neutron/tests/functional commands = python setup.py testr --slowest --testr-args='{posargs}' +[testenv:dsvm-functional] +setenv = OS_TEST_PATH=./neutron/tests/functional + OS_SUDO_TESTING=1 + OS_ROOTWRAP_CMD=sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf + OS_FAIL_ON_MISSING_DEPS=1 +commands = + python setup.py testr --slowest --testr-args='{posargs}' + [tox:jenkins] sitepackages = True downloadcache = ~/cache/pip