diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2015-02-21 19:51:21 +0100 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2015-02-21 19:51:21 +0100 |
commit | c384fac6d257ec2e0c9da0e35ff3c03f38a1114a (patch) | |
tree | 6dfa65e76af4a9bc8ea86ee7f9294eefa6bc922c /test.py | |
parent | 6cbb1fcfd8634a850275143d50b724711afbb8b7 (diff) | |
download | python-lxml-c384fac6d257ec2e0c9da0e35ff3c03f38a1114a.tar.gz |
make test runner use coverage.py for coverage reporting
Diffstat (limited to 'test.py')
-rw-r--r-- | test.py | 83 |
1 files changed, 46 insertions, 37 deletions
@@ -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: |