diff options
| author | Adam Johnson <me@adamj.eu> | 2020-05-23 19:32:22 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-08-03 09:57:04 +0200 |
| commit | ae89daf46f83a7b39d599d289624c3377bfa4ab1 (patch) | |
| tree | d13424f391dc541289db612d896542856bc4080f /tests | |
| parent | 7e38a8d66f9a4fbbf373de30f1cc6be906502559 (diff) | |
Fixed #31621 -- Added support for '--parallel auto' to test management command.
Diffstat (limited to 'tests')
| -rwxr-xr-x | tests/runtests.py | 27 | ||||
| -rw-r--r-- | tests/test_runner/test_discover_runner.py | 17 |
2 files changed, 34 insertions, 10 deletions
diff --git a/tests/runtests.py b/tests/runtests.py index 648ac27e05..dfbc70818c 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -23,7 +23,7 @@ else: from django.conf import settings from django.db import connection, connections from django.test import TestCase, TransactionTestCase - from django.test.runner import default_test_processes + from django.test.runner import parallel_type from django.test.selenium import SeleniumTestCaseBase from django.test.utils import NullTimeKeeper, TimeKeeper, get_runner from django.utils.deprecation import ( @@ -329,7 +329,7 @@ def actual_test_processes(parallel): if parallel == 0: # This doesn't work before django.setup() on some databases. if all(conn.features.can_clone_databases for conn in connections.all()): - return default_test_processes() + return parallel_type('auto') else: return 1 else: @@ -354,11 +354,12 @@ 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, timing, shuffle): + actual_parallel = actual_test_processes(parallel) + if verbosity >= 1: msg = "Testing against Django installed in '%s'" % os.path.dirname(django.__file__) - max_parallel = default_test_processes() if parallel == 0 else parallel - if max_parallel > 1: - msg += " with up to %d processes" % max_parallel + if actual_parallel > 1: + msg += " with up to %d processes" % actual_parallel print(msg) test_labels, state = setup_run_tests(verbosity, start_at, start_after, test_labels) @@ -373,7 +374,7 @@ def django_tests(verbosity, interactive, failfast, keepdb, reverse, keepdb=keepdb, reverse=reverse, debug_sql=debug_sql, - parallel=actual_test_processes(parallel), + parallel=actual_parallel, tags=tags, exclude_tags=exclude_tags, test_name_patterns=test_name_patterns, @@ -562,10 +563,18 @@ if __name__ == "__main__": '--debug-sql', action='store_true', help='Turn on the SQL query logger within tests.', ) + try: + default_parallel = int(os.environ['DJANGO_TEST_PROCESSES']) + except KeyError: + # actual_test_processes() converts this to "auto" later on. + default_parallel = 0 parser.add_argument( - '--parallel', nargs='?', default=0, type=int, - const=default_test_processes(), metavar='N', - help='Run tests using up to N parallel processes.', + '--parallel', nargs='?', const='auto', default=default_parallel, + type=parallel_type, metavar='N', + help=( + 'Run tests using up to N parallel processes. Use the value "auto" ' + 'to run one test process for each processor core.' + ), ) parser.add_argument( '--tag', dest='tags', action='append', diff --git a/tests/test_runner/test_discover_runner.py b/tests/test_runner/test_discover_runner.py index 327a6625ae..f62f157149 100644 --- a/tests/test_runner/test_discover_runner.py +++ b/tests/test_runner/test_discover_runner.py @@ -50,16 +50,31 @@ class DiscoverRunnerParallelArgumentTests(SimpleTestCase): def test_parallel_default(self, *mocked_objects): result = self.get_parser().parse_args([]) - self.assertEqual(result.parallel, 1) + self.assertEqual(result.parallel, 0) def test_parallel_flag(self, *mocked_objects): result = self.get_parser().parse_args(['--parallel']) self.assertEqual(result.parallel, 12) + def test_parallel_auto(self, *mocked_objects): + result = self.get_parser().parse_args(['--parallel', 'auto']) + self.assertEqual(result.parallel, 12) + def test_parallel_count(self, *mocked_objects): result = self.get_parser().parse_args(['--parallel', '17']) self.assertEqual(result.parallel, 17) + def test_parallel_invalid(self, *mocked_objects): + with self.assertRaises(SystemExit), captured_stderr() as stderr: + self.get_parser().parse_args(['--parallel', 'unaccepted']) + msg = "argument --parallel: 'unaccepted' is not an integer or the string 'auto'" + self.assertIn(msg, stderr.getvalue()) + + @mock.patch.dict(os.environ, {'DJANGO_TEST_PROCESSES': '7'}) + def test_parallel_env_var(self, *mocked_objects): + result = self.get_parser().parse_args([]) + self.assertEqual(result.parallel, 7) + @mock.patch.dict(os.environ, {'DJANGO_TEST_PROCESSES': 'typo'}) def test_parallel_env_var_non_int(self, *mocked_objects): with self.assertRaises(ValueError): |
