mirror of
https://github.com/django/django.git
synced 2025-06-07 12:39:12 +00:00
Fixed #29866 -- Made DiscoverRunner do tests tear down if running checks or tests raises an exception.
This commit is contained in:
parent
630f3d8b46
commit
916aecd29d
@ -602,10 +602,22 @@ class DiscoverRunner:
|
|||||||
self.setup_test_environment()
|
self.setup_test_environment()
|
||||||
suite = self.build_suite(test_labels, extra_tests)
|
suite = self.build_suite(test_labels, extra_tests)
|
||||||
old_config = self.setup_databases()
|
old_config = self.setup_databases()
|
||||||
self.run_checks()
|
run_failed = False
|
||||||
result = self.run_suite(suite)
|
try:
|
||||||
self.teardown_databases(old_config)
|
self.run_checks()
|
||||||
self.teardown_test_environment()
|
result = self.run_suite(suite)
|
||||||
|
except Exception:
|
||||||
|
run_failed = True
|
||||||
|
raise
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
self.teardown_databases(old_config)
|
||||||
|
self.teardown_test_environment()
|
||||||
|
except Exception:
|
||||||
|
# Silence teardown exceptions if an exception was raised during
|
||||||
|
# runs to avoid shadowing it.
|
||||||
|
if not run_failed:
|
||||||
|
raise
|
||||||
return self.suite_result(suite, result)
|
return self.suite_result(suite, result)
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ from django import db
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.core.management import call_command
|
from django.core.management import call_command
|
||||||
|
from django.core.management.base import SystemCheckError
|
||||||
from django.test import (
|
from django.test import (
|
||||||
TestCase, TransactionTestCase, skipUnlessDBFeature, testcases,
|
TestCase, TransactionTestCase, skipUnlessDBFeature, testcases,
|
||||||
)
|
)
|
||||||
@ -407,3 +408,59 @@ class EmptyDefaultDatabaseTest(unittest.TestCase):
|
|||||||
connection = testcases.connections[db.utils.DEFAULT_DB_ALIAS]
|
connection = testcases.connections[db.utils.DEFAULT_DB_ALIAS]
|
||||||
self.assertEqual(connection.settings_dict['ENGINE'], 'django.db.backends.dummy')
|
self.assertEqual(connection.settings_dict['ENGINE'], 'django.db.backends.dummy')
|
||||||
connections_support_transactions()
|
connections_support_transactions()
|
||||||
|
|
||||||
|
|
||||||
|
class RunTestsExceptionHandlingTests(unittest.TestCase):
|
||||||
|
def test_run_checks_raises(self):
|
||||||
|
"""
|
||||||
|
Teardown functions are run when run_checks() raises SystemCheckError.
|
||||||
|
"""
|
||||||
|
with mock.patch('django.test.runner.DiscoverRunner.setup_test_environment'), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.setup_databases'), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.build_suite'), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.run_checks', side_effect=SystemCheckError), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.teardown_databases') as teardown_databases, \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.teardown_test_environment') as teardown_test_environment:
|
||||||
|
runner = DiscoverRunner(verbosity=0, interactive=False)
|
||||||
|
with self.assertRaises(SystemCheckError):
|
||||||
|
runner.run_tests(['test_runner_apps.sample.tests_sample.TestDjangoTestCase'])
|
||||||
|
self.assertTrue(teardown_databases.called)
|
||||||
|
self.assertTrue(teardown_test_environment.called)
|
||||||
|
|
||||||
|
def test_run_checks_raises_and_teardown_raises(self):
|
||||||
|
"""
|
||||||
|
SystemCheckError is surfaced when run_checks() raises SystemCheckError
|
||||||
|
and teardown databases() raises ValueError.
|
||||||
|
"""
|
||||||
|
with mock.patch('django.test.runner.DiscoverRunner.setup_test_environment'), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.setup_databases'), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.build_suite'), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.run_checks', side_effect=SystemCheckError), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.teardown_databases', side_effect=ValueError) \
|
||||||
|
as teardown_databases, \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.teardown_test_environment') as teardown_test_environment:
|
||||||
|
runner = DiscoverRunner(verbosity=0, interactive=False)
|
||||||
|
with self.assertRaises(SystemCheckError):
|
||||||
|
runner.run_tests(['test_runner_apps.sample.tests_sample.TestDjangoTestCase'])
|
||||||
|
self.assertTrue(teardown_databases.called)
|
||||||
|
self.assertFalse(teardown_test_environment.called)
|
||||||
|
|
||||||
|
def test_run_checks_passes_and_teardown_raises(self):
|
||||||
|
"""
|
||||||
|
Exceptions on teardown are surfaced if no exceptions happen during
|
||||||
|
run_checks().
|
||||||
|
"""
|
||||||
|
with mock.patch('django.test.runner.DiscoverRunner.setup_test_environment'), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.setup_databases'), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.build_suite'), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.run_checks'), \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.teardown_databases', side_effect=ValueError) \
|
||||||
|
as teardown_databases, \
|
||||||
|
mock.patch('django.test.runner.DiscoverRunner.teardown_test_environment') as teardown_test_environment:
|
||||||
|
runner = DiscoverRunner(verbosity=0, interactive=False)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
# Suppress the output when running TestDjangoTestCase.
|
||||||
|
with mock.patch('sys.stderr'):
|
||||||
|
runner.run_tests(['test_runner_apps.sample.tests_sample.TestDjangoTestCase'])
|
||||||
|
self.assertTrue(teardown_databases.called)
|
||||||
|
self.assertFalse(teardown_test_environment.called)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user