Django中能否跳过数据库创建运行功能测试?
First off, let's clear this up: running python manage.py test functional_test.py out of the box won't skip database creation—Django's default TestCase class automatically triggers database setup and migrations. But there are several reliable ways to run tests without creating a test database, depending on your scenario:
1. Use SimpleTestCase for database-agnostic tests
If your functional tests don't interact with the database at all (e.g., testing HTTP responses, template rendering, static assets), swap out TestCase with SimpleTestCase. This class is designed specifically for tests that don't need database access, so Django won't create a test database when running these:
from django.test import SimpleTestCase class MyFunctionalTest(SimpleTestCase): def test_homepage_loads(self): response = self.client.get('/') self.assertEqual(response.status_code, 200) self.assertContains(response, "Welcome to our site")
2. Configure a dummy database engine globally
You can override your database settings for test runs to use Django's dummy backend, which doesn't create any actual database. Add this to your project's settings.py (or a dedicated settings_test.py):
import sys if 'test' in sys.argv: DATABASES['default'] = { 'ENGINE': 'django.db.backends.dummy', }
Then run your tests with the modified settings (if using a separate file):
python manage.py test functional_test.py --settings=myproject.settings_test
This works well if most of your tests don't need a database.
3. Temporarily disable the database for specific tests
If only a subset of your tests need to skip database setup, use the @override_settings decorator to switch to the dummy backend for those tests:
from django.test import TestCase from django.test.utils import override_settings @override_settings(DATABASES={'default': {'ENGINE': 'django.db.backends.dummy'}}) class NonDatabaseTest(TestCase): def test_static_content(self): # Test logic that doesn't touch the database pass
Note: For tests that truly don't need the database, sticking with SimpleTestCase is cleaner than this approach.
4. Reuse an existing test database (reduce setup time)
If your main issue is the time to create the database (rather than skipping it entirely), use the --keepdb flag. This tells Django to keep the test database after runs, so it won't recreate it from scratch every time—only applying new migrations if needed:
python manage.py test functional_test.py --keepdb
This cuts down on setup time drastically while still letting you use database-dependent tests.
内容的提问来源于stack exchange,提问作者Caco

