Skip to content

Commit c17ea94

Browse files
committed
Updated the code to use version 4.0.1 of coverage.py for code coverage measurements. Moved the code which starts coverage measurement to settings_sqlitetest.py to avoid coverage measurements running when not doing tests. Did some additional coveage measurement refactoring.
- Legacy-Id: 10238
1 parent 58a4bc7 commit c17ea94

7 files changed

Lines changed: 35 additions & 20 deletions

File tree

ietf/settings.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,9 +352,7 @@ def skip_unreadable_post(record):
352352
TEST_CODE_COVERAGE_CHECKER = None
353353
if SERVER_MODE != 'production':
354354
import coverage
355-
TEST_CODE_COVERAGE_CHECKER = coverage.coverage(source=[ BASE_DIR ], cover_pylib=False, omit=TEST_CODE_COVERAGE_EXCLUDE)
356-
if len(TEST_CODE_COVERAGE_CHECKER.collector._collectors) == 0:
357-
TEST_CODE_COVERAGE_CHECKER.start()
355+
TEST_CODE_COVERAGE_CHECKER = coverage.Coverage(source=[ BASE_DIR ], cover_pylib=False, omit=TEST_CODE_COVERAGE_EXCLUDE)
358356

359357
TEST_CODE_COVERAGE_REPORT_PATH = "coverage/"
360358
TEST_CODE_COVERAGE_REPORT_URL = os.path.join(STATIC_URL, TEST_CODE_COVERAGE_REPORT_PATH, "index.html")

ietf/settings_sqlitetest.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,6 @@ def __getitem__(self, item):
3636
},
3737
}
3838

39+
if TEST_CODE_COVERAGE_CHECKER and not TEST_CODE_COVERAGE_CHECKER._started:
40+
TEST_CODE_COVERAGE_CHECKER.start()
41+

ietf/utils/management/commands/coverage_changes.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,19 @@ def coverage_diff(self, master, latest, sections=','.join(valid_sections), relea
6767
header_written = False
6868

6969
for key in keys:
70-
if not key in mcoverage:
70+
mkey = key
71+
if not mkey in mcoverage:
72+
if mkey.endswith(".py"):
73+
mkey = mkey[:-3]
74+
else:
75+
mkey = mkey + ".py"
76+
if not mkey in mcoverage:
7177
mlines, mcov = None, None
7278
else:
7379
if mformat == 1:
74-
mlines, mcov = None, mcoverage[key]
80+
mlines, mcov = None, mcoverage[mkey]
7581
elif mformat == 2:
76-
mlines, mcov = mcoverage[key]
82+
mlines, mcov = mcoverage[mkey]
7783
else:
7884
raise CommandError("The release coverage data has an unknown format ('%s'), quitting." % mformat)
7985
if lformat == 1:

ietf/utils/test_runner.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -177,23 +177,23 @@ def save_test_results(failures, test_labels):
177177

178178
class CoverageReporter(Reporter):
179179
def report(self):
180-
self.find_code_units(None)
180+
self.find_file_reporters(None)
181181

182182
total = Numbers()
183183
result = {"coverage": 0.0, "covered": {}, "format": 2, }
184-
for cu in self.code_units:
184+
for fr in self.file_reporters:
185185
try:
186-
analysis = self.coverage._analyze(cu)
186+
analysis = self.coverage._analyze(fr)
187187
nums = analysis.numbers
188-
result["covered"][cu.name] = (nums.n_statements, nums.pc_covered/100.0)
188+
result["covered"][fr.relative_filename()] = (nums.n_statements, nums.pc_covered/100.0)
189189
total += nums
190190
except KeyboardInterrupt: # pragma: not covered
191191
raise
192192
except Exception:
193193
report_it = not self.config.ignore_errors
194194
if report_it:
195195
typ, msg = sys.exc_info()[:2]
196-
if typ is NotPython and not cu.should_be_python():
196+
if typ is NotPython and not fr.should_be_python():
197197
report_it = False
198198
if report_it:
199199
raise
@@ -355,6 +355,11 @@ def setup_test_environment(self, **kwargs):
355355
settings.MIDDLEWARE_CLASSES = ('ietf.utils.test_runner.RecordUrlsMiddleware',) + settings.MIDDLEWARE_CLASSES
356356

357357
self.code_coverage_checker = settings.TEST_CODE_COVERAGE_CHECKER
358+
if not self.code_coverage_checker._started:
359+
sys.stderr.write(" ** Warning: In %s: Expected the coverage checker to have\n"
360+
" been started already, but it wasn't. Doing so now. Coverage numbers\n"
361+
" will be off, though.\n" % __name__)
362+
self.code_coverage_checker.start()
358363

359364
if settings.SITE_ID != 1:
360365
print " Changing SITE_ID to '1' during testing."
@@ -397,7 +402,7 @@ def teardown_test_environment(self, **kwargs):
397402
self.coverage_master[self.save_version_coverage] = self.coverage_data
398403
if self.coverage_file.endswith('.gz'):
399404
with gzip.open(self.coverage_file, "wb") as file:
400-
json.dump(self.coverage_master, file, indent=2, sort_keys=True)
405+
json.dump(self.coverage_master, file, sort_keys=True)
401406
else:
402407
with codecs.open(self.coverage_file, "w", encoding="utf-8") as file:
403408
json.dump(self.coverage_master, file, indent=2, sort_keys=True)
@@ -436,7 +441,7 @@ def get_test_paths(self, test_labels):
436441
test_paths = [ os.path.join(*app.split('.')) for app in test_apps ]
437442
return test_apps, test_paths
438443

439-
def run_tests(self, test_labels, extra_tests=None, **kwargs):
444+
def run_tests(self, test_labels, extra_tests=[], **kwargs):
440445
# Tests that involve switching back and forth between the real
441446
# database and the test database are way too dangerous to run
442447
# against the production database
@@ -457,13 +462,14 @@ def run_tests(self, test_labels, extra_tests=None, **kwargs):
457462

458463
self.test_apps, self.test_paths = self.get_test_paths(test_labels)
459464

460-
extra_tests = [
461-
CoverageTest(test_runner=self, methodName='url_coverage_test'),
462-
CoverageTest(test_runner=self, methodName='template_coverage_test'),
463-
CoverageTest(test_runner=self, methodName='code_coverage_test'),
464-
]
465+
if self.check_coverage:
466+
extra_tests += [
467+
CoverageTest(test_runner=self, methodName='url_coverage_test'),
468+
CoverageTest(test_runner=self, methodName='template_coverage_test'),
469+
CoverageTest(test_runner=self, methodName='code_coverage_test'),
470+
]
465471

466-
self.reorder_by += (CoverageTest, ) # see to it that the coverage tests come last
472+
self.reorder_by += (CoverageTest, ) # see to it that the coverage tests come last
467473

468474
failures = super(IetfTestRunner, self).run_tests(test_labels, extra_tests=extra_tests, **kwargs)
469475

ietf/utils/test_utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,3 +284,5 @@ def assertValidHTMLResponse(self, resp):
284284
self.assertHttpOK(resp)
285285
self.assertTrue(resp['Content-Type'].startswith('text/html'))
286286
self.assertValidHTML(resp.content)
287+
288+

release-coverage.json.gz

-5.97 KB
Binary file not shown.

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# -*- conf-mode -*-
22
setuptools>=1.2 # Require this first, to prevent later errors
33
#
4-
coverage>=3.7.1,<4.0
4+
coverage>=4.0.1
55
#cssselect>=0.6.1 # for PyQuery
66
decorator>=3.4.0
77
defusedxml>=0.4.1 # for TastyPie when ussing xml; not a declared dependency

0 commit comments

Comments
 (0)