summaryrefslogtreecommitdiff
path: root/tests/test_runner/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_runner/tests.py')
-rw-r--r--tests/test_runner/tests.py734
1 files changed, 444 insertions, 290 deletions
diff --git a/tests/test_runner/tests.py b/tests/test_runner/tests.py
index 62b489abc7..665f2c5ef8 100644
--- a/tests/test_runner/tests.py
+++ b/tests/test_runner/tests.py
@@ -15,15 +15,19 @@ from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.core.management import call_command
from django.core.management.base import SystemCheckError
-from django.test import (
- SimpleTestCase, TransactionTestCase, skipUnlessDBFeature,
-)
+from django.test import SimpleTestCase, TransactionTestCase, skipUnlessDBFeature
from django.test.runner import (
- DiscoverRunner, Shuffler, reorder_test_bin, reorder_tests, shuffle_tests,
+ DiscoverRunner,
+ Shuffler,
+ reorder_test_bin,
+ reorder_tests,
+ shuffle_tests,
)
from django.test.testcases import connections_support_transactions
from django.test.utils import (
- captured_stderr, dependency_ordered, get_unique_databases_and_mirrors,
+ captured_stderr,
+ dependency_ordered,
+ get_unique_databases_and_mirrors,
iter_test_cases,
)
from django.utils.deprecation import RemovedInDjango50Warning
@@ -85,15 +89,21 @@ class TestSuiteTests(SimpleTestCase):
# Each test.id() has a form like the following:
# "test_runner.tests.IterTestCasesTests.test_iter_test_cases.<locals>.Tests1.test1".
# It suffices to check only the last two parts.
- names = ['.'.join(test.id().split('.')[-2:]) for test in tests]
+ names = [".".join(test.id().split(".")[-2:]) for test in tests]
self.assertEqual(names, expected)
def test_iter_test_cases_basic(self):
suite = self.make_test_suite()
tests = iter_test_cases(suite)
- self.assertTestNames(tests, expected=[
- 'Tests1.test1', 'Tests1.test2', 'Tests2.test1', 'Tests2.test2',
- ])
+ self.assertTestNames(
+ tests,
+ expected=[
+ "Tests1.test1",
+ "Tests1.test2",
+ "Tests2.test1",
+ "Tests2.test2",
+ ],
+ )
def test_iter_test_cases_string_input(self):
msg = (
@@ -101,7 +111,7 @@ class TestSuiteTests(SimpleTestCase):
"in 'abc')."
)
with self.assertRaisesMessage(TypeError, msg):
- list(iter_test_cases('abc'))
+ list(iter_test_cases("abc"))
def test_iter_test_cases_iterable_of_tests(self):
class Tests(unittest.TestCase):
@@ -113,16 +123,26 @@ class TestSuiteTests(SimpleTestCase):
tests = list(unittest.defaultTestLoader.loadTestsFromTestCase(Tests))
actual_tests = iter_test_cases(tests)
- self.assertTestNames(actual_tests, expected=[
- 'Tests.test1', 'Tests.test2',
- ])
+ self.assertTestNames(
+ actual_tests,
+ expected=[
+ "Tests.test1",
+ "Tests.test2",
+ ],
+ )
def test_iter_test_cases_custom_test_suite_class(self):
suite = self.make_test_suite(suite_class=MySuite)
tests = iter_test_cases(suite)
- self.assertTestNames(tests, expected=[
- 'Tests1.test1', 'Tests1.test2', 'Tests2.test1', 'Tests2.test2',
- ])
+ self.assertTestNames(
+ tests,
+ expected=[
+ "Tests1.test1",
+ "Tests1.test2",
+ "Tests2.test1",
+ "Tests2.test2",
+ ],
+ )
def test_iter_test_cases_mixed_test_suite_classes(self):
suite = self.make_test_suite(suite=MySuite())
@@ -144,25 +164,43 @@ class TestSuiteTests(SimpleTestCase):
shuffler = Shuffler(seed=9)
shuffled_tests = shuffle_tests(tests, shuffler)
self.assertIsInstance(shuffled_tests, collections.abc.Iterator)
- self.assertTestNames(shuffled_tests, expected=[
- 'Tests2.test1', 'Tests2.test2', 'Tests1.test2', 'Tests1.test1',
- ])
+ self.assertTestNames(
+ shuffled_tests,
+ expected=[
+ "Tests2.test1",
+ "Tests2.test2",
+ "Tests1.test2",
+ "Tests1.test1",
+ ],
+ )
def test_reorder_test_bin_no_arguments(self):
tests = self.make_tests()
reordered_tests = reorder_test_bin(tests)
self.assertIsInstance(reordered_tests, collections.abc.Iterator)
- self.assertTestNames(reordered_tests, expected=[
- 'Tests1.test1', 'Tests1.test2', 'Tests2.test1', 'Tests2.test2',
- ])
+ self.assertTestNames(
+ reordered_tests,
+ expected=[
+ "Tests1.test1",
+ "Tests1.test2",
+ "Tests2.test1",
+ "Tests2.test2",
+ ],
+ )
def test_reorder_test_bin_reverse(self):
tests = self.make_tests()
reordered_tests = reorder_test_bin(tests, reverse=True)
self.assertIsInstance(reordered_tests, collections.abc.Iterator)
- self.assertTestNames(reordered_tests, expected=[
- 'Tests2.test2', 'Tests2.test1', 'Tests1.test2', 'Tests1.test1',
- ])
+ self.assertTestNames(
+ reordered_tests,
+ expected=[
+ "Tests2.test2",
+ "Tests2.test1",
+ "Tests1.test2",
+ "Tests1.test1",
+ ],
+ )
def test_reorder_test_bin_random(self):
tests = self.make_tests()
@@ -170,9 +208,15 @@ class TestSuiteTests(SimpleTestCase):
shuffler = Shuffler(seed=9)
reordered_tests = reorder_test_bin(tests, shuffler=shuffler)
self.assertIsInstance(reordered_tests, collections.abc.Iterator)
- self.assertTestNames(reordered_tests, expected=[
- 'Tests2.test1', 'Tests2.test2', 'Tests1.test2', 'Tests1.test1',
- ])
+ self.assertTestNames(
+ reordered_tests,
+ expected=[
+ "Tests2.test1",
+ "Tests2.test2",
+ "Tests1.test2",
+ "Tests1.test1",
+ ],
+ )
def test_reorder_test_bin_random_and_reverse(self):
tests = self.make_tests()
@@ -180,22 +224,40 @@ class TestSuiteTests(SimpleTestCase):
shuffler = Shuffler(seed=9)
reordered_tests = reorder_test_bin(tests, shuffler=shuffler, reverse=True)
self.assertIsInstance(reordered_tests, collections.abc.Iterator)
- self.assertTestNames(reordered_tests, expected=[
- 'Tests1.test1', 'Tests1.test2', 'Tests2.test2', 'Tests2.test1',
- ])
+ self.assertTestNames(
+ reordered_tests,
+ expected=[
+ "Tests1.test1",
+ "Tests1.test2",
+ "Tests2.test2",
+ "Tests2.test1",
+ ],
+ )
def test_reorder_tests_same_type_consecutive(self):
"""Tests of the same type are made consecutive."""
tests = self.make_tests()
# Move the last item to the front.
tests.insert(0, tests.pop())
- self.assertTestNames(tests, expected=[
- 'Tests2.test2', 'Tests1.test1', 'Tests1.test2', 'Tests2.test1',
- ])
+ self.assertTestNames(
+ tests,
+ expected=[
+ "Tests2.test2",
+ "Tests1.test1",
+ "Tests1.test2",
+ "Tests2.test1",
+ ],
+ )
reordered_tests = reorder_tests(tests, classes=[])
- self.assertTestNames(reordered_tests, expected=[
- 'Tests2.test2', 'Tests2.test1', 'Tests1.test1', 'Tests1.test2',
- ])
+ self.assertTestNames(
+ reordered_tests,
+ expected=[
+ "Tests2.test2",
+ "Tests2.test1",
+ "Tests1.test1",
+ "Tests1.test2",
+ ],
+ )
def test_reorder_tests_random(self):
tests = self.make_tests()
@@ -203,22 +265,40 @@ class TestSuiteTests(SimpleTestCase):
shuffler = Shuffler(seed=9)
reordered_tests = reorder_tests(tests, classes=[], shuffler=shuffler)
self.assertIsInstance(reordered_tests, collections.abc.Iterator)
- self.assertTestNames(reordered_tests, expected=[
- 'Tests2.test1', 'Tests2.test2', 'Tests1.test2', 'Tests1.test1',
- ])
+ self.assertTestNames(
+ reordered_tests,
+ expected=[
+ "Tests2.test1",
+ "Tests2.test2",
+ "Tests1.test2",
+ "Tests1.test1",
+ ],
+ )
def test_reorder_tests_random_mixed_classes(self):
tests = self.make_tests()
# Move the last item to the front.
tests.insert(0, tests.pop())
shuffler = Shuffler(seed=9)
- self.assertTestNames(tests, expected=[
- 'Tests2.test2', 'Tests1.test1', 'Tests1.test2', 'Tests2.test1',
- ])
+ self.assertTestNames(
+ tests,
+ expected=[
+ "Tests2.test2",
+ "Tests1.test1",
+ "Tests1.test2",
+ "Tests2.test1",
+ ],
+ )
reordered_tests = reorder_tests(tests, classes=[], shuffler=shuffler)
- self.assertTestNames(reordered_tests, expected=[
- 'Tests2.test1', 'Tests2.test2', 'Tests1.test2', 'Tests1.test1',
- ])
+ self.assertTestNames(
+ reordered_tests,
+ expected=[
+ "Tests2.test1",
+ "Tests2.test2",
+ "Tests1.test2",
+ "Tests1.test1",
+ ],
+ )
def test_reorder_tests_reverse_with_duplicates(self):
class Tests1(unittest.TestCase):
@@ -236,124 +316,133 @@ class TestSuiteTests(SimpleTestCase):
subsuite = list(suite)[0]
suite.addTest(subsuite)
tests = list(iter_test_cases(suite))
- self.assertTestNames(tests, expected=[
- 'Tests1.test1', 'Tests2.test2', 'Tests2.test3', 'Tests1.test1',
- ])
+ self.assertTestNames(
+ tests,
+ expected=[
+ "Tests1.test1",
+ "Tests2.test2",
+ "Tests2.test3",
+ "Tests1.test1",
+ ],
+ )
reordered_tests = reorder_tests(tests, classes=[])
- self.assertTestNames(reordered_tests, expected=[
- 'Tests1.test1', 'Tests2.test2', 'Tests2.test3',
- ])
+ self.assertTestNames(
+ reordered_tests,
+ expected=[
+ "Tests1.test1",
+ "Tests2.test2",
+ "Tests2.test3",
+ ],
+ )
reordered_tests = reorder_tests(tests, classes=[], reverse=True)
- self.assertTestNames(reordered_tests, expected=[
- 'Tests2.test3', 'Tests2.test2', 'Tests1.test1',
- ])
+ self.assertTestNames(
+ reordered_tests,
+ expected=[
+ "Tests2.test3",
+ "Tests2.test2",
+ "Tests1.test1",
+ ],
+ )
class DependencyOrderingTests(unittest.TestCase):
-
def test_simple_dependencies(self):
raw = [
- ('s1', ('s1_db', ['alpha'])),
- ('s2', ('s2_db', ['bravo'])),
- ('s3', ('s3_db', ['charlie'])),
+ ("s1", ("s1_db", ["alpha"])),
+ ("s2", ("s2_db", ["bravo"])),
+ ("s3", ("s3_db", ["charlie"])),
]
dependencies = {
- 'alpha': ['charlie'],
- 'bravo': ['charlie'],
+ "alpha": ["charlie"],
+ "bravo": ["charlie"],
}
ordered = dependency_ordered(raw, dependencies=dependencies)
ordered_sigs = [sig for sig, value in ordered]
- self.assertIn('s1', ordered_sigs)
- self.assertIn('s2', ordered_sigs)
- self.assertIn('s3', ordered_sigs)
- self.assertLess(ordered_sigs.index('s3'), ordered_sigs.index('s1'))
- self.assertLess(ordered_sigs.index('s3'), ordered_sigs.index('s2'))
+ self.assertIn("s1", ordered_sigs)
+ self.assertIn("s2", ordered_sigs)
+ self.assertIn("s3", ordered_sigs)
+ self.assertLess(ordered_sigs.index("s3"), ordered_sigs.index("s1"))
+ self.assertLess(ordered_sigs.index("s3"), ordered_sigs.index("s2"))
def test_chained_dependencies(self):
raw = [
- ('s1', ('s1_db', ['alpha'])),
- ('s2', ('s2_db', ['bravo'])),
- ('s3', ('s3_db', ['charlie'])),
+ ("s1", ("s1_db", ["alpha"])),
+ ("s2", ("s2_db", ["bravo"])),
+ ("s3", ("s3_db", ["charlie"])),
]
dependencies = {
- 'alpha': ['bravo'],
- 'bravo': ['charlie'],
+ "alpha": ["bravo"],
+ "bravo": ["charlie"],
}
ordered = dependency_ordered(raw, dependencies=dependencies)
ordered_sigs = [sig for sig, value in ordered]
- self.assertIn('s1', ordered_sigs)
- self.assertIn('s2', ordered_sigs)
- self.assertIn('s3', ordered_sigs)
+ self.assertIn("s1", ordered_sigs)
+ self.assertIn("s2", ordered_sigs)
+ self.assertIn("s3", ordered_sigs)
# Explicit dependencies
- self.assertLess(ordered_sigs.index('s2'), ordered_sigs.index('s1'))
- self.assertLess(ordered_sigs.index('s3'), ordered_sigs.index('s2'))
+ self.assertLess(ordered_sigs.index("s2"), ordered_sigs.index("s1"))
+ self.assertLess(ordered_sigs.index("s3"), ordered_sigs.index("s2"))
# Implied dependencies
- self.assertLess(ordered_sigs.index('s3'), ordered_sigs.index('s1'))
+ self.assertLess(ordered_sigs.index("s3"), ordered_sigs.index("s1"))
def test_multiple_dependencies(self):
raw = [
- ('s1', ('s1_db', ['alpha'])),
- ('s2', ('s2_db', ['bravo'])),
- ('s3', ('s3_db', ['charlie'])),
- ('s4', ('s4_db', ['delta'])),
+ ("s1", ("s1_db", ["alpha"])),
+ ("s2", ("s2_db", ["bravo"])),
+ ("s3", ("s3_db", ["charlie"])),
+ ("s4", ("s4_db", ["delta"])),
]
dependencies = {
- 'alpha': ['bravo', 'delta'],
- 'bravo': ['charlie'],
- 'delta': ['charlie'],
+ "alpha": ["bravo", "delta"],
+ "bravo": ["charlie"],
+ "delta": ["charlie"],
}
ordered = dependency_ordered(raw, dependencies=dependencies)
ordered_sigs = [sig for sig, aliases in ordered]
- self.assertIn('s1', ordered_sigs)
- self.assertIn('s2', ordered_sigs)
- self.assertIn('s3', ordered_sigs)
- self.assertIn('s4', ordered_sigs)
+ self.assertIn("s1", ordered_sigs)
+ self.assertIn("s2", ordered_sigs)
+ self.assertIn("s3", ordered_sigs)
+ self.assertIn("s4", ordered_sigs)
# Explicit dependencies
- self.assertLess(ordered_sigs.index('s2'), ordered_sigs.index('s1'))
- self.assertLess(ordered_sigs.index('s4'), ordered_sigs.index('s1'))
- self.assertLess(ordered_sigs.index('s3'), ordered_sigs.index('s2'))
- self.assertLess(ordered_sigs.index('s3'), ordered_sigs.index('s4'))
+ self.assertLess(ordered_sigs.index("s2"), ordered_sigs.index("s1"))
+ self.assertLess(ordered_sigs.index("s4"), ordered_sigs.index("s1"))
+ self.assertLess(ordered_sigs.index("s3"), ordered_sigs.index("s2"))
+ self.assertLess(ordered_sigs.index("s3"), ordered_sigs.index("s4"))
# Implicit dependencies
- self.assertLess(ordered_sigs.index('s3'), ordered_sigs.index('s1'))
+ self.assertLess(ordered_sigs.index("s3"), ordered_sigs.index("s1"))
def test_circular_dependencies(self):
raw = [
- ('s1', ('s1_db', ['alpha'])),
- ('s2', ('s2_db', ['bravo'])),
+ ("s1", ("s1_db", ["alpha"])),
+ ("s2", ("s2_db", ["bravo"])),
]
dependencies = {
- 'bravo': ['alpha'],
- 'alpha': ['bravo'],
+ "bravo": ["alpha"],
+ "alpha": ["bravo"],
}
with self.assertRaises(ImproperlyConfigured):
dependency_ordered(raw, dependencies=dependencies)
def test_own_alias_dependency(self):
- raw = [
- ('s1', ('s1_db', ['alpha', 'bravo']))
- ]
- dependencies = {
- 'alpha': ['bravo']
- }
+ raw = [("s1", ("s1_db", ["alpha", "bravo"]))]
+ dependencies = {"alpha": ["bravo"]}
with self.assertRaises(ImproperlyConfigured):
dependency_ordered(raw, dependencies=dependencies)
# reordering aliases shouldn't matter
- raw = [
- ('s1', ('s1_db', ['bravo', 'alpha']))
- ]
+ raw = [("s1", ("s1_db", ["bravo", "alpha"]))]
with self.assertRaises(ImproperlyConfigured):
dependency_ordered(raw, dependencies=dependencies)
@@ -361,105 +450,108 @@ class DependencyOrderingTests(unittest.TestCase):
class MockTestRunner:
def __init__(self, *args, **kwargs):
- if parallel := kwargs.get('parallel'):
- sys.stderr.write(f'parallel={parallel}')
+ if parallel := kwargs.get("parallel"):
+ sys.stderr.write(f"parallel={parallel}")
MockTestRunner.run_tests = mock.Mock(return_value=[])
class ManageCommandTests(unittest.TestCase):
-
def test_custom_test_runner(self):
- call_command('test', 'sites',
- testrunner='test_runner.tests.MockTestRunner')
- MockTestRunner.run_tests.assert_called_with(('sites',))
+ call_command("test", "sites", testrunner="test_runner.tests.MockTestRunner")
+ MockTestRunner.run_tests.assert_called_with(("sites",))
def test_bad_test_runner(self):
with self.assertRaises(AttributeError):
- call_command('test', 'sites', testrunner='test_runner.NonexistentRunner')
+ 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())
+ call_command(
+ "test",
+ "--timing",
+ "sites",
+ testrunner="test_runner.tests.MockTestRunner",
+ )
+ self.assertIn("Total run took", stderr.getvalue())
# Isolate from the real environment.
@mock.patch.dict(os.environ, {}, clear=True)
-@mock.patch.object(multiprocessing, 'cpu_count', return_value=12)
+@mock.patch.object(multiprocessing, "cpu_count", return_value=12)
# Python 3.8 on macOS defaults to 'spawn' mode.
-@mock.patch.object(multiprocessing, 'get_start_method', return_value='fork')
+@mock.patch.object(multiprocessing, "get_start_method", return_value="fork")
class ManageCommandParallelTests(SimpleTestCase):
def test_parallel_default(self, *mocked_objects):
with captured_stderr() as stderr:
call_command(
- 'test',
- '--parallel',
- testrunner='test_runner.tests.MockTestRunner',
+ "test",
+ "--parallel",
+ testrunner="test_runner.tests.MockTestRunner",
)
- self.assertIn('parallel=12', stderr.getvalue())
+ self.assertIn("parallel=12", stderr.getvalue())
def test_parallel_auto(self, *mocked_objects):
with captured_stderr() as stderr:
call_command(
- 'test',
- '--parallel=auto',
- testrunner='test_runner.tests.MockTestRunner',
+ "test",
+ "--parallel=auto",
+ testrunner="test_runner.tests.MockTestRunner",
)
- self.assertIn('parallel=12', stderr.getvalue())
+ self.assertIn("parallel=12", stderr.getvalue())
def test_no_parallel(self, *mocked_objects):
with captured_stderr() as stderr:
- call_command('test', testrunner='test_runner.tests.MockTestRunner')
+ call_command("test", testrunner="test_runner.tests.MockTestRunner")
# Parallel is disabled by default.
- self.assertEqual(stderr.getvalue(), '')
+ self.assertEqual(stderr.getvalue(), "")
def test_parallel_spawn(self, mocked_get_start_method, mocked_cpu_count):
- mocked_get_start_method.return_value = 'spawn'
+ mocked_get_start_method.return_value = "spawn"
with captured_stderr() as stderr:
call_command(
- 'test',
- '--parallel=auto',
- testrunner='test_runner.tests.MockTestRunner',
+ "test",
+ "--parallel=auto",
+ testrunner="test_runner.tests.MockTestRunner",
)
- self.assertIn('parallel=1', stderr.getvalue())
+ self.assertIn("parallel=1", stderr.getvalue())
def test_no_parallel_spawn(self, mocked_get_start_method, mocked_cpu_count):
- mocked_get_start_method.return_value = 'spawn'
+ mocked_get_start_method.return_value = "spawn"
with captured_stderr() as stderr:
call_command(
- 'test',
- testrunner='test_runner.tests.MockTestRunner',
+ "test",
+ testrunner="test_runner.tests.MockTestRunner",
)
- self.assertEqual(stderr.getvalue(), '')
+ self.assertEqual(stderr.getvalue(), "")
- @mock.patch.dict(os.environ, {'DJANGO_TEST_PROCESSES': '7'})
+ @mock.patch.dict(os.environ, {"DJANGO_TEST_PROCESSES": "7"})
def test_no_parallel_django_test_processes_env(self, *mocked_objects):
with captured_stderr() as stderr:
- call_command('test', testrunner='test_runner.tests.MockTestRunner')
- self.assertEqual(stderr.getvalue(), '')
+ call_command("test", testrunner="test_runner.tests.MockTestRunner")
+ self.assertEqual(stderr.getvalue(), "")
- @mock.patch.dict(os.environ, {'DJANGO_TEST_PROCESSES': 'invalid'})
+ @mock.patch.dict(os.environ, {"DJANGO_TEST_PROCESSES": "invalid"})
def test_django_test_processes_env_non_int(self, *mocked_objects):
with self.assertRaises(ValueError):
call_command(
- 'test',
- '--parallel',
- testrunner='test_runner.tests.MockTestRunner',
+ "test",
+ "--parallel",
+ testrunner="test_runner.tests.MockTestRunner",
)
- @mock.patch.dict(os.environ, {'DJANGO_TEST_PROCESSES': '7'})
+ @mock.patch.dict(os.environ, {"DJANGO_TEST_PROCESSES": "7"})
def test_django_test_processes_parallel_default(self, *mocked_objects):
- for parallel in ['--parallel', '--parallel=auto']:
+ for parallel in ["--parallel", "--parallel=auto"]:
with self.subTest(parallel=parallel):
with captured_stderr() as stderr:
call_command(
- 'test',
+ "test",
parallel,
- testrunner='test_runner.tests.MockTestRunner',
+ testrunner="test_runner.tests.MockTestRunner",
)
- self.assertIn('parallel=7', stderr.getvalue())
+ self.assertIn("parallel=7", stderr.getvalue())
class CustomTestRunnerOptionsSettingsTests(AdminScriptTestCase):
@@ -467,37 +559,43 @@ class CustomTestRunnerOptionsSettingsTests(AdminScriptTestCase):
Custom runners can add command line arguments. The runner is specified
through a settings file.
"""
+
def setUp(self):
super().setUp()
settings = {
- 'TEST_RUNNER': '\'test_runner.runner.CustomOptionsTestRunner\'',
+ "TEST_RUNNER": "'test_runner.runner.CustomOptionsTestRunner'",
}
- self.write_settings('settings.py', sdict=settings)
+ self.write_settings("settings.py", sdict=settings)
def test_default_options(self):
- args = ['test', '--settings=test_project.settings']
+ args = ["test", "--settings=test_project.settings"]
out, err = self.run_django_admin(args)
self.assertNoOutput(err)
- self.assertOutput(out, '1:2:3')
+ self.assertOutput(out, "1:2:3")
def test_default_and_given_options(self):
- args = ['test', '--settings=test_project.settings', '--option_b=foo']
+ args = ["test", "--settings=test_project.settings", "--option_b=foo"]
out, err = self.run_django_admin(args)
self.assertNoOutput(err)
- self.assertOutput(out, '1:foo:3')
+ self.assertOutput(out, "1:foo:3")
def test_option_name_and_value_separated(self):
- args = ['test', '--settings=test_project.settings', '--option_b', 'foo']
+ args = ["test", "--settings=test_project.settings", "--option_b", "foo"]
out, err = self.run_django_admin(args)
self.assertNoOutput(err)
- self.assertOutput(out, '1:foo:3')
+ self.assertOutput(out, "1:foo:3")
def test_all_options_given(self):
- args = ['test', '--settings=test_project.settings', '--option_a=bar',
- '--option_b=foo', '--option_c=31337']
+ args = [
+ "test",
+ "--settings=test_project.settings",
+ "--option_a=bar",
+ "--option_b=foo",
+ "--option_c=31337",
+ ]
out, err = self.run_django_admin(args)
self.assertNoOutput(err)
- self.assertOutput(out, 'bar:foo:31337')
+ self.assertOutput(out, "bar:foo:31337")
class CustomTestRunnerOptionsCmdlineTests(AdminScriptTestCase):
@@ -505,54 +603,64 @@ class CustomTestRunnerOptionsCmdlineTests(AdminScriptTestCase):
Custom runners can add command line arguments when the runner is specified
using --testrunner.
"""
+
def setUp(self):
super().setUp()
- self.write_settings('settings.py')
+ self.write_settings("settings.py")
def test_testrunner_option(self):
args = [
- 'test', '--testrunner', 'test_runner.runner.CustomOptionsTestRunner',
- '--option_a=bar', '--option_b=foo', '--option_c=31337'
+ "test",
+ "--testrunner",
+ "test_runner.runner.CustomOptionsTestRunner",
+ "--option_a=bar",
+ "--option_b=foo",
+ "--option_c=31337",
]
- out, err = self.run_django_admin(args, 'test_project.settings')
+ out, err = self.run_django_admin(args, "test_project.settings")
self.assertNoOutput(err)
- self.assertOutput(out, 'bar:foo:31337')
+ self.assertOutput(out, "bar:foo:31337")
def test_testrunner_equals(self):
args = [
- 'test', '--testrunner=test_runner.runner.CustomOptionsTestRunner',
- '--option_a=bar', '--option_b=foo', '--option_c=31337'
+ "test",
+ "--testrunner=test_runner.runner.CustomOptionsTestRunner",
+ "--option_a=bar",
+ "--option_b=foo",
+ "--option_c=31337",
]
- out, err = self.run_django_admin(args, 'test_project.settings')
+ out, err = self.run_django_admin(args, "test_project.settings")
self.assertNoOutput(err)
- self.assertOutput(out, 'bar:foo:31337')
+ self.assertOutput(out, "bar:foo:31337")
def test_no_testrunner(self):
- args = ['test', '--testrunner']
- out, err = self.run_django_admin(args, 'test_project.settings')
- self.assertIn('usage', err)
- self.assertNotIn('Traceback', err)
+ args = ["test", "--testrunner"]
+ out, err = self.run_django_admin(args, "test_project.settings")
+ self.assertIn("usage", err)
+ self.assertNotIn("Traceback", err)
self.assertNoOutput(out)
class Ticket17477RegressionTests(AdminScriptTestCase):
def setUp(self):
super().setUp()
- self.write_settings('settings.py')
+ self.write_settings("settings.py")
def test_ticket_17477(self):
"""'manage.py help test' works after r16352."""
- args = ['help', 'test']
+ args = ["help", "test"]
out, err = self.run_manage(args)
self.assertNoOutput(err)
class SQLiteInMemoryTestDbs(TransactionTestCase):
- available_apps = ['test_runner']
- databases = {'default', 'other'}
+ available_apps = ["test_runner"]
+ databases = {"default", "other"}
- @unittest.skipUnless(all(db.connections[conn].vendor == 'sqlite' for conn in db.connections),
- "This is an sqlite-specific issue")
+ @unittest.skipUnless(
+ all(db.connections[conn].vendor == "sqlite" for conn in db.connections),
+ "This is an sqlite-specific issue",
+ )
def test_transaction_support(self):
# Assert connections mocking is appropriately applied by preventing
# any attempts at calling create_test_db on the global connection
@@ -560,29 +668,36 @@ class SQLiteInMemoryTestDbs(TransactionTestCase):
for connection in db.connections.all():
create_test_db = mock.patch.object(
connection.creation,
- 'create_test_db',
- side_effect=AssertionError("Global connection object shouldn't be manipulated.")
+ "create_test_db",
+ side_effect=AssertionError(
+ "Global connection object shouldn't be manipulated."
+ ),
)
create_test_db.start()
self.addCleanup(create_test_db.stop)
for option_key, option_value in (
- ('NAME', ':memory:'), ('TEST', {'NAME': ':memory:'})):
- tested_connections = db.ConnectionHandler({
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- option_key: option_value,
- },
- 'other': {
- 'ENGINE': 'django.db.backends.sqlite3',
- option_key: option_value,
- },
- })
- with mock.patch('django.test.utils.connections', new=tested_connections):
- other = tested_connections['other']
+ ("NAME", ":memory:"),
+ ("TEST", {"NAME": ":memory:"}),
+ ):
+ tested_connections = db.ConnectionHandler(
+ {
+ "default": {
+ "ENGINE": "django.db.backends.sqlite3",
+ option_key: option_value,
+ },
+ "other": {
+ "ENGINE": "django.db.backends.sqlite3",
+ option_key: option_value,
+ },
+ }
+ )
+ with mock.patch("django.test.utils.connections", new=tested_connections):
+ other = tested_connections["other"]
DiscoverRunner(verbosity=0).setup_databases()
msg = (
"DATABASES setting '%s' option set to sqlite3's ':memory:' value "
- "shouldn't interfere with transaction support detection." % option_key
+ "shouldn't interfere with transaction support detection."
+ % option_key
)
# Transaction support is properly initialized for the 'other' DB.
self.assertTrue(other.features.supports_transactions, msg)
@@ -596,7 +711,7 @@ class DummyBackendTest(unittest.TestCase):
setup_databases() doesn't fail with dummy database backend.
"""
tested_connections = db.ConnectionHandler({})
- with mock.patch('django.test.utils.connections', new=tested_connections):
+ with mock.patch("django.test.utils.connections", new=tested_connections):
runner_instance = DiscoverRunner(verbosity=0)
old_config = runner_instance.setup_databases()
runner_instance.teardown_databases(old_config)
@@ -607,110 +722,126 @@ class AliasedDefaultTestSetupTest(unittest.TestCase):
"""
setup_databases() doesn't fail when 'default' is aliased
"""
- tested_connections = db.ConnectionHandler({
- 'default': {
- 'NAME': 'dummy'
- },
- 'aliased': {
- 'NAME': 'dummy'
- }
- })
- with mock.patch('django.test.utils.connections', new=tested_connections):
+ tested_connections = db.ConnectionHandler(
+ {"default": {"NAME": "dummy"}, "aliased": {"NAME": "dummy"}}
+ )
+ with mock.patch("django.test.utils.connections", new=tested_connections):
runner_instance = DiscoverRunner(verbosity=0)
old_config = runner_instance.setup_databases()
runner_instance.teardown_databases(old_config)
class SetupDatabasesTests(SimpleTestCase):
-
def setUp(self):
self.runner_instance = DiscoverRunner(verbosity=0)
def test_setup_aliased_databases(self):
- tested_connections = db.ConnectionHandler({
- 'default': {
- 'ENGINE': 'django.db.backends.dummy',
- 'NAME': 'dbname',
- },
- 'other': {
- 'ENGINE': 'django.db.backends.dummy',
- 'NAME': 'dbname',
+ tested_connections = db.ConnectionHandler(
+ {
+ "default": {
+ "ENGINE": "django.db.backends.dummy",
+ "NAME": "dbname",
+ },
+ "other": {
+ "ENGINE": "django.db.backends.dummy",
+ "NAME": "dbname",
+ },
}
- })
+ )
- with mock.patch('django.db.backends.dummy.base.DatabaseWrapper.creation_class') as mocked_db_creation:
- with mock.patch('django.test.utils.connections', new=tested_connections):
+ with mock.patch(
+ "django.db.backends.dummy.base.DatabaseWrapper.creation_class"
+ ) as mocked_db_creation:
+ with mock.patch("django.test.utils.connections", new=tested_connections):
old_config = self.runner_instance.setup_databases()
self.runner_instance.teardown_databases(old_config)
- mocked_db_creation.return_value.destroy_test_db.assert_called_once_with('dbname', 0, False)
+ mocked_db_creation.return_value.destroy_test_db.assert_called_once_with(
+ "dbname", 0, False
+ )
def test_setup_test_database_aliases(self):
"""
The default database must be the first because data migrations
use the default alias by default.
"""
- tested_connections = db.ConnectionHandler({
- 'other': {
- 'ENGINE': 'django.db.backends.dummy',
- 'NAME': 'dbname',
- },
- 'default': {
- 'ENGINE': 'django.db.backends.dummy',
- 'NAME': 'dbname',
+ tested_connections = db.ConnectionHandler(
+ {
+ "other": {
+ "ENGINE": "django.db.backends.dummy",
+ "NAME": "dbname",
+ },
+ "default": {
+ "ENGINE": "django.db.backends.dummy",
+ "NAME": "dbname",
+ },
}
- })
- with mock.patch('django.test.utils.connections', new=tested_connections):
+ )
+ with mock.patch("django.test.utils.connections", new=tested_connections):
test_databases, _ = get_unique_databases_and_mirrors()
self.assertEqual(
test_databases,
{
- ('', '', 'django.db.backends.dummy', 'test_dbname'): (
- 'dbname',
- ['default', 'other'],
+ ("", "", "django.db.backends.dummy", "test_dbname"): (
+ "dbname",
+ ["default", "other"],
),
},
)
def test_destroy_test_db_restores_db_name(self):
- tested_connections = db.ConnectionHandler({
- 'default': {
- 'ENGINE': settings.DATABASES[db.DEFAULT_DB_ALIAS]["ENGINE"],
- 'NAME': 'xxx_test_database',
- },
- })
+ tested_connections = db.ConnectionHandler(
+ {
+ "default": {
+ "ENGINE": settings.DATABASES[db.DEFAULT_DB_ALIAS]["ENGINE"],
+ "NAME": "xxx_test_database",
+ },
+ }
+ )
# Using the real current name as old_name to not mess with the test suite.
old_name = settings.DATABASES[db.DEFAULT_DB_ALIAS]["NAME"]
- with mock.patch('django.db.connections', new=tested_connections):
- tested_connections['default'].creation.destroy_test_db(old_name, verbosity=0, keepdb=True)
- self.assertEqual(tested_connections['default'].settings_dict["NAME"], old_name)
+ with mock.patch("django.db.connections", new=tested_connections):
+ tested_connections["default"].creation.destroy_test_db(
+ old_name, verbosity=0, keepdb=True
+ )
+ self.assertEqual(
+ tested_connections["default"].settings_dict["NAME"], old_name
+ )
def test_serialization(self):
- tested_connections = db.ConnectionHandler({
- 'default': {
- 'ENGINE': 'django.db.backends.dummy',
- },
- })
- with mock.patch('django.db.backends.dummy.base.DatabaseWrapper.creation_class') as mocked_db_creation:
- with mock.patch('django.test.utils.connections', new=tested_connections):
+ tested_connections = db.ConnectionHandler(
+ {
+ "default": {
+ "ENGINE": "django.db.backends.dummy",
+ },
+ }
+ )
+ with mock.patch(
+ "django.db.backends.dummy.base.DatabaseWrapper.creation_class"
+ ) as mocked_db_creation:
+ with mock.patch("django.test.utils.connections", new=tested_connections):
self.runner_instance.setup_databases()
mocked_db_creation.return_value.create_test_db.assert_called_once_with(
verbosity=0, autoclobber=False, serialize=True, keepdb=False
)
def test_serialized_off(self):
- tested_connections = db.ConnectionHandler({
- 'default': {
- 'ENGINE': 'django.db.backends.dummy',
- 'TEST': {'SERIALIZE': False},
- },
- })
+ tested_connections = db.ConnectionHandler(
+ {
+ "default": {
+ "ENGINE": "django.db.backends.dummy",
+ "TEST": {"SERIALIZE": False},
+ },
+ }
+ )
msg = (
- 'The SERIALIZE test database setting is deprecated as it can be '
- 'inferred from the TestCase/TransactionTestCase.databases that '
- 'enable the serialized_rollback feature.'
+ "The SERIALIZE test database setting is deprecated as it can be "
+ "inferred from the TestCase/TransactionTestCase.databases that "
+ "enable the serialized_rollback feature."
)
- with mock.patch('django.db.backends.dummy.base.DatabaseWrapper.creation_class') as mocked_db_creation:
- with mock.patch('django.test.utils.connections', new=tested_connections):
+ with mock.patch(
+ "django.db.backends.dummy.base.DatabaseWrapper.creation_class"
+ ) as mocked_db_creation:
+ with mock.patch("django.test.utils.connections", new=tested_connections):
with self.assertWarnsMessage(RemovedInDjango50Warning, msg):
self.runner_instance.setup_databases()
mocked_db_creation.return_value.create_test_db.assert_called_once_with(
@@ -718,23 +849,23 @@ class SetupDatabasesTests(SimpleTestCase):
)
-@skipUnlessDBFeature('supports_sequence_reset')
+@skipUnlessDBFeature("supports_sequence_reset")
class AutoIncrementResetTest(TransactionTestCase):
"""
Creating the same models in different test methods receive the same PK
values since the sequences are reset before each test method.
"""
- available_apps = ['test_runner']
+ available_apps = ["test_runner"]
reset_sequences = True
def _test(self):
# Regular model
- p = Person.objects.create(first_name='Jack', last_name='Smith')
+ p = Person.objects.create(first_name="Jack", last_name="Smith")
self.assertEqual(p.pk, 1)
# Auto-created many-to-many through model
- p.friends.add(Person.objects.create(first_name='Jacky', last_name='Smith'))
+ p.friends.add(Person.objects.create(first_name="Jacky", last_name="Smith"))
self.assertEqual(p.friends.through.objects.first().pk, 1)
# Many-to-many through model
b = B.objects.create()
@@ -754,10 +885,12 @@ class EmptyDefaultDatabaseTest(unittest.TestCase):
An empty default database in settings does not raise an ImproperlyConfigured
error when running a unit test that does not use a database.
"""
- tested_connections = db.ConnectionHandler({'default': {}})
- with mock.patch('django.db.connections', new=tested_connections):
+ tested_connections = db.ConnectionHandler({"default": {}})
+ with mock.patch("django.db.connections", new=tested_connections):
connection = tested_connections[db.utils.DEFAULT_DB_ALIAS]
- self.assertEqual(connection.settings_dict['ENGINE'], 'django.db.backends.dummy')
+ self.assertEqual(
+ connection.settings_dict["ENGINE"], "django.db.backends.dummy"
+ )
connections_support_transactions()
@@ -766,15 +899,22 @@ class RunTestsExceptionHandlingTests(unittest.TestCase):
"""
Teardown functions are run when run_checks() raises SystemCheckError.
"""
- with mock.patch('django.test.runner.DiscoverRunner.setup_test_environment'), \
- mock.patch('django.test.runner.DiscoverRunner.setup_databases'), \
- mock.patch('django.test.runner.DiscoverRunner.build_suite'), \
- mock.patch('django.test.runner.DiscoverRunner.run_checks', side_effect=SystemCheckError), \
- mock.patch('django.test.runner.DiscoverRunner.teardown_databases') as teardown_databases, \
- mock.patch('django.test.runner.DiscoverRunner.teardown_test_environment') as teardown_test_environment:
+ with mock.patch(
+ "django.test.runner.DiscoverRunner.setup_test_environment"
+ ), mock.patch("django.test.runner.DiscoverRunner.setup_databases"), mock.patch(
+ "django.test.runner.DiscoverRunner.build_suite"
+ ), mock.patch(
+ "django.test.runner.DiscoverRunner.run_checks", side_effect=SystemCheckError
+ ), mock.patch(
+ "django.test.runner.DiscoverRunner.teardown_databases"
+ ) as teardown_databases, mock.patch(
+ "django.test.runner.DiscoverRunner.teardown_test_environment"
+ ) as teardown_test_environment:
runner = DiscoverRunner(verbosity=0, interactive=False)
with self.assertRaises(SystemCheckError):
- runner.run_tests(['test_runner_apps.sample.tests_sample.TestDjangoTestCase'])
+ runner.run_tests(
+ ["test_runner_apps.sample.tests_sample.TestDjangoTestCase"]
+ )
self.assertTrue(teardown_databases.called)
self.assertTrue(teardown_test_environment.called)
@@ -783,16 +923,23 @@ class RunTestsExceptionHandlingTests(unittest.TestCase):
SystemCheckError is surfaced when run_checks() raises SystemCheckError
and teardown databases() raises ValueError.
"""
- with mock.patch('django.test.runner.DiscoverRunner.setup_test_environment'), \
- mock.patch('django.test.runner.DiscoverRunner.setup_databases'), \
- mock.patch('django.test.runner.DiscoverRunner.build_suite'), \
- mock.patch('django.test.runner.DiscoverRunner.run_checks', side_effect=SystemCheckError), \
- mock.patch('django.test.runner.DiscoverRunner.teardown_databases', side_effect=ValueError) \
- as teardown_databases, \
- mock.patch('django.test.runner.DiscoverRunner.teardown_test_environment') as teardown_test_environment:
+ with mock.patch(
+ "django.test.runner.DiscoverRunner.setup_test_environment"
+ ), mock.patch("django.test.runner.DiscoverRunner.setup_databases"), mock.patch(
+ "django.test.runner.DiscoverRunner.build_suite"
+ ), mock.patch(
+ "django.test.runner.DiscoverRunner.run_checks", side_effect=SystemCheckError
+ ), mock.patch(
+ "django.test.runner.DiscoverRunner.teardown_databases",
+ side_effect=ValueError,
+ ) as teardown_databases, mock.patch(
+ "django.test.runner.DiscoverRunner.teardown_test_environment"
+ ) as teardown_test_environment:
runner = DiscoverRunner(verbosity=0, interactive=False)
with self.assertRaises(SystemCheckError):
- runner.run_tests(['test_runner_apps.sample.tests_sample.TestDjangoTestCase'])
+ runner.run_tests(
+ ["test_runner_apps.sample.tests_sample.TestDjangoTestCase"]
+ )
self.assertTrue(teardown_databases.called)
self.assertFalse(teardown_test_environment.called)
@@ -801,18 +948,25 @@ class RunTestsExceptionHandlingTests(unittest.TestCase):
Exceptions on teardown are surfaced if no exceptions happen during
run_checks().
"""
- with mock.patch('django.test.runner.DiscoverRunner.setup_test_environment'), \
- mock.patch('django.test.runner.DiscoverRunner.setup_databases'), \
- mock.patch('django.test.runner.DiscoverRunner.build_suite'), \
- mock.patch('django.test.runner.DiscoverRunner.run_checks'), \
- mock.patch('django.test.runner.DiscoverRunner.teardown_databases', side_effect=ValueError) \
- as teardown_databases, \
- mock.patch('django.test.runner.DiscoverRunner.teardown_test_environment') as teardown_test_environment:
+ with mock.patch(
+ "django.test.runner.DiscoverRunner.setup_test_environment"
+ ), mock.patch("django.test.runner.DiscoverRunner.setup_databases"), mock.patch(
+ "django.test.runner.DiscoverRunner.build_suite"
+ ), mock.patch(
+ "django.test.runner.DiscoverRunner.run_checks"
+ ), mock.patch(
+ "django.test.runner.DiscoverRunner.teardown_databases",
+ side_effect=ValueError,
+ ) as teardown_databases, mock.patch(
+ "django.test.runner.DiscoverRunner.teardown_test_environment"
+ ) as teardown_test_environment:
runner = DiscoverRunner(verbosity=0, interactive=False)
with self.assertRaises(ValueError):
# Suppress the output when running TestDjangoTestCase.
- with mock.patch('sys.stderr'):
- runner.run_tests(['test_runner_apps.sample.tests_sample.TestDjangoTestCase'])
+ with mock.patch("sys.stderr"):
+ runner.run_tests(
+ ["test_runner_apps.sample.tests_sample.TestDjangoTestCase"]
+ )
self.assertTrue(teardown_databases.called)
self.assertFalse(teardown_test_environment.called)
@@ -836,7 +990,7 @@ class NoOpTestRunner(DiscoverRunner):
class DiscoverRunnerExtraTestsDeprecationTests(SimpleTestCase):
- msg = 'The extra_tests argument is deprecated.'
+ msg = "The extra_tests argument is deprecated."
def get_runner(self):
return NoOpTestRunner(verbosity=0, interactive=False)
@@ -851,6 +1005,6 @@ class DiscoverRunnerExtraTestsDeprecationTests(SimpleTestCase):
with captured_stderr():
with self.assertWarnsMessage(RemovedInDjango50Warning, self.msg):
runner.run_tests(
- test_labels=['test_runner_apps.sample.tests_sample.EmptyTestCase'],
+ test_labels=["test_runner_apps.sample.tests_sample.EmptyTestCase"],
extra_tests=[],
)