本文目录导读:

是的,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 测试的核心优势之一。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播