diff options
| author | François Freitag <mail@franek.fr> | 2019-03-07 21:58:30 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-04-30 16:20:51 +0200 |
| commit | 568eed9e79470b9ddf3e1b3bbad9123ada45eae8 (patch) | |
| tree | 6606bd5bad518d0aed7f892148f4aa8fbf4188cf /tests | |
| parent | 719b7466203181066d9537d2e3bec687dffc9f41 (diff) | |
Fixed #30245 -- Added -k option to DiscoverRunner.
Diffstat (limited to 'tests')
| -rwxr-xr-x | tests/runtests.py | 16 | ||||
| -rw-r--r-- | tests/test_runner/test_discover_runner.py | 40 | ||||
| -rw-r--r-- | tests/test_runner_apps/simple/tests.py | 3 |
3 files changed, 55 insertions, 4 deletions
diff --git a/tests/runtests.py b/tests/runtests.py index a0b429b6df..96ec30d51a 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -28,6 +28,7 @@ else: RemovedInDjango31Warning, RemovedInDjango40Warning, ) from django.utils.log import DEFAULT_LOGGING + from django.utils.version import PY37 try: import MySQLdb @@ -271,7 +272,8 @@ class ActionSelenium(argparse.Action): def django_tests(verbosity, interactive, failfast, keepdb, reverse, - test_labels, debug_sql, parallel, tags, exclude_tags): + test_labels, debug_sql, parallel, tags, exclude_tags, + test_name_patterns): state = setup(verbosity, test_labels, parallel) extra_tests = [] @@ -290,6 +292,7 @@ def django_tests(verbosity, interactive, failfast, keepdb, reverse, parallel=actual_test_processes(parallel), tags=tags, exclude_tags=exclude_tags, + test_name_patterns=test_name_patterns, ) failures = test_runner.run_tests( test_labels or get_installed(), @@ -416,7 +419,7 @@ if __name__ == "__main__": help='Tells Django to stop running the test suite after first failed test.', ) parser.add_argument( - '-k', '--keepdb', action='store_true', + '--keepdb', action='store_true', help='Tells Django to preserve the test database between runs.', ) parser.add_argument( @@ -469,6 +472,14 @@ if __name__ == "__main__": '--exclude-tag', dest='exclude_tags', action='append', help='Do not run tests with the specified tag. Can be used multiple times.', ) + if PY37: + parser.add_argument( + '-k', dest='test_name_patterns', action='append', + help=( + 'Only run test methods and classes matching test name pattern. ' + 'Same as unittest -k option. Can be used multiple times.' + ), + ) options = parser.parse_args() @@ -507,6 +518,7 @@ if __name__ == "__main__": options.keepdb, options.reverse, options.modules, options.debug_sql, options.parallel, options.tags, options.exclude_tags, + getattr(options, 'test_name_patterns', None), ) if failures: sys.exit(1) diff --git a/tests/test_runner/test_discover_runner.py b/tests/test_runner/test_discover_runner.py index caa48a852d..160f174b76 100644 --- a/tests/test_runner/test_discover_runner.py +++ b/tests/test_runner/test_discover_runner.py @@ -1,12 +1,13 @@ import os from argparse import ArgumentParser from contextlib import contextmanager -from unittest import TestSuite, TextTestRunner, defaultTestLoader +from unittest import TestSuite, TextTestRunner, defaultTestLoader, skipUnless from django.db import connections from django.test import SimpleTestCase from django.test.runner import DiscoverRunner from django.test.utils import captured_stdout +from django.utils.version import PY37 @contextmanager @@ -23,6 +24,13 @@ def change_cwd(directory): class DiscoverRunnerTests(SimpleTestCase): + @staticmethod + def get_test_methods_names(suite): + return [ + t.__class__.__name__ + '.' + t._testMethodName + for t in suite._tests + ] + def test_init_debug_mode(self): runner = DiscoverRunner() self.assertFalse(runner.debug_mode) @@ -71,6 +79,34 @@ class DiscoverRunnerTests(SimpleTestCase): self.assertEqual(count, 1) + @skipUnless(PY37, 'unittest -k option requires Python 3.7 and later') + 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', + ] + all_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']) + 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], + ]: + with self.subTest(pattern): + suite = DiscoverRunner( + test_name_patterns=pattern + ).build_suite(['test_runner_apps.simple']) + self.assertEqual(expected, self.get_test_methods_names(suite)) + def test_file_path(self): with change_cwd(".."): count = DiscoverRunner().build_suite( @@ -170,7 +206,7 @@ class DiscoverRunnerTests(SimpleTestCase): 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[8].id(), + self.assertIn('test_2', suite[9].id(), msg="Methods of unittest cases should be reversed.") def test_overridable_get_test_runner_kwargs(self): diff --git a/tests/test_runner_apps/simple/tests.py b/tests/test_runner_apps/simple/tests.py index ac3e9daba0..edd822737c 100644 --- a/tests/test_runner_apps/simple/tests.py +++ b/tests/test_runner_apps/simple/tests.py @@ -55,3 +55,6 @@ class UnittestCase2(TestCase): def test_2(self): pass + + def test_3_test(self): + pass |
