summaryrefslogtreecommitdiff
path: root/tests/test_runner/test_discover_runner.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_runner/test_discover_runner.py')
-rw-r--r--tests/test_runner/test_discover_runner.py557
1 files changed, 328 insertions, 229 deletions
diff --git a/tests/test_runner/test_discover_runner.py b/tests/test_runner/test_discover_runner.py
index dedc36aeb7..f264ad52f8 100644
--- a/tests/test_runner/test_discover_runner.py
+++ b/tests/test_runner/test_discover_runner.py
@@ -11,7 +11,10 @@ from django.db import connections
from django.test import SimpleTestCase
from django.test.runner import DiscoverRunner, get_max_test_processes
from django.test.utils import (
- NullTimeKeeper, TimeKeeper, captured_stderr, captured_stdout,
+ NullTimeKeeper,
+ TimeKeeper,
+ captured_stderr,
+ captured_stdout,
)
@@ -39,9 +42,9 @@ def change_loader_patterns(patterns):
# 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 DiscoverRunnerParallelArgumentTests(SimpleTestCase):
def get_parser(self):
parser = ArgumentParser()
@@ -53,47 +56,45 @@ class DiscoverRunnerParallelArgumentTests(SimpleTestCase):
self.assertEqual(result.parallel, 0)
def test_parallel_flag(self, *mocked_objects):
- result = self.get_parser().parse_args(['--parallel'])
- self.assertEqual(result.parallel, 'auto')
+ result = self.get_parser().parse_args(["--parallel"])
+ self.assertEqual(result.parallel, "auto")
def test_parallel_auto(self, *mocked_objects):
- result = self.get_parser().parse_args(['--parallel', 'auto'])
- self.assertEqual(result.parallel, 'auto')
+ result = self.get_parser().parse_args(["--parallel", "auto"])
+ self.assertEqual(result.parallel, "auto")
def test_parallel_count(self, *mocked_objects):
- result = self.get_parser().parse_args(['--parallel', '17'])
+ 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'])
+ self.get_parser().parse_args(["--parallel", "unaccepted"])
msg = "argument --parallel: 'unaccepted' is not an integer or the string 'auto'"
self.assertIn(msg, stderr.getvalue())
def test_get_max_test_processes(self, *mocked_objects):
self.assertEqual(get_max_test_processes(), 12)
- @mock.patch.dict(os.environ, {'DJANGO_TEST_PROCESSES': '7'})
+ @mock.patch.dict(os.environ, {"DJANGO_TEST_PROCESSES": "7"})
def test_get_max_test_processes_env_var(self, *mocked_objects):
self.assertEqual(get_max_test_processes(), 7)
def test_get_max_test_processes_spawn(
- self, mocked_get_start_method, mocked_cpu_count,
+ self,
+ mocked_get_start_method,
+ mocked_cpu_count,
):
- mocked_get_start_method.return_value = 'spawn'
+ mocked_get_start_method.return_value = "spawn"
self.assertEqual(get_max_test_processes(), 1)
- with mock.patch.dict(os.environ, {'DJANGO_TEST_PROCESSES': '7'}):
+ with mock.patch.dict(os.environ, {"DJANGO_TEST_PROCESSES": "7"}):
self.assertEqual(get_max_test_processes(), 1)
class DiscoverRunnerTests(SimpleTestCase):
-
@staticmethod
def get_test_methods_names(suite):
- return [
- t.__class__.__name__ + '.' + t._testMethodName
- for t in suite._tests
- ]
+ return [t.__class__.__name__ + "." + t._testMethodName for t in suite._tests]
def test_init_debug_mode(self):
runner = DiscoverRunner()
@@ -104,9 +105,9 @@ class DiscoverRunnerTests(SimpleTestCase):
DiscoverRunner.add_arguments(parser)
ns = parser.parse_args([])
self.assertIs(ns.shuffle, False)
- ns = parser.parse_args(['--shuffle'])
+ ns = parser.parse_args(["--shuffle"])
self.assertIsNone(ns.shuffle)
- ns = parser.parse_args(['--shuffle', '5'])
+ ns = parser.parse_args(["--shuffle", "5"])
self.assertEqual(ns.shuffle, 5)
def test_add_arguments_debug_mode(self):
@@ -127,10 +128,10 @@ class DiscoverRunnerTests(SimpleTestCase):
def test_setup_shuffler_shuffle_none(self):
runner = DiscoverRunner(shuffle=None)
self.assertIsNone(runner.shuffle)
- with mock.patch('random.randint', return_value=1):
+ with mock.patch("random.randint", return_value=1):
with captured_stdout() as stdout:
runner.setup_shuffler()
- self.assertEqual(stdout.getvalue(), 'Using shuffle seed: 1 (generated)\n')
+ self.assertEqual(stdout.getvalue(), "Using shuffle seed: 1 (generated)\n")
self.assertEqual(runner.shuffle_seed, 1)
def test_setup_shuffler_shuffle_int(self):
@@ -138,111 +139,143 @@ class DiscoverRunnerTests(SimpleTestCase):
self.assertEqual(runner.shuffle, 2)
with captured_stdout() as stdout:
runner.setup_shuffler()
- expected_out = 'Using shuffle seed: 2 (given)\n'
+ expected_out = "Using shuffle seed: 2 (given)\n"
self.assertEqual(stdout.getvalue(), expected_out)
self.assertEqual(runner.shuffle_seed, 2)
def test_load_tests_for_label_file_path(self):
- with change_cwd('.'):
+ with change_cwd("."):
msg = (
"One of the test labels is a path to a file: "
"'test_discover_runner.py', which is not supported. Use a "
"dotted module name or path to a directory instead."
)
with self.assertRaisesMessage(RuntimeError, msg):
- DiscoverRunner().load_tests_for_label('test_discover_runner.py', {})
+ DiscoverRunner().load_tests_for_label("test_discover_runner.py", {})
def test_dotted_test_module(self):
- count = DiscoverRunner(verbosity=0).build_suite(
- ['test_runner_apps.sample.tests_sample'],
- ).countTestCases()
+ count = (
+ DiscoverRunner(verbosity=0)
+ .build_suite(
+ ["test_runner_apps.sample.tests_sample"],
+ )
+ .countTestCases()
+ )
self.assertEqual(count, 4)
def test_dotted_test_class_vanilla_unittest(self):
- count = DiscoverRunner(verbosity=0).build_suite(
- ['test_runner_apps.sample.tests_sample.TestVanillaUnittest'],
- ).countTestCases()
+ count = (
+ DiscoverRunner(verbosity=0)
+ .build_suite(
+ ["test_runner_apps.sample.tests_sample.TestVanillaUnittest"],
+ )
+ .countTestCases()
+ )
self.assertEqual(count, 1)
def test_dotted_test_class_django_testcase(self):
- count = DiscoverRunner(verbosity=0).build_suite(
- ['test_runner_apps.sample.tests_sample.TestDjangoTestCase'],
- ).countTestCases()
+ count = (
+ DiscoverRunner(verbosity=0)
+ .build_suite(
+ ["test_runner_apps.sample.tests_sample.TestDjangoTestCase"],
+ )
+ .countTestCases()
+ )
self.assertEqual(count, 1)
def test_dotted_test_method_django_testcase(self):
- count = DiscoverRunner(verbosity=0).build_suite(
- ['test_runner_apps.sample.tests_sample.TestDjangoTestCase.test_sample'],
- ).countTestCases()
+ count = (
+ DiscoverRunner(verbosity=0)
+ .build_suite(
+ ["test_runner_apps.sample.tests_sample.TestDjangoTestCase.test_sample"],
+ )
+ .countTestCases()
+ )
self.assertEqual(count, 1)
def test_pattern(self):
- count = DiscoverRunner(
- pattern="*_tests.py",
- verbosity=0,
- ).build_suite(['test_runner_apps.sample']).countTestCases()
+ count = (
+ DiscoverRunner(
+ pattern="*_tests.py",
+ verbosity=0,
+ )
+ .build_suite(["test_runner_apps.sample"])
+ .countTestCases()
+ )
self.assertEqual(count, 1)
def test_name_patterns(self):
all_test_1 = [
- 'DjangoCase1.test_1', 'DjangoCase2.test_1',
- 'SimpleCase1.test_1', 'SimpleCase2.test_1',
- 'UnittestCase1.test_1', 'UnittestCase2.test_1',
+ "DjangoCase1.test_1",
+ "DjangoCase2.test_1",
+ "SimpleCase1.test_1",
+ "SimpleCase2.test_1",
+ "UnittestCase1.test_1",
+ "UnittestCase2.test_1",
]
all_test_2 = [
- 'DjangoCase1.test_2', 'DjangoCase2.test_2',
- 'SimpleCase1.test_2', 'SimpleCase2.test_2',
- 'UnittestCase1.test_2', 'UnittestCase2.test_2',
+ "DjangoCase1.test_2",
+ "DjangoCase2.test_2",
+ "SimpleCase1.test_2",
+ "SimpleCase2.test_2",
+ "UnittestCase1.test_2",
+ "UnittestCase2.test_2",
]
- all_tests = sorted([*all_test_1, *all_test_2, 'UnittestCase2.test_3_test'])
+ all_tests = sorted([*all_test_1, *all_test_2, "UnittestCase2.test_3_test"])
for pattern, expected in [
- [['test_1'], all_test_1],
- [['UnittestCase1'], ['UnittestCase1.test_1', 'UnittestCase1.test_2']],
- [['*test'], ['UnittestCase2.test_3_test']],
- [['test*'], all_tests],
- [['test'], all_tests],
- [['test_1', 'test_2'], sorted([*all_test_1, *all_test_2])],
- [['test*1'], all_test_1],
+ [["test_1"], all_test_1],
+ [["UnittestCase1"], ["UnittestCase1.test_1", "UnittestCase1.test_2"]],
+ [["*test"], ["UnittestCase2.test_3_test"]],
+ [["test*"], all_tests],
+ [["test"], all_tests],
+ [["test_1", "test_2"], sorted([*all_test_1, *all_test_2])],
+ [["test*1"], all_test_1],
]:
with self.subTest(pattern):
suite = DiscoverRunner(
test_name_patterns=pattern,
verbosity=0,
- ).build_suite(['test_runner_apps.simple'])
+ ).build_suite(["test_runner_apps.simple"])
self.assertEqual(expected, self.get_test_methods_names(suite))
def test_loader_patterns_not_mutated(self):
- runner = DiscoverRunner(test_name_patterns=['test_sample'], verbosity=0)
+ runner = DiscoverRunner(test_name_patterns=["test_sample"], verbosity=0)
tests = [
- ('test_runner_apps.sample.tests', 1),
- ('test_runner_apps.sample.tests.Test.test_sample', 1),
- ('test_runner_apps.sample.empty', 0),
- ('test_runner_apps.sample.tests_sample.EmptyTestCase', 0),
+ ("test_runner_apps.sample.tests", 1),
+ ("test_runner_apps.sample.tests.Test.test_sample", 1),
+ ("test_runner_apps.sample.empty", 0),
+ ("test_runner_apps.sample.tests_sample.EmptyTestCase", 0),
]
for test_labels, tests_count in tests:
with self.subTest(test_labels=test_labels):
- with change_loader_patterns(['UnittestCase1']):
+ with change_loader_patterns(["UnittestCase1"]):
count = runner.build_suite([test_labels]).countTestCases()
self.assertEqual(count, tests_count)
- self.assertEqual(runner.test_loader.testNamePatterns, ['UnittestCase1'])
+ self.assertEqual(
+ runner.test_loader.testNamePatterns, ["UnittestCase1"]
+ )
def test_loader_patterns_not_mutated_when_test_label_is_file_path(self):
- runner = DiscoverRunner(test_name_patterns=['test_sample'], verbosity=0)
- with change_cwd('.'), change_loader_patterns(['UnittestCase1']):
+ runner = DiscoverRunner(test_name_patterns=["test_sample"], verbosity=0)
+ with change_cwd("."), change_loader_patterns(["UnittestCase1"]):
with self.assertRaises(RuntimeError):
- runner.build_suite(['test_discover_runner.py'])
- self.assertEqual(runner.test_loader.testNamePatterns, ['UnittestCase1'])
+ runner.build_suite(["test_discover_runner.py"])
+ self.assertEqual(runner.test_loader.testNamePatterns, ["UnittestCase1"])
def test_file_path(self):
with change_cwd(".."):
- count = DiscoverRunner(verbosity=0).build_suite(
- ['test_runner_apps/sample/'],
- ).countTestCases()
+ count = (
+ DiscoverRunner(verbosity=0)
+ .build_suite(
+ ["test_runner_apps/sample/"],
+ )
+ .countTestCases()
+ )
self.assertEqual(count, 5)
@@ -259,16 +292,24 @@ class DiscoverRunnerTests(SimpleTestCase):
)
def test_empty_test_case(self):
- count = DiscoverRunner(verbosity=0).build_suite(
- ['test_runner_apps.sample.tests_sample.EmptyTestCase'],
- ).countTestCases()
+ count = (
+ DiscoverRunner(verbosity=0)
+ .build_suite(
+ ["test_runner_apps.sample.tests_sample.EmptyTestCase"],
+ )
+ .countTestCases()
+ )
self.assertEqual(count, 0)
def test_discovery_on_package(self):
- count = DiscoverRunner(verbosity=0).build_suite(
- ['test_runner_apps.sample.tests'],
- ).countTestCases()
+ count = (
+ DiscoverRunner(verbosity=0)
+ .build_suite(
+ ["test_runner_apps.sample.tests"],
+ )
+ .countTestCases()
+ )
self.assertEqual(count, 1)
@@ -280,34 +321,44 @@ class DiscoverRunnerTests(SimpleTestCase):
This results in tests from adjacent modules being run when they
should not. The discover runner avoids this behavior.
"""
- count = DiscoverRunner(verbosity=0).build_suite(
- ['test_runner_apps.sample.empty'],
- ).countTestCases()
+ count = (
+ DiscoverRunner(verbosity=0)
+ .build_suite(
+ ["test_runner_apps.sample.empty"],
+ )
+ .countTestCases()
+ )
self.assertEqual(count, 0)
def test_testcase_ordering(self):
with change_cwd(".."):
- suite = DiscoverRunner(verbosity=0).build_suite(['test_runner_apps/sample/'])
+ suite = DiscoverRunner(verbosity=0).build_suite(
+ ["test_runner_apps/sample/"]
+ )
self.assertEqual(
suite._tests[0].__class__.__name__,
- 'TestDjangoTestCase',
- msg="TestDjangoTestCase should be the first test case")
+ "TestDjangoTestCase",
+ msg="TestDjangoTestCase should be the first test case",
+ )
self.assertEqual(
suite._tests[1].__class__.__name__,
- 'TestZimpleTestCase',
- msg="TestZimpleTestCase should be the second test case")
+ "TestZimpleTestCase",
+ msg="TestZimpleTestCase should be the second test case",
+ )
# All others can follow in unspecified order, including doctests
- self.assertIn('DocTestCase', [t.__class__.__name__ for t in suite._tests[2:]])
+ self.assertIn(
+ "DocTestCase", [t.__class__.__name__ for t in suite._tests[2:]]
+ )
def test_duplicates_ignored(self):
"""
Tests shouldn't be discovered twice when discovering on overlapping paths.
"""
- base_app = 'forms_tests'
- sub_app = 'forms_tests.field_tests'
+ base_app = "forms_tests"
+ sub_app = "forms_tests.field_tests"
runner = DiscoverRunner(verbosity=0)
- with self.modify_settings(INSTALLED_APPS={'append': sub_app}):
+ with self.modify_settings(INSTALLED_APPS={"append": sub_app}):
single = runner.build_suite([base_app]).countTestCases()
dups = runner.build_suite([base_app, sub_app]).countTestCases()
self.assertEqual(single, dups)
@@ -319,32 +370,46 @@ class DiscoverRunnerTests(SimpleTestCase):
"""
runner = DiscoverRunner(reverse=True, verbosity=0)
suite = runner.build_suite(
- test_labels=('test_runner_apps.sample', 'test_runner_apps.simple'))
- self.assertIn('test_runner_apps.simple', next(iter(suite)).id(),
- msg="Test labels should be reversed.")
- suite = runner.build_suite(test_labels=('test_runner_apps.simple',))
+ test_labels=("test_runner_apps.sample", "test_runner_apps.simple")
+ )
+ self.assertIn(
+ "test_runner_apps.simple",
+ next(iter(suite)).id(),
+ msg="Test labels should be reversed.",
+ )
+ suite = runner.build_suite(test_labels=("test_runner_apps.simple",))
suite = tuple(suite)
- self.assertIn('DjangoCase', suite[0].id(),
- msg="Test groups should not be reversed.")
- self.assertIn('SimpleCase', suite[4].id(),
- msg="Test groups order should be preserved.")
- self.assertIn('DjangoCase2', suite[0].id(),
- msg="Django test cases should be reversed.")
- self.assertIn('SimpleCase2', suite[4].id(),
- msg="Simple test cases should be reversed.")
- self.assertIn('UnittestCase2', suite[8].id(),
- msg="Unittest test cases should be reversed.")
- self.assertIn('test_2', suite[0].id(),
- msg="Methods of Django cases should be reversed.")
- self.assertIn('test_2', suite[4].id(),
- msg="Methods of simple cases should be reversed.")
- self.assertIn('test_2', suite[9].id(),
- msg="Methods of unittest cases should be reversed.")
+ self.assertIn(
+ "DjangoCase", suite[0].id(), msg="Test groups should not be reversed."
+ )
+ self.assertIn(
+ "SimpleCase", suite[4].id(), msg="Test groups order should be preserved."
+ )
+ self.assertIn(
+ "DjangoCase2", suite[0].id(), msg="Django test cases should be reversed."
+ )
+ self.assertIn(
+ "SimpleCase2", suite[4].id(), msg="Simple test cases should be reversed."
+ )
+ self.assertIn(
+ "UnittestCase2",
+ suite[8].id(),
+ msg="Unittest test cases should be reversed.",
+ )
+ self.assertIn(
+ "test_2", suite[0].id(), msg="Methods of Django cases should be reversed."
+ )
+ self.assertIn(
+ "test_2", suite[4].id(), msg="Methods of simple cases should be reversed."
+ )
+ self.assertIn(
+ "test_2", suite[9].id(), msg="Methods of unittest cases should be reversed."
+ )
def test_build_suite_failed_tests_first(self):
# The "doesnotexist" label results in a _FailedTest instance.
suite = DiscoverRunner(verbosity=0).build_suite(
- test_labels=['test_runner_apps.sample', 'doesnotexist'],
+ test_labels=["test_runner_apps.sample", "doesnotexist"],
)
tests = list(suite)
self.assertIsInstance(tests[0], unittest.loader._FailedTest)
@@ -353,12 +418,12 @@ class DiscoverRunnerTests(SimpleTestCase):
def test_build_suite_shuffling(self):
# These will result in unittest.loader._FailedTest instances rather
# than TestCase objects, but they are sufficient for testing.
- labels = ['label1', 'label2', 'label3', 'label4']
+ labels = ["label1", "label2", "label3", "label4"]
cases = [
- ({}, ['label1', 'label2', 'label3', 'label4']),
- ({'reverse': True}, ['label4', 'label3', 'label2', 'label1']),
- ({'shuffle': 8}, ['label4', 'label1', 'label3', 'label2']),
- ({'shuffle': 8, 'reverse': True}, ['label2', 'label3', 'label1', 'label4']),
+ ({}, ["label1", "label2", "label3", "label4"]),
+ ({"reverse": True}, ["label4", "label3", "label2", "label1"]),
+ ({"shuffle": 8}, ["label4", "label1", "label3", "label2"]),
+ ({"shuffle": 8, "reverse": True}, ["label2", "label3", "label1", "label4"]),
]
for kwargs, expected in cases:
with self.subTest(kwargs=kwargs):
@@ -366,7 +431,7 @@ class DiscoverRunnerTests(SimpleTestCase):
runner = DiscoverRunner(**kwargs, verbosity=0)
tests = runner.build_suite(test_labels=labels)
# The ids have the form "unittest.loader._FailedTest.label1".
- names = [test.id().split('.')[-1] for test in tests]
+ names = [test.id().split(".")[-1] for test in tests]
self.assertEqual(names, expected)
def test_overridable_get_test_runner_kwargs(self):
@@ -382,78 +447,95 @@ class DiscoverRunnerTests(SimpleTestCase):
self.assertEqual(DiscoverRunner().test_loader, defaultTestLoader)
def test_tags(self):
- runner = DiscoverRunner(tags=['core'], verbosity=0)
- self.assertEqual(runner.build_suite(['test_runner_apps.tagged.tests']).countTestCases(), 1)
- runner = DiscoverRunner(tags=['fast'], verbosity=0)
- self.assertEqual(runner.build_suite(['test_runner_apps.tagged.tests']).countTestCases(), 2)
- runner = DiscoverRunner(tags=['slow'], verbosity=0)
- self.assertEqual(runner.build_suite(['test_runner_apps.tagged.tests']).countTestCases(), 2)
+ runner = DiscoverRunner(tags=["core"], verbosity=0)
+ self.assertEqual(
+ runner.build_suite(["test_runner_apps.tagged.tests"]).countTestCases(), 1
+ )
+ runner = DiscoverRunner(tags=["fast"], verbosity=0)
+ self.assertEqual(
+ runner.build_suite(["test_runner_apps.tagged.tests"]).countTestCases(), 2
+ )
+ runner = DiscoverRunner(tags=["slow"], verbosity=0)
+ self.assertEqual(
+ runner.build_suite(["test_runner_apps.tagged.tests"]).countTestCases(), 2
+ )
def test_exclude_tags(self):
- runner = DiscoverRunner(tags=['fast'], exclude_tags=['core'], verbosity=0)
- self.assertEqual(runner.build_suite(['test_runner_apps.tagged.tests']).countTestCases(), 1)
- runner = DiscoverRunner(tags=['fast'], exclude_tags=['slow'], verbosity=0)
- self.assertEqual(runner.build_suite(['test_runner_apps.tagged.tests']).countTestCases(), 0)
- runner = DiscoverRunner(exclude_tags=['slow'], verbosity=0)
- self.assertEqual(runner.build_suite(['test_runner_apps.tagged.tests']).countTestCases(), 0)
+ runner = DiscoverRunner(tags=["fast"], exclude_tags=["core"], verbosity=0)
+ self.assertEqual(
+ runner.build_suite(["test_runner_apps.tagged.tests"]).countTestCases(), 1
+ )
+ runner = DiscoverRunner(tags=["fast"], exclude_tags=["slow"], verbosity=0)
+ self.assertEqual(
+ runner.build_suite(["test_runner_apps.tagged.tests"]).countTestCases(), 0
+ )
+ runner = DiscoverRunner(exclude_tags=["slow"], verbosity=0)
+ self.assertEqual(
+ runner.build_suite(["test_runner_apps.tagged.tests"]).countTestCases(), 0
+ )
def test_tag_inheritance(self):
def count_tests(**kwargs):
- kwargs.setdefault('verbosity', 0)
- suite = DiscoverRunner(**kwargs).build_suite(['test_runner_apps.tagged.tests_inheritance'])
+ kwargs.setdefault("verbosity", 0)
+ suite = DiscoverRunner(**kwargs).build_suite(
+ ["test_runner_apps.tagged.tests_inheritance"]
+ )
return suite.countTestCases()
- self.assertEqual(count_tests(tags=['foo']), 4)
- self.assertEqual(count_tests(tags=['bar']), 2)
- self.assertEqual(count_tests(tags=['baz']), 2)
- self.assertEqual(count_tests(tags=['foo'], exclude_tags=['bar']), 2)
- self.assertEqual(count_tests(tags=['foo'], exclude_tags=['bar', 'baz']), 1)
- self.assertEqual(count_tests(exclude_tags=['foo']), 0)
+ self.assertEqual(count_tests(tags=["foo"]), 4)
+ self.assertEqual(count_tests(tags=["bar"]), 2)
+ self.assertEqual(count_tests(tags=["baz"]), 2)
+ self.assertEqual(count_tests(tags=["foo"], exclude_tags=["bar"]), 2)
+ self.assertEqual(count_tests(tags=["foo"], exclude_tags=["bar", "baz"]), 1)
+ self.assertEqual(count_tests(exclude_tags=["foo"]), 0)
def test_tag_fail_to_load(self):
with self.assertRaises(SyntaxError):
- import_module('test_runner_apps.tagged.tests_syntax_error')
- runner = DiscoverRunner(tags=['syntax_error'], verbosity=0)
+ import_module("test_runner_apps.tagged.tests_syntax_error")
+ runner = DiscoverRunner(tags=["syntax_error"], verbosity=0)
# A label that doesn't exist or cannot be loaded due to syntax errors
# is always considered matching.
- suite = runner.build_suite(['doesnotexist', 'test_runner_apps.tagged'])
- self.assertEqual([test.id() for test in suite], [
- 'unittest.loader._FailedTest.doesnotexist',
- 'unittest.loader._FailedTest.test_runner_apps.tagged.tests_syntax_error',
- ])
+ suite = runner.build_suite(["doesnotexist", "test_runner_apps.tagged"])
+ self.assertEqual(
+ [test.id() for test in suite],
+ [
+ "unittest.loader._FailedTest.doesnotexist",
+ "unittest.loader._FailedTest.test_runner_apps.tagged.tests_syntax_error",
+ ],
+ )
def test_included_tags_displayed(self):
- runner = DiscoverRunner(tags=['foo', 'bar'], verbosity=2)
+ runner = DiscoverRunner(tags=["foo", "bar"], verbosity=2)
with captured_stdout() as stdout:
- runner.build_suite(['test_runner_apps.tagged.tests'])
- self.assertIn('Including test tag(s): bar, foo.\n', stdout.getvalue())
+ runner.build_suite(["test_runner_apps.tagged.tests"])
+ self.assertIn("Including test tag(s): bar, foo.\n", stdout.getvalue())
def test_excluded_tags_displayed(self):
- runner = DiscoverRunner(exclude_tags=['foo', 'bar'], verbosity=3)
+ runner = DiscoverRunner(exclude_tags=["foo", "bar"], verbosity=3)
with captured_stdout() as stdout:
- runner.build_suite(['test_runner_apps.tagged.tests'])
- self.assertIn('Excluding test tag(s): bar, foo.\n', stdout.getvalue())
+ runner.build_suite(["test_runner_apps.tagged.tests"])
+ self.assertIn("Excluding test tag(s): bar, foo.\n", stdout.getvalue())
def test_number_of_tests_found_displayed(self):
runner = DiscoverRunner()
with captured_stdout() as stdout:
- runner.build_suite([
- 'test_runner_apps.sample.tests_sample.TestDjangoTestCase',
- 'test_runner_apps.simple',
- ])
- self.assertIn('Found 14 test(s).\n', stdout.getvalue())
+ runner.build_suite(
+ [
+ "test_runner_apps.sample.tests_sample.TestDjangoTestCase",
+ "test_runner_apps.simple",
+ ]
+ )
+ self.assertIn("Found 14 test(s).\n", stdout.getvalue())
def test_pdb_with_parallel(self):
- msg = (
- 'You cannot use --pdb with parallel tests; pass --parallel=1 to use it.'
- )
+ msg = "You cannot use --pdb with parallel tests; pass --parallel=1 to use it."
with self.assertRaisesMessage(ValueError, msg):
DiscoverRunner(pdb=True, parallel=2)
def test_number_of_parallel_workers(self):
"""Number of processes doesn't exceed the number of TestCases."""
runner = DiscoverRunner(parallel=5, verbosity=0)
- suite = runner.build_suite(['test_runner_apps.tagged'])
+ suite = runner.build_suite(["test_runner_apps.tagged"])
self.assertEqual(suite.processes, len(suite.subsuites))
def test_number_of_databases_parallel_test_suite(self):
@@ -462,7 +544,7 @@ class DiscoverRunnerTests(SimpleTestCase):
parallel tests.
"""
runner = DiscoverRunner(parallel=8, verbosity=0)
- 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(runner.parallel, suite.processes)
@@ -472,29 +554,33 @@ class DiscoverRunnerTests(SimpleTestCase):
non-parallel tests.
"""
runner = DiscoverRunner(parallel=8, verbosity=0)
- suite = runner.build_suite(['test_runner_apps.simple.tests.DjangoCase1'])
+ 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):
runner = DiscoverRunner(buffer=True, verbosity=0)
with captured_stdout() as stdout, captured_stderr() as stderr:
- suite = runner.build_suite([
- 'test_runner_apps.buffer.tests_buffer.WriteToStdoutStderrTestCase.test_pass',
- ])
+ suite = runner.build_suite(
+ [
+ "test_runner_apps.buffer.tests_buffer.WriteToStdoutStderrTestCase.test_pass",
+ ]
+ )
runner.run_suite(suite)
- self.assertNotIn('Write to stderr.', stderr.getvalue())
- self.assertNotIn('Write to stdout.', stdout.getvalue())
+ self.assertNotIn("Write to stderr.", stderr.getvalue())
+ self.assertNotIn("Write to stdout.", stdout.getvalue())
def test_buffer_mode_test_fail(self):
runner = DiscoverRunner(buffer=True, verbosity=0)
with captured_stdout() as stdout, captured_stderr() as stderr:
- suite = runner.build_suite([
- 'test_runner_apps.buffer.tests_buffer.WriteToStdoutStderrTestCase.test_fail',
- ])
+ suite = runner.build_suite(
+ [
+ "test_runner_apps.buffer.tests_buffer.WriteToStdoutStderrTestCase.test_fail",
+ ]
+ )
runner.run_suite(suite)
- self.assertIn('Write to stderr.', stderr.getvalue())
- self.assertIn('Write to stdout.', stdout.getvalue())
+ self.assertIn("Write to stderr.", stderr.getvalue())
+ self.assertIn("Write to stdout.", stdout.getvalue())
def run_suite_with_runner(self, runner_class, **kwargs):
class MyRunner(DiscoverRunner):
@@ -516,79 +602,82 @@ class DiscoverRunnerTests(SimpleTestCase):
def test_run_suite_logs_seed(self):
class TestRunner:
def run(self, suite):
- return '<fake-result>'
+ return "<fake-result>"
- expected_prefix = 'Used shuffle seed'
+ expected_prefix = "Used shuffle seed"
# Test with and without shuffling enabled.
result, output = self.run_suite_with_runner(TestRunner)
- self.assertEqual(result, '<fake-result>')
+ self.assertEqual(result, "<fake-result>")
self.assertNotIn(expected_prefix, output)
result, output = self.run_suite_with_runner(TestRunner, shuffle=2)
- self.assertEqual(result, '<fake-result>')
- expected_output = f'{expected_prefix}: 2 (given)\n'
+ self.assertEqual(result, "<fake-result>")
+ expected_output = f"{expected_prefix}: 2 (given)\n"
self.assertEqual(output, expected_output)
def test_run_suite_logs_seed_exception(self):
"""
run_suite() logs the seed when TestRunner.run() raises an exception.
"""
+
class TestRunner:
def run(self, suite):
- raise RuntimeError('my exception')
+ raise RuntimeError("my exception")
result, output = self.run_suite_with_runner(TestRunner, shuffle=2)
- self.assertEqual(result, 'my exception')
- expected_output = 'Used shuffle seed: 2 (given)\n'
+ self.assertEqual(result, "my exception")
+ expected_output = "Used shuffle seed: 2 (given)\n"
self.assertEqual(output, expected_output)
- @mock.patch('faulthandler.enable')
+ @mock.patch("faulthandler.enable")
def test_faulthandler_enabled(self, mocked_enable):
- with mock.patch('faulthandler.is_enabled', return_value=False):
+ with mock.patch("faulthandler.is_enabled", return_value=False):
DiscoverRunner(enable_faulthandler=True)
mocked_enable.assert_called()
- @mock.patch('faulthandler.enable')
+ @mock.patch("faulthandler.enable")
def test_faulthandler_already_enabled(self, mocked_enable):
- with mock.patch('faulthandler.is_enabled', return_value=True):
+ with mock.patch("faulthandler.is_enabled", return_value=True):
DiscoverRunner(enable_faulthandler=True)
mocked_enable.assert_not_called()
- @mock.patch('faulthandler.enable')
+ @mock.patch("faulthandler.enable")
def test_faulthandler_enabled_fileno(self, mocked_enable):
# sys.stderr that is not an actual file.
- with mock.patch('faulthandler.is_enabled', return_value=False), captured_stderr():
+ with mock.patch(
+ "faulthandler.is_enabled", return_value=False
+ ), captured_stderr():
DiscoverRunner(enable_faulthandler=True)
mocked_enable.assert_called()
- @mock.patch('faulthandler.enable')
+ @mock.patch("faulthandler.enable")
def test_faulthandler_disabled(self, mocked_enable):
- with mock.patch('faulthandler.is_enabled', return_value=False):
+ with mock.patch("faulthandler.is_enabled", return_value=False):
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'):
+ with runner.time_keeper.timed("test"):
pass
runner.time_keeper.print_results()
self.assertIsInstance(runner.time_keeper, NullTimeKeeper)
- self.assertNotIn('test', stderr.getvalue())
+ 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'):
+ with runner.time_keeper.timed("test"):
pass
runner.time_keeper.print_results()
self.assertIsInstance(runner.time_keeper, TimeKeeper)
- self.assertIn('test', stderr.getvalue())
+ self.assertIn("test", stderr.getvalue())
def test_log(self):
custom_low_level = 5
custom_high_level = 45
- msg = 'logging message'
+ msg = "logging message"
cases = [
(0, None, False),
(0, custom_low_level, False),
@@ -620,42 +709,44 @@ class DiscoverRunnerTests(SimpleTestCase):
with captured_stdout() as stdout:
runner = DiscoverRunner(verbosity=verbosity)
runner.log(msg, level)
- self.assertEqual(stdout.getvalue(), f'{msg}\n' if output else '')
+ self.assertEqual(stdout.getvalue(), f"{msg}\n" if output else "")
def test_log_logger(self):
- logger = logging.getLogger('test.logging')
+ logger = logging.getLogger("test.logging")
cases = [
- (None, 'INFO:test.logging:log message'),
+ (None, "INFO:test.logging:log message"),
# Test a low custom logging level.
- (5, 'Level 5:test.logging:log message'),
- (logging.DEBUG, 'DEBUG:test.logging:log message'),
- (logging.INFO, 'INFO:test.logging:log message'),
- (logging.WARNING, 'WARNING:test.logging:log message'),
+ (5, "Level 5:test.logging:log message"),
+ (logging.DEBUG, "DEBUG:test.logging:log message"),
+ (logging.INFO, "INFO:test.logging:log message"),
+ (logging.WARNING, "WARNING:test.logging:log message"),
# Test a high custom logging level.
- (45, 'Level 45:test.logging:log message'),
+ (45, "Level 45:test.logging:log message"),
]
for level, expected in cases:
with self.subTest(level=level):
runner = DiscoverRunner(logger=logger)
# Pass a logging level smaller than the smallest level in cases
# in order to capture all messages.
- with self.assertLogs('test.logging', level=1) as cm:
- runner.log('log message', level)
+ with self.assertLogs("test.logging", level=1) as cm:
+ runner.log("log message", level)
self.assertEqual(cm.output, [expected])
def test_suite_result_with_failure(self):
cases = [
- (1, 'FailureTestCase'),
- (1, 'ErrorTestCase'),
- (0, 'ExpectedFailureTestCase'),
- (1, 'UnexpectedSuccessTestCase'),
+ (1, "FailureTestCase"),
+ (1, "ErrorTestCase"),
+ (0, "ExpectedFailureTestCase"),
+ (1, "UnexpectedSuccessTestCase"),
]
runner = DiscoverRunner(verbosity=0)
for expected_failures, testcase in cases:
with self.subTest(testcase=testcase):
- suite = runner.build_suite([
- f'test_runner_apps.failures.tests_failures.{testcase}',
- ])
+ suite = runner.build_suite(
+ [
+ f"test_runner_apps.failures.tests_failures.{testcase}",
+ ]
+ )
with captured_stderr():
result = runner.run_suite(suite)
failures = runner.suite_result(suite, result)
@@ -664,7 +755,7 @@ class DiscoverRunnerTests(SimpleTestCase):
class DiscoverRunnerGetDatabasesTests(SimpleTestCase):
runner = DiscoverRunner(verbosity=2)
- skip_msg = 'Skipping setup of unused database(s): '
+ skip_msg = "Skipping setup of unused database(s): "
def get_databases(self, test_labels):
with captured_stdout() as stdout:
@@ -677,43 +768,51 @@ class DiscoverRunnerGetDatabasesTests(SimpleTestCase):
self.assertEqual(databases, expected_databases)
skipped_databases = set(connections) - set(expected_databases)
if skipped_databases:
- self.assertIn(self.skip_msg + ', '.join(sorted(skipped_databases)), output)
+ self.assertIn(self.skip_msg + ", ".join(sorted(skipped_databases)), output)
else:
self.assertNotIn(self.skip_msg, output)
def test_mixed(self):
- databases, output = self.get_databases(['test_runner_apps.databases.tests'])
- self.assertEqual(databases, {'default': True, 'other': False})
+ databases, output = self.get_databases(["test_runner_apps.databases.tests"])
+ self.assertEqual(databases, {"default": True, "other": False})
self.assertNotIn(self.skip_msg, output)
def test_all(self):
- databases, output = self.get_databases(['test_runner_apps.databases.tests.AllDatabasesTests'])
+ databases, output = self.get_databases(
+ ["test_runner_apps.databases.tests.AllDatabasesTests"]
+ )
self.assertEqual(databases, {alias: False for alias in connections})
self.assertNotIn(self.skip_msg, output)
def test_default_and_other(self):
- self.assertSkippedDatabases([
- 'test_runner_apps.databases.tests.DefaultDatabaseTests',
- 'test_runner_apps.databases.tests.OtherDatabaseTests',
- ], {'default': False, 'other': False})
+ self.assertSkippedDatabases(
+ [
+ "test_runner_apps.databases.tests.DefaultDatabaseTests",
+ "test_runner_apps.databases.tests.OtherDatabaseTests",
+ ],
+ {"default": False, "other": False},
+ )
def test_default_only(self):
- self.assertSkippedDatabases([
- 'test_runner_apps.databases.tests.DefaultDatabaseTests',
- ], {'default': False})
+ self.assertSkippedDatabases(
+ [
+ "test_runner_apps.databases.tests.DefaultDatabaseTests",
+ ],
+ {"default": False},
+ )
def test_other_only(self):
- self.assertSkippedDatabases([
- 'test_runner_apps.databases.tests.OtherDatabaseTests'
- ], {'other': False})
+ self.assertSkippedDatabases(
+ ["test_runner_apps.databases.tests.OtherDatabaseTests"], {"other": False}
+ )
def test_no_databases_required(self):
- self.assertSkippedDatabases([
- 'test_runner_apps.databases.tests.NoDatabaseTests'
- ], {})
+ self.assertSkippedDatabases(
+ ["test_runner_apps.databases.tests.NoDatabaseTests"], {}
+ )
def test_serialize(self):
- databases, _ = self.get_databases([
- 'test_runner_apps.databases.tests.DefaultDatabaseSerializedTests'
- ])
- self.assertEqual(databases, {'default': True})
+ databases, _ = self.get_databases(
+ ["test_runner_apps.databases.tests.DefaultDatabaseSerializedTests"]
+ )
+ self.assertEqual(databases, {"default": True})