summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coverage/collector.py5
-rw-r--r--coverage/control.py10
-rw-r--r--test/coverage_coverage.py6
-rw-r--r--test/coveragetest.py13
-rw-r--r--test/test_api.py3
5 files changed, 26 insertions, 11 deletions
diff --git a/coverage/collector.py b/coverage/collector.py
index 5bbd02e0..6ea419ee 100644
--- a/coverage/collector.py
+++ b/coverage/collector.py
@@ -148,6 +148,9 @@ class Collector(object):
# trace function.
self._trace_class = Tracer or PyTracer
+ def __repr__(self):
+ return "<Collector at 0x%x>" % id(self)
+
def tracer_name(self):
"""Return the class name of the tracer we're using."""
return self._trace_class.__name__
@@ -196,6 +199,7 @@ class Collector(object):
if self._collectors:
self._collectors[-1].pause()
self._collectors.append(self)
+ #print >>sys.stderr, "Started: %r" % self._collectors
# Install the tracer on this thread.
self._start_tracer()
# Install our installation tracer in threading, to jump start other
@@ -204,6 +208,7 @@ class Collector(object):
def stop(self):
"""Stop collecting trace information."""
+ #print >>sys.stderr, "Stopping: %r" % self._collectors
assert self._collectors
assert self._collectors[-1] is self
diff --git a/coverage/control.py b/coverage/control.py
index 674bb15e..7efc3492 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -1,6 +1,6 @@
"""Core control stuff for Coverage."""
-import os, socket
+import atexit, os, socket
from coverage.annotate import AnnotateReporter
from coverage.backward import string_class # pylint: disable-msg=W0622
@@ -56,7 +56,8 @@ class coverage(object):
self.cover_pylib = cover_pylib
self.auto_data = auto_data
-
+ self.atexit_registered = False
+
self.exclude_re = ""
self.exclude_list = []
@@ -168,8 +169,9 @@ class coverage(object):
if self.auto_data:
self.load()
# Save coverage data when Python exits.
- import atexit
- atexit.register(self.save)
+ if not self.atexit_registered:
+ atexit.register(self.save)
+ self.atexit_registered = True
self.collector.start()
def stop(self):
diff --git a/test/coverage_coverage.py b/test/coverage_coverage.py
index e1e7674f..64380ab7 100644
--- a/test/coverage_coverage.py
+++ b/test/coverage_coverage.py
@@ -30,12 +30,16 @@ 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.
+nose_args = sys.argv[1:]
+print(":: Running nosetests %s" % " ".join(nose_args))
import nose
-nose.run(sys.argv[1:])
+nose.run(nose_args)
cov.stop()
+print(":: Saving .coverage")
cov.save()
+print(":: Writing HTML report to %s/index.html" % HTML_DIR)
cov.clear_exclude()
cov.exclude("#pragma: no cover")
cov.exclude("def __repr__")
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."""