diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2021-01-31 11:31:43 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2021-01-31 11:41:57 -0500 |
commit | bf29fdcf295b32e88a7407c244a5c703f0499ca9 (patch) | |
tree | 88aae5e2e09dc2eec1103af6b2ddd3dc9f435139 | |
parent | f18dd6884665f915868d199917075682f7e2e151 (diff) | |
download | python-coveragepy-git-bf29fdcf295b32e88a7407c244a5c703f0499ca9.tar.gz |
test: keep multi-assert arc diffs working
We don't have a way to do multi-assert in the pytest we're running, so
cobble it together ourselves.
-rw-r--r-- | tests/coveragetest.py | 46 | ||||
-rw-r--r-- | tests/test_arcs.py | 4 |
2 files changed, 23 insertions, 27 deletions
diff --git a/tests/coveragetest.py b/tests/coveragetest.py index f7a5f6f8..c4a46da9 100644 --- a/tests/coveragetest.py +++ b/tests/coveragetest.py @@ -5,6 +5,7 @@ import contextlib import datetime +import difflib import functools import glob import os @@ -16,10 +17,7 @@ import sys import types import pytest -from unittest_mixins import ( - EnvironmentAwareMixin, StdStreamCapturingMixin, TempDirMixin, - DelayedAssertionMixin, -) +from unittest_mixins import EnvironmentAwareMixin, StdStreamCapturingMixin, TempDirMixin import coverage from coverage import env @@ -67,7 +65,6 @@ class CoverageTest( EnvironmentAwareMixin, StdStreamCapturingMixin, TempDirMixin, - DelayedAssertionMixin, CoverageTestMethodsMixin, TestCase, ): @@ -134,12 +131,22 @@ class CoverageTest( self.last_module_name = 'coverage_test_' + str(random.random())[2:] return self.last_module_name - def _assert_equal_arcs(self, a1, a2, msg=None): - """Assert that the arc lists `a1` and `a2` are equal.""" + def _check_arcs(self, a1, a2, arc_type): + """Check that the arc lists `a1` and `a2` are equal. + + If they are equal, return empty string. If they are unequal, return + a string explaining what is different. + """ # Make them into multi-line strings so we can see what's going wrong. s1 = arcs_to_arcz_repr(a1) s2 = arcs_to_arcz_repr(a2) - assert s1 == s2, msg + if s1 != s2: + lines1 = s1.splitlines(keepends=True) + lines2 = s2.splitlines(keepends=True) + diff = "".join(difflib.ndiff(lines1, lines2)) + return "\n" + arc_type + " arcs differ: minus is expected, plus is actual\n" + diff + else: + return "" def check_coverage( self, text, lines=None, missing="", report="", @@ -225,21 +232,14 @@ class CoverageTest( # print(" actual:", analysis.arc_possibilities()) # print("Executed:") # print(" actual:", sorted(set(analysis.arcs_executed()))) - with self.delayed_assertions(): - self._assert_equal_arcs( - arcs, analysis.arc_possibilities(), - "Possible arcs differ: minus is expected, plus is actual" - ) - - self._assert_equal_arcs( - arcs_missing, analysis.arcs_missing(), - "Missing arcs differ: minus is expected, plus is actual" - ) - - self._assert_equal_arcs( - arcs_unpredicted, analysis.arcs_unpredicted(), - "Unpredicted arcs differ: minus is expected, plus is actual" - ) + # TODO: this would be nicer with pytest-check, once we can run that. + msg = ( + self._check_arcs(arcs, analysis.arc_possibilities(), "Possible") + + self._check_arcs(arcs_missing, analysis.arcs_missing(), "Missing") + + self._check_arcs(arcs_unpredicted, analysis.arcs_unpredicted(), "Unpredicted") + ) + if msg: + assert False, msg if report: frep = StringIO() diff --git a/tests/test_arcs.py b/tests/test_arcs.py index 2f49ecfb..3b63bcc2 100644 --- a/tests/test_arcs.py +++ b/tests/test_arcs.py @@ -270,13 +270,10 @@ class LoopArcTest(CoverageTest): # With "while 1", the loop knows it's constant. if env.PYBEHAVIOR.keep_constant_test: arcz = ".1 12 23 34 45 36 62 57 7." - arcz_missing = "" elif env.PYBEHAVIOR.nix_while_true: arcz = ".1 13 34 45 36 63 57 7." - arcz_missing = "" else: arcz = ".1 12 23 34 45 36 63 57 7." - arcz_missing = "" self.check_coverage("""\ a, i = 1, 0 while 1: @@ -287,7 +284,6 @@ class LoopArcTest(CoverageTest): assert a == 4 and i == 3 """, arcz=arcz, - arcz_missing=arcz_missing, ) def test_while_true(self): |