Overrided the default test command in order to enable manual overriding of the discover-runner settings.

Added options to customize the test loader and the order of test cases in the suite further on in the inheritance chain.
This commit is contained in:
Omer Katz 2013-01-26 20:46:30 +03:00
parent 7ea74e3941
commit d1ff6b023a
5 changed files with 40 additions and 8 deletions

View File

View File

@ -0,0 +1,15 @@
from optparse import make_option
from django.core.management.commands.test import Command as TestCommand
class Command(TestCommand):
option_list = TestCommand.option_list + (
make_option('--root',
action='store', dest='test_discover_root', default=None,
help='Overrides the TEST_DISCOVER_ROOT setting.'),
make_option('--top-level',
action='store', dest='test_discover_top_level', default=None,
help='Overrides the TEST_TOP_LEVEL setting.'),
make_option('--pattern',
action='store', dest='test_discover_pattern', default=None,
help='Overrides the TEST_DISCOVER_PATTERN setting.'),
)

View File

@ -1,8 +1,8 @@
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase
from django.test.simple import DjangoTestSuiteRunner, reorder_suite
from django.utils.importlib import import_module
from settings import TEST_DISCOVER_ROOT, TEST_DISCOVER_TOP_LEVEL, TEST_DISCOVER_PATTERN
try:
from django.utils.unittest import defaultTestLoader
@ -16,30 +16,42 @@ except ImportError:
class DiscoverRunner(DjangoTestSuiteRunner):
testLoader = defaultTestLoader
reorder_by = (TestCase,)
def __init__(self, test_discover_root=None, test_discover_top_level=None, test_discover_pattern=None, *args,
**kwargs):
self.test_discover_root = test_discover_root or TEST_DISCOVER_ROOT
self.test_discover_top_level = test_discover_top_level or TEST_DISCOVER_TOP_LEVEL
self.test_discover_pattern = test_discover_pattern or TEST_DISCOVER_PATTERN
super(DiscoverRunner, self).__init__(*args, **kwargs)
"""
A test suite runner that uses unittest2 test discovery.
"""
def build_suite(self, test_labels, extra_tests=None, **kwargs):
def build_suite(self, test_labels, extra_tests=None):
suite = None
root = getattr(settings, 'TEST_DISCOVER_ROOT', '.')
top_level = getattr(settings, 'TEST_DISCOVER_TOP_LEVEL', None)
pattern = getattr(settings, 'TEST_DISCOVER_PATTERN', 'test*.py')
root = self.test_discover_root
top_level = self.test_discover_top_level
pattern = self.test_discover_pattern
if test_labels:
suite = defaultTestLoader.loadTestsFromNames(test_labels)
suite = self.testLoader.loadTestsFromNames(test_labels)
# if single named module has no tests, do discovery within it
if not suite.countTestCases() and len(test_labels) == 1:
suite = None
root = import_module(test_labels[0]).__path__[0]
if suite is None:
suite = defaultTestLoader.discover(root,
suite = self.testLoader.discover(root,
pattern=pattern, top_level_dir=top_level)
if extra_tests:
for test in extra_tests:
suite.addTest(test)
return reorder_suite(suite, (TestCase,))
return reorder_suite(suite, self.reorder_by)

View File

@ -0,0 +1,5 @@
from django.conf import settings
TEST_DISCOVER_ROOT = getattr(settings, 'TEST_DISCOVER_ROOT', '.')
TEST_DISCOVER_TOP_LEVEL = getattr(settings, 'TEST_DISCOVER_TOP_LEVEL', None)
TEST_DISCOVER_PATTERN = getattr(settings, 'TEST_DISCOVER_PATTERN', 'test*.py')