summaryrefslogtreecommitdiff
path: root/coverage/test_plugins/pytest_coverage.py
diff options
context:
space:
mode:
authorrozza@x103086.gcapmedia.com <rozza@x103086.gcapmedia.com>2009-11-20 11:27:52 +0000
committerrozza@x103086.gcapmedia.com <rozza@x103086.gcapmedia.com>2009-11-20 11:27:52 +0000
commitcf2251822c220e4fc2a8f95f746dd269ac2659eb (patch)
treede478f3ee9b26ecac486d2d27f71cac8e91bedc3 /coverage/test_plugins/pytest_coverage.py
parentb09acaa84c8624d67c9c1e271a780fbd2122c2c6 (diff)
downloadpython-coveragepy-git-cf2251822c220e4fc2a8f95f746dd269ac2659eb.tar.gz
Adding a CoverageTestWrapper to be used by test runners / plugins.
Added example plugins for pytest and nose Warning: I haven't tested the nose plugin against a test suite Warning: I use a file listing files / paths to omit from code coverage and use regexes to filter them out To ignore that remove the monkey patch..
Diffstat (limited to 'coverage/test_plugins/pytest_coverage.py')
-rw-r--r--coverage/test_plugins/pytest_coverage.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/coverage/test_plugins/pytest_coverage.py b/coverage/test_plugins/pytest_coverage.py
new file mode 100644
index 00000000..5b910e94
--- /dev/null
+++ b/coverage/test_plugins/pytest_coverage.py
@@ -0,0 +1,69 @@
+"""
+Write and report coverage data with 'coverage.py'.
+"""
+import py
+
+coverage = py.test.importorskip("coverage")
+
+def pytest_configure(config):
+ # Load the runner and start it up
+ from coverage.runner import CoverageTestWrapper
+
+ config.coverage = CoverageTestWrapper(config.option)
+ config.coverage.start()
+
+def pytest_terminal_summary(terminalreporter):
+ # Finished the tests start processing the coverage
+ config = terminalreporter.config
+ tw = terminalreporter._tw
+ tw.sep('-', 'coverage')
+ tw.line('Processing Coverage...')
+
+ # finish up with coverage
+ config.coverage.finish()
+
+def pytest_addoption(parser):
+ """
+ Get all the options from the coverage.runner and import them
+ """
+ from coverage.runner import Options
+
+ group = parser.getgroup('Coverage options')
+ # Loop the coverage options and append them to the plugin options
+ options = [a for a in dir(Options) if not a.startswith('_')]
+ for option in options:
+ opt = getattr(Options, option)
+ group._addoption_instance(opt, shortupper=True)
+
+# Monkey patch omit_filter to use regex patterns for file omits
+def omit_filter(omit_prefixes, code_units):
+ import re
+ exclude_patterns = [re.compile(line.strip()) for line in omit_prefixes if line and not line.startswith('#')]
+ filtered = []
+ for cu in code_units:
+ skip = False
+ for pattern in exclude_patterns:
+ if pattern.search(cu.filename):
+ skip = True
+ break
+
+ if not skip:
+ filtered.append(cu)
+ return filtered
+
+coverage.codeunit.omit_filter = omit_filter
+
+def test_functional(testdir):
+ py.test.importorskip("coverage")
+ testdir.plugins.append("coverage")
+ testdir.makepyfile("""
+ def f():
+ x = 42
+ def test_whatever():
+ pass
+ """)
+ result = testdir.runpytest()
+ assert result.ret == 0
+ assert result.stdout.fnmatch_lines([
+ '*Processing Coverage*'
+ ]) \ No newline at end of file