Django单元测试:如何为多个测试文件仅加载一次数据库?
Django测试:仅初始化一次数据库供所有测试文件共享
针对你遇到的每个测试文件重复初始化数据库导致速度慢的问题,有几种实用方案可以实现全局仅初始化一次数据库:
方案一:利用测试目录的__init__.py全局初始化
Django在加载测试模块时,会优先加载tests目录下的__init__.py文件,我们可以在这里执行一次数据库初始化,所有测试文件都会共享这次初始化的结果:
- 在
tests/__init__.py中添加初始化代码:
from myapp.init import init_my_db # 全局仅执行一次数据库初始化 init_my_db()
- 移除各个测试类中
setUpTestData里的初始化逻辑:
class OneTestCase(APITestCase): def test_some_function(self): # 编写你的测试逻辑 pass class TwoTestCase(APITestCase): def test_another_function(self): # 编写你的测试逻辑 pass
注意:这种方案适合所有测试共享同一初始数据库状态的场景,如果你的测试会修改数据库数据,可能会影响其他测试的执行结果。
方案二:全局初始化+事务回滚隔离测试
如果测试需要修改数据库数据,可结合Django测试的事务特性,保证每个测试方法结束后自动回滚数据,维持初始数据库状态:
- 同样在
tests/__init__.py中执行一次全局初始化(同方案一)。 - 测试类正常继承
APITestCase或TestCase——Django默认会为每个测试方法开启事务,测试结束后自动回滚,不会污染全局初始化的数据库数据。
方案三:使用pytest-django复用数据库(若用pytest框架)
如果你的项目使用pytest作为测试框架,可以配合pytest-django插件的--reuse-db参数:
- 先在
tests/__init__.py中完成全局数据库初始化。 - 执行测试时添加参数:
pytest --reuse-db
这个参数会让测试数据库仅在首次运行时创建和初始化,后续测试直接复用,大幅提升测试速度。
额外注意点
- 确保你的
init_my_db脚本是幂等的(多次执行不会重复创建数据),避免意外问题。 - 如果运行测试时使用了
--create-db参数,会强制重建数据库,导致全局初始化重新执行。
内容的提问来源于stack exchange,提问作者user840718
相关产品推荐
相关产品推荐

