diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index dc76374d5181eb..a96a0b9dc4a70f 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -2204,6 +2204,12 @@ Loading and running tests .. versionchanged:: 3.12 Added the *durations* keyword parameter. + .. method:: getName(test) + + Return a test name used in test results. + + .. versionadded:: 3.14 + .. data:: defaultTestLoader Instance of the :class:`TestLoader` class intended to be shared. If no diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index da9b45cd8e58b3..520ec3dfaea013 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -135,6 +135,11 @@ symtable (Contributed by Bénédikt Tran in :gh:`120029`.) +unittest +-------- + +* The new :meth:`.TextTestResult.getName` method allows customizing test names + in test results. Optimizations ============= diff --git a/Lib/test/test_unittest/test_result.py b/Lib/test/test_unittest/test_result.py index 15e3f62ef66a4b..6118b1e1e32ced 100644 --- a/Lib/test/test_unittest/test_result.py +++ b/Lib/test/test_unittest/test_result.py @@ -467,6 +467,30 @@ def testGetDescriptionWithoutDocstring(self): 'testGetDescriptionWithoutDocstring (' + __name__ + '.Test_TextTestResult.testGetDescriptionWithoutDocstring)') + def testCustomGetNameWithoutDocstring(self): + class CustomGetNameTextTestResult(unittest.TextTestResult): + def getName(self, test): + return test.id() + + result = CustomGetNameTextTestResult(None, True, 1) + expected_test_name = __name__ + ".Test_TextTestResult.testCustomGetNameWithoutDocstring" + self.assertEqual(result.getName(self), expected_test_name) + self.assertEqual(result.getDescription(self), expected_test_name) + + def testCustomGetNameWithDocstring(self): + """Test docstring.""" + class CustomGetNameTextTestResult(unittest.TextTestResult): + def getName(self, test): + return test.id() + + result = CustomGetNameTextTestResult(None, True, 1) + expected_test_name = __name__ + ".Test_TextTestResult.testCustomGetNameWithDocstring" + self.assertEqual(result.getName(self), expected_test_name) + self.assertEqual( + result.getDescription(self), + expected_test_name + "\nTest docstring.", + ) + def testGetSubTestDescriptionWithoutDocstring(self): with self.subTest(foo=1, bar=2): result = unittest.TextTestResult(None, True, 1) diff --git a/Lib/unittest/runner.py b/Lib/unittest/runner.py index 2bcadf0c998bd9..ac79dcc886ff59 100644 --- a/Lib/unittest/runner.py +++ b/Lib/unittest/runner.py @@ -48,10 +48,14 @@ def __init__(self, stream, descriptions, verbosity, *, durations=None): def getDescription(self, test): doc_first_line = test.shortDescription() + test_name = self.getName(test) if self.descriptions and doc_first_line: - return '\n'.join((str(test), doc_first_line)) + return f'{test_name}\n{doc_first_line}' else: - return str(test) + return test_name + + def getName(self, test): + return str(test) def startTest(self, test): super(TextTestResult, self).startTest(test) diff --git a/Misc/NEWS.d/next/Library/2024-03-27-13-05-28.gh-issue-60492.EfCUSI.rst b/Misc/NEWS.d/next/Library/2024-03-27-13-05-28.gh-issue-60492.EfCUSI.rst new file mode 100644 index 00000000000000..61f9d3a8a65536 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-03-27-13-05-28.gh-issue-60492.EfCUSI.rst @@ -0,0 +1,2 @@ +Add ``TextTestResult.getName()`` method to allow customizing test names. +Patch by Mariusz Felisiak.