Fixed #32988 -- Prevented creation of more test databases than TestCases.

DiscoverRunner.parallel is used in setup_databases() and
teardown_databases() to control the number of test databases.

Regression in cb6c19749d.
This commit is contained in:
Mariusz Felisiak 2021-08-05 05:55:35 +02:00 committed by GitHub
parent 2d0ae8da80
commit ab16507f19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 0 deletions

View File

@ -795,6 +795,9 @@ class DiscoverRunner:
# Since tests are distributed across processes on a per-TestCase # Since tests are distributed across processes on a per-TestCase
# basis, there's no need for more processes than TestCases. # basis, there's no need for more processes than TestCases.
processes = min(self.parallel, len(subsuites)) processes = min(self.parallel, len(subsuites))
# Update also "parallel" because it's used to determine the number
# of test databases.
self.parallel = processes
if processes > 1: if processes > 1:
suite = self.parallel_test_suite( suite = self.parallel_test_suite(
subsuites, subsuites,

View File

@ -457,6 +457,26 @@ class DiscoverRunnerTests(SimpleTestCase):
suite = runner.build_suite(['test_runner_apps.tagged']) suite = runner.build_suite(['test_runner_apps.tagged'])
self.assertEqual(suite.processes, len(suite.subsuites)) self.assertEqual(suite.processes, len(suite.subsuites))
def test_number_of_databases_parallel_test_suite(self):
"""
Number of databases doesn't exceed the number of TestCases with
parallel tests.
"""
runner = DiscoverRunner(parallel=8, verbosity=0)
suite = runner.build_suite(['test_runner_apps.tagged'])
self.assertEqual(suite.processes, len(suite.subsuites))
self.assertEqual(runner.parallel, suite.processes)
def test_number_of_databases_no_parallel_test_suite(self):
"""
Number of databases doesn't exceed the number of TestCases with
non-parallel tests.
"""
runner = DiscoverRunner(parallel=8, verbosity=0)
suite = runner.build_suite(['test_runner_apps.simple.tests.DjangoCase1'])
self.assertEqual(runner.parallel, 1)
self.assertIsInstance(suite, TestSuite)
def test_buffer_mode_test_pass(self): def test_buffer_mode_test_pass(self):
runner = DiscoverRunner(buffer=True, verbosity=0) runner = DiscoverRunner(buffer=True, verbosity=0)
with captured_stdout() as stdout, captured_stderr() as stderr: with captured_stdout() as stdout, captured_stderr() as stderr: