From 5d7a8d0c13737fd531b722ad76c505ef47aac96a Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Mon, 1 May 2017 18:18:56 +0200 Subject: [PATCH] bpo-30190: improved error msg for assertAlmostEqual(delta=...) (#1331) * #30190 / unittest / assertAlmostEqual(delta=...) / error msg: show the difference between the 2 numbers in case of failure * safe_repr() diff * also show difference when passing 'places' argument * refactoring * update Misc/NEWS --- Lib/unittest/case.py | 35 +++++++++++++++++----------- Lib/unittest/test/test_assertions.py | 8 ++++--- Misc/NEWS | 6 ++++- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index f4dbc52852d..993aaec1940 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -856,23 +856,28 @@ class TestCase(object): if delta is not None and places is not None: raise TypeError("specify delta or places not both") + diff = abs(first - second) if delta is not None: - if abs(first - second) <= delta: + if diff <= delta: return - standardMsg = '%s != %s within %s delta' % (safe_repr(first), - safe_repr(second), - safe_repr(delta)) + standardMsg = '%s != %s within %s delta (%s difference)' % ( + safe_repr(first), + safe_repr(second), + safe_repr(delta), + safe_repr(diff)) else: if places is None: places = 7 - if round(abs(second-first), places) == 0: + if round(diff, places) == 0: return - standardMsg = '%s != %s within %r places' % (safe_repr(first), - safe_repr(second), - places) + standardMsg = '%s != %s within %r places (%s difference)' % ( + safe_repr(first), + safe_repr(second), + places, + safe_repr(diff)) msg = self._formatMessage(msg, standardMsg) raise self.failureException(msg) @@ -890,16 +895,19 @@ class TestCase(object): """ if delta is not None and places is not None: raise TypeError("specify delta or places not both") + diff = abs(first - second) if delta is not None: - if not (first == second) and abs(first - second) > delta: + if not (first == second) and diff > delta: return - standardMsg = '%s == %s within %s delta' % (safe_repr(first), - safe_repr(second), - safe_repr(delta)) + standardMsg = '%s == %s within %s delta (%s difference)' % ( + safe_repr(first), + safe_repr(second), + safe_repr(delta), + safe_repr(diff)) else: if places is None: places = 7 - if not (first == second) and round(abs(second-first), places) != 0: + if not (first == second) and round(diff, places) != 0: return standardMsg = '%s == %s within %r places' % (safe_repr(first), safe_repr(second), @@ -908,7 +916,6 @@ class TestCase(object): msg = self._formatMessage(msg, standardMsg) raise self.failureException(msg) - def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None): """An equality assertion for ordered sequences (like lists and tuples). diff --git a/Lib/unittest/test/test_assertions.py b/Lib/unittest/test/test_assertions.py index 31565da9849..b046669e19d 100644 --- a/Lib/unittest/test/test_assertions.py +++ b/Lib/unittest/test/test_assertions.py @@ -223,9 +223,11 @@ class TestLongMessage(unittest.TestCase): "^1 == 1 : oops$"]) def testAlmostEqual(self): - self.assertMessages('assertAlmostEqual', (1, 2), - ["^1 != 2 within 7 places$", "^oops$", - "^1 != 2 within 7 places$", "^1 != 2 within 7 places : oops$"]) + self.assertMessages( + 'assertAlmostEqual', (1, 2), + ["^1 != 2 within 7 places \(1 difference\)$", "^oops$", + "^1 != 2 within 7 places \(1 difference\)$", + "^1 != 2 within 7 places \(1 difference\) : oops$"]) def testNotAlmostEqual(self): self.assertMessages('assertNotAlmostEqual', (1, 1), diff --git a/Misc/NEWS b/Misc/NEWS index 026beff1954..2a86c3419ae 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,7 +10,7 @@ What's New in Python 3.7.0 alpha 1? Core and Builtins ----------------- -- bpo-12414: sys.getsizeof() on a code object now returns the sizes +- bpo-12414: sys.getsizeof() on a code object now returns the sizes which includes the code struct and sizes of objects which it references. Patch by Dong-hee Na. @@ -317,6 +317,10 @@ Extension Modules Library ------- +- bpo-30190: unittest's assertAlmostEqual and assertNotAlmostEqual provide a + better message in case of failure which includes the difference between + left and right arguments. (patch by Giampaolo Rodola') + - bpo-30101: Add support for curses.A_ITALIC. - bpo-29822: inspect.isabstract() now works during __init_subclass__. Patch