diff options
| author | Ahmad A. Hussein <ahmadahussein0@gmail.com> | 2020-07-22 17:37:52 +0200 |
|---|---|---|
| committer | Carlton Gibson <carlton@noumenal.es> | 2020-08-13 17:17:15 +0200 |
| commit | 61a0ba43cfd4ff66f51a9d73dcd8ed6f6a6d9915 (patch) | |
| tree | 5c5033cee4d537df66a6e1a51d4ea1a285551a65 /tests | |
| parent | 21768a99f47ee73a2f93405151550ef7c3d9c8a2 (diff) | |
Refs #31811 -- Added optional timing outputs to the test runner.
Diffstat (limited to 'tests')
| -rwxr-xr-x | tests/runtests.py | 30 | ||||
| -rw-r--r-- | tests/test_runner/test_discover_runner.py | 22 | ||||
| -rw-r--r-- | tests/test_runner/tests.py | 7 |
3 files changed, 47 insertions, 12 deletions
diff --git a/tests/runtests.py b/tests/runtests.py index d79b4b393e..db32da13eb 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -23,7 +23,7 @@ else: from django.test import TestCase, TransactionTestCase from django.test.runner import default_test_processes from django.test.selenium import SeleniumTestCaseBase - from django.test.utils import get_runner + from django.test.utils import NullTimeKeeper, TimeKeeper, get_runner from django.utils.deprecation import ( RemovedInDjango40Warning, RemovedInDjango41Warning, ) @@ -287,7 +287,8 @@ class ActionSelenium(argparse.Action): def django_tests(verbosity, interactive, failfast, keepdb, reverse, test_labels, debug_sql, parallel, tags, exclude_tags, - test_name_patterns, start_at, start_after, pdb, buffer): + test_name_patterns, start_at, start_after, pdb, buffer, + timing): state = setup(verbosity, test_labels, parallel, start_at, start_after) extra_tests = [] @@ -309,6 +310,7 @@ def django_tests(verbosity, interactive, failfast, keepdb, reverse, test_name_patterns=test_name_patterns, pdb=pdb, buffer=buffer, + timing=timing, ) failures = test_runner.run_tests( test_labels or get_installed(), @@ -508,6 +510,10 @@ if __name__ == "__main__": '-b', '--buffer', action='store_true', help='Discard output of passing tests.', ) + parser.add_argument( + '--timing', action='store_true', + help='Output timings, including database set up and total run time.', + ) if PY37: parser.add_argument( '-k', dest='test_name_patterns', action='append', @@ -568,13 +574,17 @@ if __name__ == "__main__": options.start_at, options.start_after, ) else: - failures = django_tests( - options.verbosity, options.interactive, options.failfast, - options.keepdb, options.reverse, options.modules, - options.debug_sql, options.parallel, options.tags, - options.exclude_tags, - getattr(options, 'test_name_patterns', None), - options.start_at, options.start_after, options.pdb, options.buffer, - ) + time_keeper = TimeKeeper() if options.timing else NullTimeKeeper() + with time_keeper.timed('Total run'): + failures = django_tests( + options.verbosity, options.interactive, options.failfast, + options.keepdb, options.reverse, options.modules, + options.debug_sql, options.parallel, options.tags, + options.exclude_tags, + getattr(options, 'test_name_patterns', None), + options.start_at, options.start_after, options.pdb, options.buffer, + options.timing, + ) + time_keeper.print_results() if failures: sys.exit(1) diff --git a/tests/test_runner/test_discover_runner.py b/tests/test_runner/test_discover_runner.py index 8caacd2620..183e283d08 100644 --- a/tests/test_runner/test_discover_runner.py +++ b/tests/test_runner/test_discover_runner.py @@ -8,7 +8,9 @@ from unittest import ( from django.db import connections from django.test import SimpleTestCase from django.test.runner import DiscoverRunner -from django.test.utils import captured_stderr, captured_stdout +from django.test.utils import ( + NullTimeKeeper, TimeKeeper, captured_stderr, captured_stdout, +) from django.utils.version import PY37 @@ -324,6 +326,24 @@ class DiscoverRunnerTests(SimpleTestCase): DiscoverRunner(enable_faulthandler=False) mocked_enable.assert_not_called() + def test_timings_not_captured(self): + runner = DiscoverRunner(timing=False) + with captured_stderr() as stderr: + with runner.time_keeper.timed('test'): + pass + runner.time_keeper.print_results() + self.assertTrue(isinstance(runner.time_keeper, NullTimeKeeper)) + self.assertNotIn('test', stderr.getvalue()) + + def test_timings_captured(self): + runner = DiscoverRunner(timing=True) + with captured_stderr() as stderr: + with runner.time_keeper.timed('test'): + pass + runner.time_keeper.print_results() + self.assertTrue(isinstance(runner.time_keeper, TimeKeeper)) + self.assertIn('test', stderr.getvalue()) + class DiscoverRunnerGetDatabasesTests(SimpleTestCase): runner = DiscoverRunner(verbosity=2) diff --git a/tests/test_runner/tests.py b/tests/test_runner/tests.py index 85e4e75720..e12ea3b11a 100644 --- a/tests/test_runner/tests.py +++ b/tests/test_runner/tests.py @@ -14,7 +14,7 @@ from django.core.management.base import SystemCheckError from django.test import TransactionTestCase, skipUnlessDBFeature, testcases from django.test.runner import DiscoverRunner from django.test.testcases import connections_support_transactions -from django.test.utils import dependency_ordered +from django.test.utils import captured_stderr, dependency_ordered from .models import B, Person, Through @@ -148,6 +148,11 @@ class ManageCommandTests(unittest.TestCase): with self.assertRaises(AttributeError): call_command('test', 'sites', testrunner='test_runner.NonexistentRunner') + def test_time_recorded(self): + with captured_stderr() as stderr: + call_command('test', '--timing', 'sites', testrunner='test_runner.tests.MockTestRunner') + self.assertIn('Total run took', stderr.getvalue()) + class CustomTestRunnerOptionsSettingsTests(AdminScriptTestCase): """ |
