From d1ff6b023adc97bd70f197820a02a384e3bbf317 Mon Sep 17 00:00:00 2001 From: Omer Katz Date: Sat, 26 Jan 2013 20:46:30 +0300 Subject: [PATCH] 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. --- discover_runner/management/__init__.py | 0 .../management/commands/__init__.py | 0 discover_runner/management/commands/test.py | 15 ++++++++++ discover_runner/runner.py | 28 +++++++++++++------ discover_runner/settings.py | 5 ++++ 5 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 discover_runner/management/__init__.py create mode 100644 discover_runner/management/commands/__init__.py create mode 100644 discover_runner/management/commands/test.py create mode 100644 discover_runner/settings.py diff --git a/discover_runner/management/__init__.py b/discover_runner/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/discover_runner/management/commands/__init__.py b/discover_runner/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/discover_runner/management/commands/test.py b/discover_runner/management/commands/test.py new file mode 100644 index 0000000..7d91a4c --- /dev/null +++ b/discover_runner/management/commands/test.py @@ -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.'), + ) \ No newline at end of file diff --git a/discover_runner/runner.py b/discover_runner/runner.py index 29e2298..c6a923d 100644 --- a/discover_runner/runner.py +++ b/discover_runner/runner.py @@ -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) diff --git a/discover_runner/settings.py b/discover_runner/settings.py new file mode 100644 index 0000000..3f9cefe --- /dev/null +++ b/discover_runner/settings.py @@ -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')