diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 6e0df0648fb8bf..ed0a6f6044c833 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -2265,6 +2265,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.15 + .. data:: defaultTestLoader Instance of the :class:`TestLoader` class intended to be shared. If no diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst index ed07afd2277cc0..6b06ebae9b62eb 100644 --- a/Doc/whatsnew/3.15.rst +++ b/Doc/whatsnew/3.15.rst @@ -1274,6 +1274,9 @@ unittest to control how messages are formatted. (Contributed by Garry Cairns in :gh:`134567`.) +* The new :meth:`.TextTestResult.getName` method allows customizing test names + in test results. + urllib.parse ------------ diff --git a/Lib/test/test_unittest/test_result.py b/Lib/test/test_unittest/test_result.py index 3f44e617303f81..cf0c2ee6eb2a26 100644 --- a/Lib/test/test_unittest/test_result.py +++ b/Lib/test/test_unittest/test_result.py @@ -468,6 +468,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 5f22d91aebd05f..d01a7d5d69713b 100644 --- a/Lib/unittest/runner.py +++ b/Lib/unittest/runner.py @@ -51,10 +51,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.