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 /django/test/utils.py | |
parent | 21768a99f47ee73a2f93405151550ef7c3d9c8a2 (diff) | |
download | django-61a0ba43cfd4ff66f51a9d73dcd8ed6f6a6d9915.tar.gz |
Refs #31811 -- Added optional timing outputs to the test runner.
Diffstat (limited to 'django/test/utils.py')
-rw-r--r-- | django/test/utils.py | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/django/test/utils.py b/django/test/utils.py index d1f7d19546..fec6e7f8a3 100644 --- a/django/test/utils.py +++ b/django/test/utils.py @@ -1,5 +1,7 @@ import asyncio +import collections import logging +import os import re import sys import time @@ -152,7 +154,8 @@ def teardown_test_environment(): del mail.outbox -def setup_databases(verbosity, interactive, keepdb=False, debug_sql=False, parallel=0, aliases=None, **kwargs): +def setup_databases(verbosity, interactive, *, time_keeper, keepdb=False, debug_sql=False, parallel=0, + aliases=None): """Create the test databases.""" test_databases, mirrored_aliases = get_unique_databases_and_mirrors(aliases) @@ -167,19 +170,21 @@ def setup_databases(verbosity, interactive, keepdb=False, debug_sql=False, paral # Actually create the database for the first connection if first_alias is None: first_alias = alias - connection.creation.create_test_db( - verbosity=verbosity, - autoclobber=not interactive, - keepdb=keepdb, - serialize=connection.settings_dict['TEST'].get('SERIALIZE', True), - ) + with time_keeper.timed(" Creating '%s'" % alias): + connection.creation.create_test_db( + verbosity=verbosity, + autoclobber=not interactive, + keepdb=keepdb, + serialize=connection.settings_dict['TEST'].get('SERIALIZE', True), + ) if parallel > 1: for index in range(parallel): - connection.creation.clone_test_db( - suffix=str(index + 1), - verbosity=verbosity, - keepdb=keepdb, - ) + with time_keeper.timed(" Cloning '%s'" % alias): + connection.creation.clone_test_db( + suffix=str(index + 1), + verbosity=verbosity, + keepdb=keepdb, + ) # Configure all other connections as mirrors of the first one else: connections[alias].creation.set_as_test_mirror(connections[first_alias].settings_dict) @@ -841,6 +846,36 @@ class isolate_apps(TestContextDecorator): setattr(Options, 'default_apps', self.old_apps) +class TimeKeeper: + def __init__(self): + self.records = collections.defaultdict(list) + + @contextmanager + def timed(self, name): + self.records[name] + start_time = time.perf_counter() + try: + yield + finally: + end_time = time.perf_counter() - start_time + self.records[name].append(end_time) + + def print_results(self): + for name, end_times in self.records.items(): + for record_time in end_times: + record = '%s took %.3fs' % (name, record_time) + sys.stderr.write(record + os.linesep) + + +class NullTimeKeeper: + @contextmanager + def timed(self, name): + yield + + def print_results(self): + pass + + def tag(*tags): """Decorator to add tags to a test class or method.""" def decorator(obj): |