Added test coverage data to the release pages if available for the release. Added saving of html pages for the code coverage to a directory in the static files area. If a code coverage report is available, a link to it will be shown on the release page of the current release. Renamed some setting variables related to test coverage to be more explicit and precise.

- Legacy-Id: 9201
This commit is contained in:
Henrik Levkowetz 2015-03-14 19:08:37 +00:00
parent 085e7d2bc3
commit 0b971f635d
7 changed files with 69 additions and 17 deletions

View file

@ -1,8 +1,7 @@
from django.conf.urls import patterns
urlpatterns = patterns('',
(r'^$', 'ietf.release.views.release'),
(r'^(?P<version>.+)/$', 'ietf.release.views.release'),
(r'^coverage/code/$', 'ietf.release.views.code_coverage')
(r'^$', 'ietf.release.views.release'),
(r'^(?P<version>[0-9.]+.*)/$', 'ietf.release.views.release'),
)

View file

@ -1,5 +1,7 @@
import os
import re
import json
import datetime
from django.template import RequestContext
from django.shortcuts import render_to_response
@ -30,7 +32,34 @@ def release(request, version=None):
next = entry
entries = dict((entry.version, entry) for entry in log_entries)
if version == None or version not in entries:
version = log_entries[0].version
entries[version].logentry = trac_links(entries[version].logentry)
return render_to_response('release/release.html', { 'releases': log_entries, 'version': version, 'entry': entries[version], }, context_instance=RequestContext(request))
version = log_entries[0].version
entries[version].logentry = trac_links(entries[version].logentry.strip('\n'))
code_coverage_url = None
code_coverage_time = None
if os.path.exists(settings.TEST_CODE_COVERAGE_REPORT_FILE) and version == log_entries[0].version:
code_coverage_url = settings.TEST_CODE_COVERAGE_REPORT_URL
code_coverage_time = datetime.datetime.fromtimestamp(os.path.getmtime(settings.TEST_CODE_COVERAGE_REPORT_FILE))
coverage = {}
if os.path.exists(settings.TEST_COVERAGE_MASTER_FILE):
with open(settings.TEST_COVERAGE_MASTER_FILE) as file:
coverage_data = json.load(file)
if version in coverage_data:
coverage = coverage_data[version]
for key in coverage:
if "coverage" in coverage[key]:
coverage[key]["percentage"] = coverage[key]["coverage"] * 100
return render_to_response('release/release.html',
{
'releases': log_entries,
'version': version,
'entry': entries[version],
'coverage': coverage,
'code_coverage_url': code_coverage_url,
'code_coverage_time': code_coverage_time,
},
context_instance=RequestContext(request))

View file

@ -289,18 +289,22 @@ TEST_CODE_COVERAGE_EXCLUDE = [
TEST_COVERAGE_MASTER_FILE = "release-coverage.json"
TEST_COVERAGE_LATEST_FILE = "latest-coverage.json"
if SERVER_MODE != 'production':
import coverage
COVERAGE_CHECKER = coverage.coverage(source=[ BASE_DIR ], cover_pylib=False, omit=TEST_CODE_COVERAGE_EXCLUDE)
if len(COVERAGE_CHECKER.collector._collectors) == 0:
COVERAGE_CHECKER.start()
TEST_CODE_COVERAGE_CHECKER = coverage.coverage(source=[ BASE_DIR ], cover_pylib=False, omit=TEST_CODE_COVERAGE_EXCLUDE)
if len(TEST_CODE_COVERAGE_CHECKER.collector._collectors) == 0:
TEST_CODE_COVERAGE_CHECKER.start()
TEST_CODE_COVERAGE_REPORT_PATH = "static/coverage/"
TEST_CODE_COVERAGE_REPORT_URL = os.path.join(STATIC_URL, TEST_CODE_COVERAGE_REPORT_PATH, "index.html")
TEST_CODE_COVERAGE_REPORT_DIR = os.path.join(STATIC_ROOT, TEST_CODE_COVERAGE_REPORT_PATH)
TEST_CODE_COVERAGE_REPORT_FILE = os.path.join(TEST_CODE_COVERAGE_REPORT_DIR, "index.html")
# WG Chair configuration
MAX_WG_DELEGATES = 3
DATE_FORMAT = "Y-m-d"
DATETIME_FORMAT = "Y-m-d H:i"
DATETIME_FORMAT = "Y-m-d H:i T"
# Override this in settings_local.py if needed
# *_PATH variables ends with a slash/ .

View file

@ -10,16 +10,30 @@
|
{% if entry.next %}<a href="/release/{{entry.next.version}}/">next release</a>&nbsp;&rarr;{% else %}<span style="color: grey">next release &rarr;</span>{% endif %}
</p>
<p>
<b>Release Notes:</b>
{% if coverage %}
Tested:
<b>Code</b>: {{coverage.code.percentage|stringformat:".2f"}}%, &nbsp;
<b>Templates</b>: {{coverage.template.percentage|stringformat:".2f"}}%, &nbsp;
<b>URLs</b>: {{coverage.url.percentage|stringformat:".2f"}}% &nbsp;
{% endif %}
{% if code_coverage_url %}
<br/>
(A <a href="{{code_coverage_url}}">code test coverage report</a> dated {{code_coverage_time}} is available.)
{% endif %}
</p>
<p>
<h2>Release Notes:</h2>
<tt>
<pre>
{{entry.logentry|safe}}
</pre>
</tt>
</p>
<h2>Release list:</h2>
<table style="margin-left: 3em">

View file

@ -74,7 +74,7 @@ for n,a in api._api_list:
if settings.SERVER_MODE in ('development', 'test'):
urlpatterns += patterns('',
(r'^(?P<path>(?:images|css|js|test)/.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
(r'^(?P<path>(?:images|css|js|test|static)/.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
(r'^(?P<path>admin/(?:img|css|js)/.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
(r'^(?P<path>secretariat/(img|css|js)/.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
(r'^(?P<path>robots\.txt)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT+"dev/"}),

View file

@ -283,10 +283,15 @@ class CoverageTest(TestCase):
include = [ os.path.join(path, '*') for path in self.runner.test_paths ]
checker = self.runner.code_coverage_checker
checker.stop()
# Save to the .coverage file
checker.save()
checker._harvest_data()
# Apply the confirured and requested omit and include data
checker.config.from_args(ignore_errors=None, omit=settings.TEST_CODE_COVERAGE_EXCLUDE,
include=include, file=None)
# Maybe output a html report
if self.runner.run_full_test_suite:
checker.html_report(directory=settings.TEST_CODE_COVERAGE_REPORT_DIR)
# In any case, build a dictionary with per-file data for this run
reporter = CoverageReporter(checker, checker.config)
self.runner.coverage_data["code"] = reporter.report()
self.report_test_result("code")
@ -340,7 +345,7 @@ class IetfTestRunner(DiscoverRunner):
settings.TEMPLATE_LOADERS = ('ietf.utils.test_runner.template_coverage_loader',) + settings.TEMPLATE_LOADERS
settings.MIDDLEWARE_CLASSES = ('ietf.utils.test_runner.RecordUrlsMiddleware',) + settings.MIDDLEWARE_CLASSES
self.code_coverage_checker = settings.COVERAGE_CHECKER
self.code_coverage_checker = settings.TEST_CODE_COVERAGE_CHECKER
if settings.SITE_ID != 1:
print " Changing SITE_ID to '1' during testing."

1
static/static/coverage/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/*