summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2009-11-30 07:00:18 -0500
committerNed Batchelder <ned@nedbatchelder.com>2009-11-30 07:00:18 -0500
commite25db2ddcb8584a3422f7f33a6e1dc27b7824e27 (patch)
tree9e4c78d3bc9b7e8841df19c474b51e324f99cd09 /test
parent61eb3e5f2d1bc9c6997073dca8db888b3d6eb410 (diff)
parent7abb46ad6a6e511bc10646dd3f30cb93eb44c8d8 (diff)
downloadpython-coveragepy-git-e25db2ddcb8584a3422f7f33a6e1dc27b7824e27.tar.gz
Merge stuff I almost lost!
Diffstat (limited to 'test')
-rw-r--r--test/coverage_coverage.py107
-rw-r--r--test/coveragetest.py13
-rw-r--r--test/test_api.py3
3 files changed, 80 insertions, 43 deletions
diff --git a/test/coverage_coverage.py b/test/coverage_coverage.py
index e1e7674f..a1cb13fc 100644
--- a/test/coverage_coverage.py
+++ b/test/coverage_coverage.py
@@ -1,45 +1,78 @@
-"""Coverage-test Coverage itself."""
+"""Coverage-test Coverage.py itself."""
-import coverage
import os, shutil, sys
+import nose
HTML_DIR = "htmlcov"
-if os.path.exists(HTML_DIR):
- shutil.rmtree(HTML_DIR)
-
-cov = coverage.coverage(branch=True)
-# Cheap trick: the coverage code itself is excluded from measurement, but if
-# we clobber the cover_prefix in the coverage object, we can defeat the
-# self-detection.
-cov.cover_prefix = "Please measure coverage.py!"
-cov.erase()
-cov.start()
-
-# Re-import coverage to get it coverage tested! I don't understand all the
-# mechanics here, but if I don't carry over the imported modules (in covmods),
-# then things go haywire (os == None eventually).
-covmods = {}
-covdir = os.path.split(coverage.__file__)
-for name, mod in sys.modules.items():
- if name.startswith('coverage'):
- if hasattr(mod, '__file__') and mod.__file__.startswith(covdir):
- covmods[name] = mod
- del sys.modules[name]
-import coverage # don't warn about re-import: pylint: disable-msg=W0404
-sys.modules.update(covmods)
-
-# Run nosetests, with the arguments from our command line.
-import nose
-nose.run(sys.argv[1:])
+def run_tests_with_coverage():
+ import coverage
+
+ tracer = os.environ.get('COVERAGE_TEST_TRACER', 'c')
+ version = "%s%s" % sys.version_info[:2]
+ suffix = ".%s_%s" % (version, tracer)
+
+ cov = coverage.coverage(branch=True, data_suffix=suffix)
+ # Cheap trick: the coverage code itself is excluded from measurement, but
+ # if we clobber the cover_prefix in the coverage object, we can defeat the
+ # self-detection.
+ cov.cover_prefix = "Please measure coverage.py!"
+ cov.erase()
+ cov.start()
+
+ # Re-import coverage to get it coverage tested! I don't understand all the
+ # mechanics here, but if I don't carry over the imported modules (in
+ # covmods), then things go haywire (os == None, eventually).
+ covmods = {}
+ covdir = os.path.split(coverage.__file__)[0]
+ # We have to make a list since we'll be deleting in the loop.
+ modules = list(sys.modules.items())
+ for name, mod in modules:
+ if name.startswith('coverage'):
+ if hasattr(mod, '__file__') and mod.__file__.startswith(covdir):
+ covmods[name] = mod
+ del sys.modules[name]
+ import coverage # don't warn about re-import: pylint: disable-msg=W0404
+ sys.modules.update(covmods)
+
+ # Run nosetests, with the arguments from our command line.
+ print(":: Running nosetests %s" % " ".join(sys.argv[1:]))
+ nose.run()
+
+ cov.stop()
+ print(":: Saving .coverage%s" % suffix)
+ cov.save()
+
+def report_on_combined_files():
+
+ if os.path.exists(HTML_DIR):
+ shutil.rmtree(HTML_DIR)
-cov.stop()
-cov.save()
+ print(":: Writing HTML report to %s/index.html" % HTML_DIR)
+ import coverage
+ cov = coverage.coverage()
+ cov.combine()
+ cov.save()
+ cov.clear_exclude()
+ cov.exclude("#pragma: no cover")
+ cov.exclude("def __repr__")
+ cov.exclude("if __name__ == .__main__.:")
+ cov.exclude("raise AssertionError")
+
+ cov.html_report(directory=HTML_DIR, ignore_errors=True, omit_prefixes=["mock"])
-cov.clear_exclude()
-cov.exclude("#pragma: no cover")
-cov.exclude("def __repr__")
-cov.exclude("if __name__ == .__main__.:")
-cov.exclude("raise AssertionError")
-cov.html_report(directory=HTML_DIR, ignore_errors=True)
+try:
+ cmd = sys.argv[1]
+except IndexError:
+ cmd = ''
+
+if cmd == 'run':
+ # Ugly hack: nose.run reads sys.argv directly, so here I delete my command
+ # argument so that sys.argv is left as just nose arguments.
+ del sys.argv[1]
+ run_tests_with_coverage()
+elif cmd == 'report':
+ report_on_combined_files()
+else:
+ print("Need 'run' or 'report'")
diff --git a/test/coveragetest.py b/test/coveragetest.py
index 1fb04721..073dc39f 100644
--- a/test/coveragetest.py
+++ b/test/coveragetest.py
@@ -168,12 +168,13 @@ class CoverageTest(TestCase):
cov.exclude(exc)
cov.start()
- # Import the python file, executing it.
- mod = self.import_module(modname)
-
- # Stop Coverage.
- cov.stop()
-
+ try:
+ # Import the python file, executing it.
+ mod = self.import_module(modname)
+ finally:
+ # Stop Coverage.
+ cov.stop()
+
# Clean up our side effects
del sys.modules[modname]
diff --git a/test/test_api.py b/test/test_api.py
index 932606fd..7308cdc6 100644
--- a/test/test_api.py
+++ b/test/test_api.py
@@ -8,6 +8,9 @@ from coverage.backward import StringIO
sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k
from coveragetest import CoverageTest
+# This file uses the singleton module interface. Prevent it from writing
+# .coverage files at exit.
+coverage.use_cache(0)
class ApiTest(CoverageTest):
"""Api-oriented tests for Coverage."""