summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAhmad A. Hussein <ahmadahussein0@gmail.com>2020-07-22 17:37:52 +0200
committerCarlton Gibson <carlton@noumenal.es>2020-08-13 17:17:15 +0200
commit61a0ba43cfd4ff66f51a9d73dcd8ed6f6a6d9915 (patch)
tree5c5033cee4d537df66a6e1a51d4ea1a285551a65 /tests
parent21768a99f47ee73a2f93405151550ef7c3d9c8a2 (diff)
Refs #31811 -- Added optional timing outputs to the test runner.
Diffstat (limited to 'tests')
-rwxr-xr-xtests/runtests.py30
-rw-r--r--tests/test_runner/test_discover_runner.py22
-rw-r--r--tests/test_runner/tests.py7
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):
"""