| 1 | diff --git a/django/test/runner.py b/django/test/runner.py
|
|---|
| 2 | index 84fe249..5ff3f15 100644
|
|---|
| 3 | --- a/django/test/runner.py
|
|---|
| 4 | +++ b/django/test/runner.py
|
|---|
| 5 | @@ -14,6 +14,8 @@ class DiscoverRunner(object):
|
|---|
| 6 | A Django test runner that uses unittest2 test discovery.
|
|---|
| 7 | """
|
|---|
| 8 |
|
|---|
| 9 | + test_suite = TestSuite
|
|---|
| 10 | + test_runner = unittest.TextTestRunner
|
|---|
| 11 | test_loader = defaultTestLoader
|
|---|
| 12 | reorder_by = (TestCase, )
|
|---|
| 13 | option_list = (
|
|---|
| 14 | @@ -42,7 +44,7 @@ class DiscoverRunner(object):
|
|---|
| 15 | unittest.installHandler()
|
|---|
| 16 |
|
|---|
| 17 | def build_suite(self, test_labels=None, extra_tests=None, **kwargs):
|
|---|
| 18 | - suite = TestSuite()
|
|---|
| 19 | + suite = self.test_suite()
|
|---|
| 20 | test_labels = test_labels or ['.']
|
|---|
| 21 | extra_tests = extra_tests or []
|
|---|
| 22 |
|
|---|
| 23 | @@ -107,7 +109,7 @@ class DiscoverRunner(object):
|
|---|
| 24 | return setup_databases(self.verbosity, self.interactive, **kwargs)
|
|---|
| 25 |
|
|---|
| 26 | def run_suite(self, suite, **kwargs):
|
|---|
| 27 | - return unittest.TextTestRunner(
|
|---|
| 28 | + return self.test_runner(
|
|---|
| 29 | verbosity=self.verbosity,
|
|---|
| 30 | failfast=self.failfast,
|
|---|
| 31 | ).run(suite)
|
|---|
| 32 | @@ -201,7 +203,8 @@ def reorder_suite(suite, classes):
|
|---|
| 33 | classes[1], etc. Tests with no match in classes are placed last.
|
|---|
| 34 | """
|
|---|
| 35 | class_count = len(classes)
|
|---|
| 36 | - bins = [unittest.TestSuite() for i in range(class_count+1)]
|
|---|
| 37 | + suite_class = type(suite)
|
|---|
| 38 | + bins = [suite_class() for i in range(class_count+1)]
|
|---|
| 39 | partition_suite(suite, classes, bins)
|
|---|
| 40 | for i in range(class_count):
|
|---|
| 41 | bins[0].addTests(bins[i+1])
|
|---|
| 42 | diff --git a/docs/releases/1.7.txt b/docs/releases/1.7.txt
|
|---|
| 43 | index 32b5e91..326986c 100644
|
|---|
| 44 | --- a/docs/releases/1.7.txt
|
|---|
| 45 | +++ b/docs/releases/1.7.txt
|
|---|
| 46 | @@ -276,6 +276,16 @@ Templates
|
|---|
| 47 | :setting:`TEMPLATE_DEBUG` is ``True``. This allows template origins to be
|
|---|
| 48 | inspected and logged outside of the ``django.template`` infrastructure.
|
|---|
| 49 |
|
|---|
| 50 | +Tests
|
|---|
| 51 | +^^^^^
|
|---|
| 52 | +
|
|---|
| 53 | +* :class:`~django.test.runner.DiscoverRunner` has two new attributes,
|
|---|
| 54 | + :attr:`test_suite` and :attr:`test_runner`, which facilitate
|
|---|
| 55 | + overriding the way tests are collected and run. Documentation has been
|
|---|
| 56 | + added for the similar :attr:`test_loader` attribute
|
|---|
| 57 | + which has been in place since 1.6.
|
|---|
| 58 | +
|
|---|
| 59 | +
|
|---|
| 60 | Backwards incompatible changes in 1.7
|
|---|
| 61 | =====================================
|
|---|
| 62 |
|
|---|
| 63 | diff --git a/docs/topics/testing/advanced.txt b/docs/topics/testing/advanced.txt
|
|---|
| 64 | index d8d59c6..2195f9a 100644
|
|---|
| 65 | --- a/docs/topics/testing/advanced.txt
|
|---|
| 66 | +++ b/docs/topics/testing/advanced.txt
|
|---|
| 67 | @@ -299,13 +299,15 @@ Defining a test runner
|
|---|
| 68 | .. currentmodule:: django.test.runner
|
|---|
| 69 |
|
|---|
| 70 | A test runner is a class defining a ``run_tests()`` method. Django ships
|
|---|
| 71 | -with a ``DiscoverRunner`` class that defines the default Django
|
|---|
| 72 | -testing behavior. This class defines the ``run_tests()`` entry point,
|
|---|
| 73 | -plus a selection of other methods that are used to by ``run_tests()`` to
|
|---|
| 74 | -set up, execute and tear down the test suite.
|
|---|
| 75 | +with a ``DiscoverRunner`` class that defines the default Django testing
|
|---|
| 76 | +behavior. This class defines the ``run_tests()`` entry point, plus a
|
|---|
| 77 | +selection of other methods that are used to by ``run_tests()`` to set up,
|
|---|
| 78 | +execute and tear down the test suite.
|
|---|
| 79 |
|
|---|
| 80 | .. class:: DiscoverRunner(pattern='test*.py', top_level=None, verbosity=1, interactive=True, failfast=True, **kwargs)
|
|---|
| 81 |
|
|---|
| 82 | +.. versionadded:: 1.6
|
|---|
| 83 | +
|
|---|
| 84 | ``DiscoverRunner`` will search for tests in any file matching ``pattern``.
|
|---|
| 85 |
|
|---|
| 86 | ``top_level`` can be used to specify the directory containing your
|
|---|
| 87 | @@ -339,6 +341,34 @@ set up, execute and tear down the test suite.
|
|---|
| 88 | Attributes
|
|---|
| 89 | ~~~~~~~~~~
|
|---|
| 90 |
|
|---|
| 91 | +.. attribute:: DiscoverRunner.test_suite
|
|---|
| 92 | +
|
|---|
| 93 | +.. versionadded:: 1.7
|
|---|
| 94 | +
|
|---|
| 95 | + The class used to build the test suite. By default it is set to
|
|---|
| 96 | + ``unittest.TestSuite``. This can be overridden if you wish to implement
|
|---|
| 97 | + different logic for collecting tests into a test suite.
|
|---|
| 98 | +
|
|---|
| 99 | +.. attribute:: DiscoverRunner.test_runner
|
|---|
| 100 | +
|
|---|
| 101 | +.. versionadded:: 1.7
|
|---|
| 102 | +
|
|---|
| 103 | + This is the class of the low-level test runner which is used to execute
|
|---|
| 104 | + the individual tests and format the results. By default it is set to
|
|---|
| 105 | + ``unittest.TextTestRunner``. Despite the unfortunate similarity in
|
|---|
| 106 | + naming conventions, this is not the same type of class as
|
|---|
| 107 | + ``DiscoverRunner``, which covers a broader set of responsibilites. You
|
|---|
| 108 | + can override this attribute to modify the way tests are run and reported.
|
|---|
| 109 | +
|
|---|
| 110 | +.. attribute:: DiscoverRunner.test_loader
|
|---|
| 111 | +
|
|---|
| 112 | +.. versionadded:: 1.6
|
|---|
| 113 | +
|
|---|
| 114 | + This is the class that loads tests, whether from TestCases or modules or
|
|---|
| 115 | + otherwise and bundles them into test suites for the runner to execute.
|
|---|
| 116 | + By default it is set to ``unittest.defaultTestLoader``. You can override
|
|---|
| 117 | + this attribute if your tests are going to be loaded in unusual ways.
|
|---|
| 118 | +
|
|---|
| 119 | .. attribute:: DiscoverRunner.option_list
|
|---|
| 120 |
|
|---|
| 121 | This is the tuple of ``optparse`` options which will be fed into the
|
|---|