Django项目新增数据库后测试报错 求无需逐个修改用例的解决方案
问题解决方案
更优的全局配置方案
- 方案1:自定义项目统一测试基类(最推荐,兼容性最强)
你只需要在项目公共工具目录下定义一个继承自Django原生TestCase的基类,一次性配置databases属性,所有原有测试类改为继承该基类即可,无需逐个修改测试类配置:
# 示例路径:common/testcases.py from django.test import TestCase as BaseDjangoTestCase class TestCase(BaseDjangoTestCase): # 后续新增数据库只需要修改此处即可 databases = {"default", "new_database"} # 也可直接写 databases = "__all__" 适配所有后续新增的数据库
原有测试代码仅需要替换import语句,把from django.test import TestCase改为from common.testcases import TestCase即可,整体改动量极小,可扩展性最高。
- 方案2:pytest-django全局配置(若项目使用pytest作为测试框架)
如果你的项目用pytest-django运行测试,可以在conftest.py中添加全局fixture,默认给所有测试用例开放所有数据库访问权限:
import pytest @pytest.fixture(autouse=True) def enable_all_db_access_for_all_tests(db): pass
或者在pytest配置文件中添加django_db_reset_sequences = True配合全局数据库权限配置即可。
报错原因说明
Django的TestCase类为了实现测试用例之间的隔离,默认会对settings中DATABASES配置项里所有已注册的数据库执行事务初始化操作:测试运行前开启事务,测试执行完成后回滚事务,保证各个测试用例的数据互不影响。
哪怕你的测试用例代码完全没有主动访问新增的new_database,这个全局事务初始化的动作也会触发Django的测试数据库访问权限校验,因为你没有给当前测试类配置允许访问该数据库,所以会抛出Database queries to 'new-database' are not allowed in this test的报错。
内容的提问来源于stack exchange,提问作者bardia zamanian
相关产品推荐
相关产品推荐

