summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Kubasik <kevin@kubasik.net>2009-06-09 11:21:57 +0000
committerKevin Kubasik <kevin@kubasik.net>2009-06-09 11:21:57 +0000
commit125135430ec2a55908e10a645cf4223d512b6afc (patch)
tree1ba8b94125e606ac5d9e16fa84dd915c64218148
parentf0920956122460aed64b9eb024d11385f7b20f6f (diff)
Making new reports more accurate
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/test-improvements@10960 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/test/test_coverage.py54
1 files changed, 50 insertions, 4 deletions
diff --git a/django/test/test_coverage.py b/django/test/test_coverage.py
index f173bff480..71e8821091 100644
--- a/django/test/test_coverage.py
+++ b/django/test/test_coverage.py
@@ -1,11 +1,11 @@
-import coverage
+import coverage, time
import os, sys
from django.conf import settings
from django.db.models import get_app, get_apps
from django.test.simple import DefaultTestRunner as base_run_tests
-from django.utils.module_tools import get_all_modules
+from django.utils.module_tools import get_all_modules, find_or_load_module
from django.utils.translation import ugettext as _
def _get_app_package(app_model_module):
@@ -30,6 +30,7 @@ class BaseCoverageRunner(object):
Runs the specified tests while generating code coverage statistics. Upon
the tests' completion, the results are printed to stdout.
"""
+ coverage.erase()
#Allow an on-disk cache of coverage stats.
#coverage.use_cache(0)
for e in getattr(settings, 'COVERAGE_CODE_EXCLUDES', []):
@@ -55,7 +56,8 @@ class BaseCoverageRunner(object):
packages, self.modules, self.excludes, self.errors = get_all_modules(
coverage_modules, getattr(settings, 'COVERAGE_MODULE_EXCLUDES', []),
getattr(settings, 'COVERAGE_PATH_EXCLUDES', []))
-
+ for mods in self.modules.keys():
+ coverage.analysis2(ModuleVars(mods, self.modules[mods]))
coverage.report(self.modules.values(), show_missing=1)
if self.excludes:
print >> sys.stdout
@@ -69,6 +71,7 @@ class BaseCoverageRunner(object):
for e in self.errors:
print >> sys.stderr, e,
print >> sys.stdout
+ coverage._the_coverage.save()
return results
@@ -98,8 +101,51 @@ class ReportingCoverageRunner(BaseCoverageRunner):
with the results
"""
res = BaseCoverageRunner.run_tests(self, *args, **kwargs)
- coverage._the_coverage.html_report(self.modules.values(), self.outdir)
+ coverage._the_coverage.load()
+ cov = coverage.html.HtmlReporter(coverage._the_coverage)
+ cov.report(self.modules.values(), self.outdir)
+ #coverage._the_coverage.html_report(self.modules.values(), self.outdir)
print >>sys.stdout
print >>sys.stdout, _("HTML reports were output to '%s'") %self.outdir
return res
+
+
+try:
+ set
+except:
+ from sets import Set as set
+
+
+class ModuleVars(object):
+ modules = dict()
+ def __new__(cls, module_name, module=None):
+ if cls.modules.get(module_name, None):
+ return cls.modules.get(module_name)
+ else:
+ obj=super(ModuleVars, cls).__new__(cls)
+ obj._init(module_name, module)
+ cls.modules[module_name] = obj
+ return obj
+
+ def _init(self, module_name, module):
+ source_file, stmts, excluded, missed, missed_display = coverage.analysis2(module)
+ executed = list(set(stmts).difference(missed))
+ total = list(set(stmts).union(excluded))
+ total.sort()
+ title = module.__name__
+ total_count = len(total)
+ executed_count = len(executed)
+ excluded_count = len(excluded)
+ missed_count = len(missed)
+ try:
+ percent_covered = float(len(executed))/len(stmts)*100
+ except ZeroDivisionError:
+ percent_covered = 100
+ test_timestamp = time.strftime('%a %Y-%m-%d %H:%M %Z')
+ severity = 'normal'
+ if percent_covered < 75: severity = 'warning'
+ if percent_covered < 50: severity = 'critical'
+
+ for k, v in locals().iteritems():
+ setattr(self, k, v)