> Is there anyone one against adding a --with coverage option to
> `runtests.py`?

Please see the proof of concept patch in attachment.

-- 
Yannick Gingras
http://ygingras.net
http://montrealpython.org -- lead organizer
# HG changeset patch
# Parent fa62924e8f37e9dfca5bcdede499e4389744059f
added options to measure coverage to runtest.py

diff -r fa62924e8f37 -r 611f190bee04 src/runtests.py
--- a/src/runtests.py	Sat May 22 21:34:06 2010 -0400
+++ b/src/runtests.py	Sat May 22 23:56:23 2010 -0400
@@ -2,22 +2,70 @@
 
 The tests for distutils2 are defined in the distutils2.tests package;
 """
+import os
 import sys
 
+from contextlib import contextmanager
+from optparse import OptionParser
+
+
+def parse_opts():
+    parser = OptionParser(usage="%prog [OPTIONS]", 
+                          description="run the distutils2 unittests")
+    
+    parser.add_option("-q", "--quiet", help="do not print verbose messages", 
+                      action="store_true", default=False)
+    parser.add_option("-c", "--coverage", action="store_true", default=False,
+                      help="produce a coverage report at the end of the run")
+    parser.add_option("-r", "--report", action="store_true", default=False,
+                      help="produce a coverage report from the last test run")
+    parser.add_option("-m", "--show-missing", action="store_true", 
+                      default=False,
+                      help=("Show line numbers of statements in each module "
+                            "that weren't executed."))
+    
+    opts, args = parser.parse_args()
+    return opts, args
+
+...@contextmanager
+def coverage_measurement(enabled):
+    if enabled:
+        import coverage
+        cov = coverage.coverage()
+        cov.erase()
+        cov.start()
+    yield
+    if enabled:
+        cov.stop()
+        cov.save()
+
+def coverage_report(opts):
+    import coverage
+    import unittest2
+    cov = coverage.coverage()
+    cov.load()
+    cov.report(omit_prefixes=["distutils2/tests", 
+                              "runtests", 
+                              "distutils2/_backport", 
+                              os.path.dirname(unittest2.__file__)], 
+               show_missing=opts.show_missing)
+
 def test_main():
     import distutils2.tests
     from distutils2.tests import run_unittest, reap_children
     from distutils2._backport.tests import test_suite as btest_suite
-    # just supporting -q right now
-    # to enable detailed/quiet output
-    if len(sys.argv) > 1:
-        verbose = sys.argv[-1] != '-q'
-    else:
-        verbose = 1
 
-    run_unittest([distutils2.tests.test_suite(), btest_suite()],
-                 verbose_=verbose)
-    reap_children()
+    opts, args = parse_opts()
+    verbose = not opts.quiet
+
+    if not opts.report:
+        with coverage_measurement(opts.coverage):
+            run_unittest([distutils2.tests.test_suite(), btest_suite()],
+                         verbose_=verbose)
+            reap_children()
+
+    if opts.report or opts.coverage:
+        coverage_report(opts)
 
 if __name__ == "__main__":
     try:

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
Distutils-SIG maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/distutils-sig

Reply via email to