You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Django为每个测试用例重新创建数据库?

强制Django在每个测试后重建数据库(SQLite适用)

Django默认的TestCase类依赖数据库事务回滚来隔离测试数据,测试结束后不会真的删除数据库——这种方式速度更快,但如果你的测试需要完全重建数据库环境(比如涉及DDL操作、事务无法覆盖的场景),可以用以下方案:

1. 使用TransactionTestCase替代TestCase

Django提供的TransactionTestCase类会在每个测试方法执行前后完全重建数据库:

  • 测试开始前:创建新的SQLite数据库文件、执行所有迁移
  • 测试结束后:删除整个数据库文件

直接让你的测试类继承它即可,示例代码:

from django.test import TransactionTestCase

class DataModificationTests(TransactionTestCase):
    def test_update_user_data(self):
        # 执行修改数据库的操作,比如更新用户信息
        pass

    def test_create_new_record(self):
        # 这个测试会拿到一个全新的、干净的数据库
        pass

2. 针对函数式测试的处理

如果你用的是函数式测试(而非类),可以给测试函数添加@transaction_test_case装饰器(Django 3.2+支持),让单个测试函数使用TransactionTestCase的行为:

from django.test import transaction_test_case

@transaction_test_case
def test_delete_all_records():
    # 测试结束后数据库会被完全销毁
    pass

关于SQLite的说明

SQLite完全兼容上述方案,Django会自动管理SQLite的数据库文件:每次测试结束后,对应的.db文件会被删除,下一次测试会重新生成新的空数据库文件,不会有残留数据。

注意:这种方式会比默认的TestCase慢(因为每次都要重建数据库和执行迁移),建议只在确实需要完全隔离数据库环境的测试中使用。

内容的提问来源于stack exchange,提问作者marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:13:20