diff --git a/django/core/management/commands/test.py b/django/core/management/commands/test.py index e94fd989f1..b1186f20fc 100644 --- a/django/core/management/commands/test.py +++ b/django/core/management/commands/test.py @@ -8,6 +8,7 @@ from django.test.utils import get_runner class Command(BaseCommand): help = 'Discover and run tests in the specified modules or the current directory.' + # DiscoverRunner runs the checks after databases are set up. requires_system_checks = False def __init__(self): diff --git a/django/test/runner.py b/django/test/runner.py index 8b4c608c08..487ec7c682 100644 --- a/django/test/runner.py +++ b/django/test/runner.py @@ -9,6 +9,7 @@ import unittest import warnings from importlib import import_module +from django.core.management import call_command from django.db import connections from django.test import SimpleTestCase, TestCase from django.test.utils import ( @@ -555,6 +556,11 @@ class DiscoverRunner(object): verbosity=self.verbosity, ) + def run_checks(self): + # Checks are run after database creation since some checks require + # database access. + call_command('check', verbosity=self.verbosity) + def run_suite(self, suite, **kwargs): kwargs = self.get_test_runner_kwargs() runner = self.test_runner(**kwargs) @@ -593,6 +599,7 @@ class DiscoverRunner(object): self.setup_test_environment() suite = self.build_suite(test_labels, extra_tests) old_config = self.setup_databases() + self.run_checks() result = self.run_suite(suite) self.teardown_databases(old_config) self.teardown_test_environment() diff --git a/docs/intro/tutorial05.txt b/docs/intro/tutorial05.txt index 438cb20045..c6e2827b6b 100644 --- a/docs/intro/tutorial05.txt +++ b/docs/intro/tutorial05.txt @@ -197,6 +197,7 @@ In the terminal, we can run our test:: and you'll see something like:: Creating test database for alias 'default'... + System check identified no issues (0 silenced). F ====================================================================== FAIL: test_was_published_recently_with_future_question (polls.tests.QuestionMethodTests) @@ -250,6 +251,7 @@ past: and run the test again:: Creating test database for alias 'default'... + System check identified no issues (0 silenced). . ---------------------------------------------------------------------- Ran 1 test in 0.001s diff --git a/docs/releases/1.11.txt b/docs/releases/1.11.txt index 0bf77e6e2d..a895f40c5f 100644 --- a/docs/releases/1.11.txt +++ b/docs/releases/1.11.txt @@ -434,6 +434,10 @@ Tests * Added support for :meth:`python:unittest.TestCase.subTest`’s when using the :option:`test --parallel` option. +* ``DiscoverRunner`` now runs the system checks at the start of a test run. + Override the :meth:`.DiscoverRunner.run_checks` method if you want to disable + that. + URLs ~~~~ diff --git a/docs/topics/testing/advanced.txt b/docs/topics/testing/advanced.txt index 3cd60bc03c..192a62c516 100644 --- a/docs/topics/testing/advanced.txt +++ b/docs/topics/testing/advanced.txt @@ -402,12 +402,18 @@ testing behavior. This behavior involves: #. Running ``migrate`` to install models and initial data into the test databases. +#. Running the :doc:`system checks `. + #. Running the tests that were found. #. Destroying the test databases. #. Performing global post-test teardown. +.. versionchanged:: 1.11 + + Running the system checks was added. + If you define your own test runner class and point :setting:`TEST_RUNNER` at that class, Django will execute your test runner whenever you run ``./manage.py test``. In this way, it is possible to use any test framework @@ -566,6 +572,12 @@ Methods Creates the test databases by calling :func:`~django.test.utils.setup_databases`. +.. method:: DiscoverRunner.run_checks() + + .. versionadded:: 1.11 + + Runs the :doc:`system checks `. + .. method:: DiscoverRunner.run_suite(suite, **kwargs) Runs the test suite. diff --git a/tests/check_framework/models.py b/tests/check_framework/models.py index 3b17332411..fe573fce84 100644 --- a/tests/check_framework/models.py +++ b/tests/check_framework/models.py @@ -1,9 +1,19 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +from django.core.checks import register from django.db import models class SimpleModel(models.Model): field = models.IntegerField() manager = models.manager.Manager() + + +@register('tests') +def my_check(app_configs, **kwargs): + my_check.did_run = True + return [] + + +my_check.did_run = False diff --git a/tests/check_framework/tests.py b/tests/check_framework/tests.py index 26ce929655..a64ef206ad 100644 --- a/tests/check_framework/tests.py +++ b/tests/check_framework/tests.py @@ -17,7 +17,7 @@ from django.test.utils import ( from django.utils.encoding import force_text from django.utils.six import StringIO -from .models import SimpleModel +from .models import SimpleModel, my_check class DummyObj(object): @@ -303,3 +303,8 @@ class CheckFrameworkReservedNamesTests(SimpleTestCase): ), ] self.assertEqual(errors, expected) + + +class ChecksRunDuringTests(SimpleTestCase): + def test_registered_check_did_run(self): + self.assertTrue(my_check.did_run)