summaryrefslogtreecommitdiff
path: root/test.py
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2015-02-21 19:51:21 +0100
committerStefan Behnel <stefan_ml@behnel.de>2015-02-21 19:51:21 +0100
commitc384fac6d257ec2e0c9da0e35ff3c03f38a1114a (patch)
tree6dfa65e76af4a9bc8ea86ee7f9294eefa6bc922c /test.py
parent6cbb1fcfd8634a850275143d50b724711afbb8b7 (diff)
downloadpython-lxml-c384fac6d257ec2e0c9da0e35ff3c03f38a1114a.tar.gz
make test runner use coverage.py for coverage reporting
Diffstat (limited to 'test.py')
-rw-r--r--test.py83
1 files changed, 46 insertions, 37 deletions
diff --git a/test.py b/test.py
index daf43c28..8aec405d 100644
--- a/test.py
+++ b/test.py
@@ -198,16 +198,17 @@ def get_test_files(cfg):
return results
-def import_module(filename, cfg, tracer=None):
+def import_module(filename, cfg, cov=None):
"""Imports and returns a module."""
filename = os.path.splitext(filename)[0]
modname = filename[len(cfg.basedir):].replace(os.path.sep, '.')
if modname.startswith('.'):
modname = modname[1:]
- if tracer is not None:
- mod = tracer.runfunc(__import__, modname)
- else:
- mod = __import__(modname)
+ if cov is not None:
+ cov.start()
+ mod = __import__(modname)
+ if cov is not None:
+ cov.stop()
components = modname.split('.')
for comp in components[1:]:
mod = getattr(mod, comp)
@@ -259,16 +260,17 @@ def get_test_classes_from_testsuite(suite):
return results
-def get_test_cases(test_files, cfg, tracer=None):
+def get_test_cases(test_files, cfg, cov=None):
"""Returns a list of test cases from a given list of test modules."""
matcher = compile_matcher(cfg.test_regex)
results = []
for file in test_files:
- module = import_module(file, cfg, tracer=tracer)
- if tracer is not None:
- test_suite = tracer.runfunc(module.test_suite)
- else:
- test_suite = module.test_suite()
+ module = import_module(file, cfg, cov=cov)
+ if cov is not None:
+ cov.start()
+ test_suite = module.test_suite()
+ if cov is not None:
+ cov.stop()
if test_suite is None:
continue
if cfg.warn_omitted:
@@ -288,7 +290,7 @@ def get_test_cases(test_files, cfg, tracer=None):
return results
-def get_test_hooks(test_files, cfg, tracer=None):
+def get_test_hooks(test_files, cfg, cov=None):
"""Returns a list of test hooks from a given list of test modules."""
results = []
dirs = set(map(os.path.dirname, test_files))
@@ -301,10 +303,11 @@ def get_test_hooks(test_files, cfg, tracer=None):
filename = os.path.join(dir, 'checks.py')
if os.path.exists(filename):
module = import_module(filename, cfg, tracer=tracer)
- if tracer is not None:
- hooks = tracer.runfunc(module.test_hooks)
- else:
- hooks = module.test_hooks()
+ if cov is not None:
+ cov.start()
+ hooks = module.test_hooks()
+ if cov is not None:
+ cov.stop()
results.extend(hooks)
return results
@@ -544,28 +547,20 @@ def main(argv):
sys.path[0] = cfg.basedir
# Set up tracing before we start importing things
- tracer = None
+ cov = None
if cfg.run_tests and cfg.coverage:
- import trace
- # trace.py in Python 2.3.1 is buggy:
- # 1) Despite sys.prefix being in ignoredirs, a lot of system-wide
- # modules are included in the coverage reports
- # 2) Some module file names do not have the first two characters,
- # and in general the prefix used seems to be arbitrary
- # These bugs are fixed in src/trace.py which should be in PYTHONPATH
- # before the official one.
- ignoremods = ['test']
- ignoredirs = [sys.prefix, sys.exec_prefix]
- tracer = trace.Trace(count=True, trace=False,
- ignoremods=ignoremods, ignoredirs=ignoredirs)
+ from coverage import coverage
+ cov = coverage()
# Finding and importing
test_files = get_test_files(cfg)
+ if cov is not None:
+ cov.start()
if cfg.list_tests or cfg.run_tests:
- test_cases = get_test_cases(test_files, cfg, tracer=tracer)
+ test_cases = get_test_cases(test_files, cfg, cov=cov)
if cfg.list_hooks or cfg.run_tests:
- test_hooks = get_test_hooks(test_files, cfg, tracer=tracer)
+ test_hooks = get_test_hooks(test_files, cfg, cov=cov)
# Configure the logging module
import logging
@@ -585,12 +580,26 @@ def main(argv):
runner = CustomTestRunner(cfg, test_hooks)
suite = unittest.TestSuite()
suite.addTests(test_cases)
- if tracer is not None:
- success = tracer.runfunc(runner.run, suite).wasSuccessful()
- results = tracer.results()
- results.write_results(show_missing=True, coverdir=cfg.coverdir)
- else:
- success = runner.run(suite).wasSuccessful()
+ if cov is not None:
+ cov.start()
+ run_result = runner.run(suite)
+ if cov is not None:
+ cov.stop()
+ success = run_result.wasSuccessful()
+ del run_result
+
+ if cov is not None:
+ from glob import glob
+ modules = (
+ glob('src/lxml/*.py') +
+ glob('src/lxml/*.pyx') +
+ glob('src/lxml/*.pxi') +
+ glob('src/lxml/*.pxd')
+ )
+ cov.report()
+ if cfg.coverdir:
+ cov.xml_report(modules, outfile='coverage.xml')
+ cov.html_report(modules, directory=cfg.coverdir)
# That's all
if success: