本文目录导读:

是的,Django 测试框架会自动为测试创建独立的测试数据库,确保测试数据与开发或生产数据库完全隔离。
核心机制:
-
自动创建临时数据库
- 运行
python manage.py test时,Django 会根据DATABASES配置创建一个名为test_+ 原数据库名的临时数据库(如test_mydb)。 - 测试结束后,该数据库会被自动销毁(除非使用
--keepdb选项保留)。
- 运行
-
每次测试类/方法的隔离
- 事务隔离(默认):每个测试用例(
TestCase子类)在事务中运行,测试结束时回滚所有修改,这对后续测试完全无影响。 - 数据库级别隔离:如果使用
TransactionTestCase,Django 会在每次测试后清空所有表数据(通过DELETE或TRUNCATE),确保完全隔离。
- 事务隔离(默认):每个测试用例(
-
多数据库支持
- 如果配置了多个数据库,Django 会为每个数据库创建对应的测试数据库(如
test_db1,test_db2)。
- 如果配置了多个数据库,Django 会为每个数据库创建对应的测试数据库(如
示例验证:
from django.test import TestCase
from myapp.models import User
class UserTestCase(TestCase):
def test_create_user(self):
User.objects.create(name="Alice") # 只在临时测试库中创建
self.assertEqual(User.objects.count(), 1)
def test_no_user(self):
# 上一个测试创建的数据已被回滚,这里为0
self.assertEqual(User.objects.count(), 0)
行为对比:
| 场景 | 默认行为 |
|---|---|
| 运行测试 | 自动创建 test_ 开头的新数据库 |
| 测试执行 | 每个测试用例在独立事务中运行(TestCase) |
| 测试结束 | 销毁整个测试数据库 |
| 多数据库 | 为每个配置的数据库创建对应的测试数据库 |
重要注意事项:
- 谨慎使用
TransactionTestCase:它不会回滚数据,而是清空所有表,速度较慢但适用于测试某些特殊数据库行为(如事务操作)。 - 不要手动连接真实数据库:测试中通过 Django ORM 操作的数据都在测试数据库中。
- 数据库权限:Django 需要
CREATE DATABASE权限来创建测试数据库。 - 自定义数据库名称:可通过
TEST.NAME设置指定测试库名称:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydb',
'TEST': {
'NAME': 'my_test_db' # 自定义测试数据库名
}
}
}
Django 测试框架完全自动处理数据库隔离,你无需手动管理测试数据清理,每个测试用例都在干净的环境中运行,这是 Django 测试的核心优势之一。