Skip to content

Commit ddeb9a7

Browse files
committed
unittest: Improve failure text consistency with cpython.
1 parent 9b6315a commit ddeb9a7

File tree

1 file changed

+30
-16
lines changed

1 file changed

+30
-16
lines changed

python-stdlib/unittest/unittest.py

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,29 @@ def __exit__(self, exc_type, exc_value, tb):
4343

4444

4545
class SubtestContext:
46+
def __init__(self, msg=None, params=None):
47+
self.msg = msg
48+
self.params = params
49+
4650
def __enter__(self):
4751
pass
4852

4953
def __exit__(self, *exc_info):
5054
if exc_info[0] is not None:
5155
# Exception raised
5256
global __test_result__, __current_test__
53-
handle_test_exception(
54-
__current_test__,
55-
__test_result__,
56-
exc_info
57-
)
57+
test_details = __current_test__
58+
if self.msg:
59+
test_details += (f" [{self.msg}]",)
60+
if self.params:
61+
detail = ", ".join(f"{k}={v}" for k, v in self.params.items())
62+
test_details += (f" ({detail})",)
63+
64+
handle_test_exception(test_details, __test_result__, exc_info, False)
5865
# Suppress the exception as we've captured it above
5966
return True
6067

6168

62-
63-
6469
class NullContext:
6570
def __enter__(self):
6671
pass
@@ -287,6 +292,7 @@ def __init__(self):
287292
self.testsRun = 0
288293
self.errors = []
289294
self.failures = []
295+
self.newFailures = 0
290296

291297
def wasSuccessful(self):
292298
return self.errorsNum == 0 and self.failuresNum == 0
@@ -299,8 +305,9 @@ def printErrors(self):
299305
def printErrorList(self, lst):
300306
sep = "----------------------------------------------------------------------"
301307
for c, e in lst:
308+
detail = " ".join((str(i) for i in c))
302309
print("======================================================================")
303-
print(c)
310+
print(f"FAIL: {detail}")
304311
print(sep)
305312
print(e)
306313

@@ -331,18 +338,23 @@ def capture_exc(exc, traceback):
331338
return buf.getvalue()
332339

333340

334-
def handle_test_exception(current_test: tuple, test_result: TestResult, exc_info: tuple):
341+
def handle_test_exception(
342+
current_test: tuple, test_result: TestResult, exc_info: tuple, verbose=True
343+
):
335344
exc = exc_info[1]
336-
traceback = exc_info[2]
345+
traceback = exc_info[2]
337346
ex_str = capture_exc(exc, traceback)
338347
if isinstance(exc, AssertionError):
339348
test_result.failuresNum += 1
340349
test_result.failures.append((current_test, ex_str))
341-
print(" FAIL")
350+
if verbose:
351+
print(" FAIL")
342352
else:
343353
test_result.errorsNum += 1
344354
test_result.errors.append((current_test, ex_str))
345-
print(" ERROR")
355+
if verbose:
356+
print(" ERROR")
357+
test_result.newFailures += 1
346358

347359

348360
def run_suite(c, test_result, suite_name=""):
@@ -370,20 +382,22 @@ def run_one(test_function):
370382
test_container = f"({suite_name})"
371383
__current_test__ = (name, test_container)
372384
try:
385+
test_result.newFailures = 0
373386
test_result.testsRun += 1
374387
test_globals = dict(**globals())
375388
test_globals["test_function"] = test_function
376389
exec("test_function()", test_globals, test_globals)
377390
# No exception occurred, test passed
378-
print(" ok")
391+
if test_result.newFailures:
392+
print(" FAIL")
393+
else:
394+
print(" ok")
379395
except SkipTest as e:
380396
print(" skipped:", e.args[0])
381397
test_result.skippedNum += 1
382398
except Exception as ex:
383399
handle_test_exception(
384-
current_test=(name, c),
385-
test_result=test_result,
386-
exc_info=sys.exc_info()
400+
current_test=(name, c), test_result=test_result, exc_info=sys.exc_info()
387401
)
388402
# Uncomment to investigate failure in detail
389403
# raise

0 commit comments

Comments
 (0)