Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #21206 -- No longer run discovery if the test label doesn't poi…

…nt to a package or directory.

Thanks thepapermen for the report and Carl Meyer for the review.
  • Loading branch information...
commit aef019de6113e6c750e3ba49dc1e9f2a179eb0ca 1 parent 52325b0
@prestontimmons prestontimmons authored timgraham committed
View
21 django/test/runner.py
@@ -1,3 +1,4 @@
+from importlib import import_module
import os
from optparse import make_option
import unittest
@@ -89,11 +90,11 @@ def build_suite(self, test_labels=None, extra_tests=None, **kwargs):
break
kwargs['top_level_dir'] = top_level
- if not (tests and tests.countTestCases()):
- # if no tests found, it's probably a package; try discovery
+ if not (tests and tests.countTestCases()) and is_discoverable(label):
+ # Try discovery if path is a package or directory
tests = self.test_loader.discover(start_dir=label, **kwargs)
- # make unittest forget the top-level dir it calculated from this
+ # Make unittest forget the top-level dir it calculated from this
# run, to support running tests from two different top-levels.
self.test_loader._top_level_dir = None
@@ -150,6 +151,20 @@ def run_tests(self, test_labels, extra_tests=None, **kwargs):
return self.suite_result(suite, result)
+def is_discoverable(label):
+ """
+ Check if a test label points to a python package or file directory.
+ """
+ try:
+ mod = import_module(label)
+ except ImportError:
+ pass
+ else:
+ return hasattr(mod, '__path__')
+
+ return os.path.isdir(os.path.abspath(label))
+
+
def dependency_ordered(test_databases, dependencies):
"""
Reorder test_databases into an order that honors the dependencies
View
0  tests/test_discovery_sample/empty.py
No changes.
View
4 tests/test_discovery_sample/tests_sample.py
@@ -13,3 +13,7 @@ class TestDjangoTestCase(DjangoTestCase):
def test_sample(self):
self.assertEqual(1, 1)
+
+
+class EmptyTestCase(TestCase):
+ pass
View
28 tests/test_runner/test_discover_runner.py
@@ -68,6 +68,34 @@ def change_cwd_to_tests():
self.assertEqual(count, 3)
+ def test_empty_test_case(self):
+ count = DiscoverRunner().build_suite(
+ ["test_discovery_sample.tests_sample.EmptyTestCase"],
+ ).countTestCases()
+
+ self.assertEqual(count, 0)
+
+ def test_discovery_on_package(self):
+ count = DiscoverRunner().build_suite(
+ ["test_discovery_sample.tests"],
+ ).countTestCases()
+
+ self.assertEqual(count, 1)
+
+ def test_ignore_adjacent(self):
+ """
+ When given a dotted path to a module, unittest discovery searches
+ not just the module, but also the directory containing the module.
+
+ This results in tests from adjacent modules being run when they
+ should not. The discover runner avoids this behavior.
+ """
+ count = DiscoverRunner().build_suite(
+ ["test_discovery_sample.empty"],
+ ).countTestCases()
+
+ self.assertEqual(count, 0)
+
def test_overrideable_test_suite(self):
self.assertEqual(DiscoverRunner().test_suite, TestSuite)

0 comments on commit aef019d

Please sign in to comment.
Something went wrong with that request. Please try again.