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

Django单元测试:如何为多个测试文件仅加载一次数据库?

Django测试:仅初始化一次数据库供所有测试文件共享

针对你遇到的每个测试文件重复初始化数据库导致速度慢的问题,有几种实用方案可以实现全局仅初始化一次数据库:

方案一:利用测试目录的__init__.py全局初始化

Django在加载测试模块时,会优先加载tests目录下的__init__.py文件,我们可以在这里执行一次数据库初始化,所有测试文件都会共享这次初始化的结果:

  1. 在tests/__init__.py中添加初始化代码:
from myapp.init import init_my_db

# 全局仅执行一次数据库初始化
init_my_db()
  1. 移除各个测试类中setUpTestData里的初始化逻辑:
class OneTestCase(APITestCase):
    def test_some_function(self):
        # 编写你的测试逻辑
        pass

class TwoTestCase(APITestCase):
    def test_another_function(self):
        # 编写你的测试逻辑
        pass

注意:这种方案适合所有测试共享同一初始数据库状态的场景,如果你的测试会修改数据库数据,可能会影响其他测试的执行结果。

方案二:全局初始化+事务回滚隔离测试

如果测试需要修改数据库数据,可结合Django测试的事务特性,保证每个测试方法结束后自动回滚数据,维持初始数据库状态:

  1. 同样在tests/__init__.py中执行一次全局初始化(同方案一)。
  2. 测试类正常继承APITestCase或TestCase——Django默认会为每个测试方法开启事务,测试结束后自动回滚,不会污染全局初始化的数据库数据。

方案三:使用pytest-django复用数据库(若用pytest框架)

如果你的项目使用pytest作为测试框架,可以配合pytest-django插件的--reuse-db参数:

  1. 先在tests/__init__.py中完成全局数据库初始化。
  2. 执行测试时添加参数:
pytest --reuse-db

这个参数会让测试数据库仅在首次运行时创建和初始化,后续测试直接复用,大幅提升测试速度。

额外注意点

  • 确保你的init_my_db脚本是幂等的(多次执行不会重复创建数据),避免意外问题。
  • 如果运行测试时使用了--create-db参数,会强制重建数据库,导致全局初始化重新执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:26:12