[IMP] test discovery, documentation, deprecation warnings

* document and warn that checks and fast_suite in tests sub-packages are
  deprecated and have no effect
* avoid iterating all currently loaded modules when looking for test
  modules in a tests sub-package
* replace use of __import__ by importlib

Fixes #3152
This commit is contained in:
Xavier Morel 2015-01-15 13:28:25 +01:00
parent da4db6a8ae
commit 9808ca3e31
2 changed files with 26 additions and 13 deletions

View File

@ -24,8 +24,16 @@ and ``__init__.py`` contains::
from . import test_foo, test_bar from . import test_foo, test_bar
.. note:: test modules which are not imported from ``tests/__init__.py`` will .. warning::
not be run
test modules which are not imported from ``tests/__init__.py`` will not be
run
.. versionchanged:: 8.0
previously, the test runner would only run modules added to two lists
``fast_suite`` and ``checks`` in ``tests/__init__.py``. In 8.0 it will
run all imported modules
The test runner will simply run any test case, as described in the official The test runner will simply run any test case, as described in the official
`unittest documentation`_, but Odoo provides a number of utilities and helpers `unittest documentation`_, but Odoo provides a number of utilities and helpers
@ -46,8 +54,8 @@ been installed, and not run right after the module installation:
.. autofunction:: openerp.tests.common.post_install .. autofunction:: openerp.tests.common.post_install
The most common situation is to use The most common situation is to use
:class:`~openerp.tests.common.TransactionCase` and test a property of a of a :class:`~openerp.tests.common.TransactionCase` and test a property of a model
model in each method:: in each method::
class TestModelA(common.TransactionCase): class TestModelA(common.TransactionCase):
def test_some_action(self): def test_some_action(self):
@ -67,7 +75,7 @@ Tests are automatically run when installing or updating modules if
Odoo server. Odoo server.
As of Odoo 8, running tests outside of the install/update cycle is not As of Odoo 8, running tests outside of the install/update cycle is not
supported.
.. _unittest2: http://pypi.python.org/pypi/unittest2 .. _unittest2: http://pypi.python.org/pypi/unittest2
.. _unittest documentation: https://docs.python.org/2/library/unittest.html .. _unittest documentation: https://docs.python.org/2/library/unittest.html

View File

@ -22,6 +22,8 @@
import functools import functools
import imp import imp
import importlib
import inspect
import itertools import itertools
import logging import logging
import os import os
@ -366,23 +368,26 @@ def adapt_version(version):
return version return version
def get_test_modules(module): def get_test_modules(module):
""" Return a list of module for the addons potentialy containing tests to """ Return a list of module for the addons potentially containing tests to
feed unittest2.TestLoader.loadTestsFromModule() """ feed unittest2.TestLoader.loadTestsFromModule() """
# Try to import the module # Try to import the module
module = 'openerp.addons.' + module + '.tests' modpath = 'openerp.addons.' + module
try: try:
__import__(module) mod = importlib.import_module('.tests', modpath)
except Exception, e: except Exception, e:
# If module has no `tests` sub-module, no problem. # If module has no `tests` sub-module, no problem.
if str(e) != 'No module named tests': if str(e) != 'No module named tests':
_logger.exception('Can not `import %s`.', module) _logger.exception('Can not `import %s`.', module)
return [] return []
# include submodules too if hasattr(mod, 'fast_suite') or hasattr(mod, 'checks'):
result = [mod_obj for name, mod_obj in sys.modules.iteritems() _logger.warn(
if mod_obj # mod_obj can be None "Found deprecated fast_suite or checks attribute in test module "
if name.startswith(module) "%s. These have no effect in or after version 8.0.",
if re.search(r'test_\w+$', name)] mod.__name__)
result = [mod_obj for name, mod_obj in inspect.getmembers(mod, inspect.ismodule)
if name.startswith('test_')]
return result return result
# Use a custom stream object to log the test executions. # Use a custom stream object to log the test executions.