Run unit tests in isolation w/ coverage support.

This commit is contained in:
Matt Clay 2017-02-23 16:58:57 -08:00
parent d0e1a1c6c3
commit fcac261eef
5 changed files with 36 additions and 1 deletions

View file

@ -9,6 +9,7 @@ branch = True
# results from multiple tests simultaneously, as well as supporting multiple # results from multiple tests simultaneously, as well as supporting multiple
# test runs, such as from integration tests. # test runs, such as from integration tests.
concurrency = multiprocessing concurrency = multiprocessing
parallel = True
# When running tests through ansible-test, this option is overridden by # When running tests through ansible-test, this option is overridden by
# the COVERAGE_FILE environment variable. This option is present for # the COVERAGE_FILE environment variable. This option is present for

View file

@ -144,7 +144,6 @@ def coverage_command(self_dir, version):
args = [ args = [
find_executable(executable), find_executable(executable),
'run', 'run',
'--append',
'--rcfile', '--rcfile',
os.path.join(self_dir, '.coveragerc'), os.path.join(self_dir, '.coveragerc'),
] ]

View file

@ -624,6 +624,7 @@ def command_units(args):
cmd = [ cmd = [
'pytest', 'pytest',
'--boxed',
'-r', 'a', '-r', 'a',
'--color', '--color',
'yes' if args.color else 'no', 'yes' if args.color else 'no',

View file

@ -6,6 +6,7 @@ passlib
pycrypto pycrypto
pytest pytest
pytest-mock pytest-mock
pytest-xdist
python-memcached python-memcached
pyyaml pyyaml
redis redis

33
test/units/conftest.py Normal file
View file

@ -0,0 +1,33 @@
"""Monkey patch os._exit when running under coverage so we don't lose coverage data in forks, such as with `pytest --boxed`."""
import gc
import os
try:
import coverage
except ImportError:
coverage = None
def pytest_configure():
if not coverage:
return
coverage_instances = []
for obj in gc.get_objects():
if isinstance(obj, coverage.Coverage):
coverage_instances.append(obj)
if not coverage_instances:
return
os_exit = os._exit
def coverage_exit(*args, **kwargs):
for instance in coverage_instances:
instance.stop()
instance.save()
os_exit(*args, **kwargs)
os._exit = coverage_exit