Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /