aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/unittest/runner.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2021-09-10 18:55:05 +0300
committerGitHub <noreply@github.com>2021-09-10 17:55:05 +0200
commitf0f29f328d8b4568e8c0d4c55c7d120d96f80911 (patch)
treea136806ec7f2fe5b0ca4d444f3d73d732b49e392 /Lib/unittest/runner.py
parentab327f2929589407595a3de95727c8ab34ddd4af (diff)
downloadcpython-f0f29f328d8b4568e8c0d4c55c7d120d96f80911.tar.gz
cpython-f0f29f328d8b4568e8c0d4c55c7d120d96f80911.zip
bpo-25894: Always report skipped and failed subtests separately (GH-28082)
* In default mode output separate characters for skipped and failed subtests. * In verbose mode output separate lines (including description) for skipped and failed subtests. * In verbose mode output test description for errors in test cleanup.
Diffstat (limited to 'Lib/unittest/runner.py')
-rw-r--r--Lib/unittest/runner.py38
1 files changed, 34 insertions, 4 deletions
diff --git a/Lib/unittest/runner.py b/Lib/unittest/runner.py
index 45e7e4c0458..f316d316601 100644
--- a/Lib/unittest/runner.py
+++ b/Lib/unittest/runner.py
@@ -5,6 +5,7 @@ import time
import warnings
from . import result
+from .case import _SubTest
from .signals import registerResult
__unittest = True
@@ -40,6 +41,7 @@ class TextTestResult(result.TestResult):
self.showAll = verbosity > 1
self.dots = verbosity == 1
self.descriptions = descriptions
+ self._newline = True
def getDescription(self, test):
doc_first_line = test.shortDescription()
@@ -54,11 +56,39 @@ class TextTestResult(result.TestResult):
self.stream.write(self.getDescription(test))
self.stream.write(" ... ")
self.stream.flush()
+ self._newline = False
+
+ def _write_status(self, test, status):
+ is_subtest = isinstance(test, _SubTest)
+ if is_subtest or self._newline:
+ if not self._newline:
+ self.stream.writeln()
+ if is_subtest:
+ self.stream.write(" ")
+ self.stream.write(self.getDescription(test))
+ self.stream.write(" ... ")
+ self.stream.writeln(status)
+ self._newline = True
+
+ def addSubTest(self, test, subtest, err):
+ if err is not None:
+ if self.showAll:
+ if issubclass(err[0], subtest.failureException):
+ self._write_status(subtest, "FAIL")
+ else:
+ self._write_status(subtest, "ERROR")
+ elif self.dots:
+ if issubclass(err[0], subtest.failureException):
+ self.stream.write('F')
+ else:
+ self.stream.write('E')
+ self.stream.flush()
+ super(TextTestResult, self).addSubTest(test, subtest, err)
def addSuccess(self, test):
super(TextTestResult, self).addSuccess(test)
if self.showAll:
- self.stream.writeln("ok")
+ self._write_status(test, "ok")
elif self.dots:
self.stream.write('.')
self.stream.flush()
@@ -66,7 +96,7 @@ class TextTestResult(result.TestResult):
def addError(self, test, err):
super(TextTestResult, self).addError(test, err)
if self.showAll:
- self.stream.writeln("ERROR")
+ self._write_status(test, "ERROR")
elif self.dots:
self.stream.write('E')
self.stream.flush()
@@ -74,7 +104,7 @@ class TextTestResult(result.TestResult):
def addFailure(self, test, err):
super(TextTestResult, self).addFailure(test, err)
if self.showAll:
- self.stream.writeln("FAIL")
+ self._write_status(test, "FAIL")
elif self.dots:
self.stream.write('F')
self.stream.flush()
@@ -82,7 +112,7 @@ class TextTestResult(result.TestResult):
def addSkip(self, test, reason):
super(TextTestResult, self).addSkip(test, reason)
if self.showAll:
- self.stream.writeln("skipped {0!r}".format(reason))
+ self._write_status(test, "skipped {0!r}".format(reason))
elif self.dots:
self.stream.write("s")
self.stream.flush()