Django单元测试:指定待修改数据库及解决数据库连接错误方法问询
问题1:Django单元测试场景下,应如何指定需要执行修改操作的数据库?
在Django的单元测试里,要是你需要针对特定数据库执行修改操作,主要有这么几种实用的方式:
直接在操作里指定数据库:不管是创建、更新还是删除数据,ORM操作都支持通过
using()方法指定目标数据库别名。举个例子:# 往名为"secondary"的数据库新增一条记录 MyModel.objects.using("secondary").create(name="测试数据") # 更新该数据库里的指定记录 MyModel.objects.using("secondary").filter(id=1).update(name="更新后的数据")给测试类全局声明允许操作的数据库:如果你的整个测试类都要和某个(或多个)非默认数据库交互,可以在测试类里定义
databases属性,把需要操作的数据库别名列进去。比如:from django.test import TestCase class MultiDBTest(TestCase): # 允许测试操作default和secondary两个数据库 databases = ["default", "secondary"] def test_update_secondary_db(self): MyModel.objects.using("secondary").create(name="测试") # 这里的修改操作会被允许,因为已经在databases里声明过了事务型测试的注意点:如果你用的是
TransactionTestCase(而非默认的TestCase),事务的处理逻辑会略有不同,但指定数据库的方式还是一样的——要么用using()临时指定,要么在测试类里设置databases全局生效。
问题2:解决Django测试中“Database connections to {blah} are not allowed in this test...”的错误
这个错误其实是Django的测试隔离机制在保护你的测试环境:默认情况下,测试只允许连接default数据库,要是你在测试里访问了其他未声明的数据库,就会触发这个提示。解决方法分几种情况:
最直接的方案:把目标数据库添加到测试类的
databases属性:
比如错误提示里提到的数据库别名是blah,那就在你的测试类里加上这个配置:class MyDBTest(TestCase): databases = ["default", "blah"] # 把blah数据库加入允许列表 def test_access_blah_db(self): # 现在连接blah数据库的操作就不会报错了 MyModel.objects.using("blah").all()只读场景:用
readonly选项声明:
如果你只是要读取其他数据库的数据,完全不需要修改,可以用readonly标记该数据库,这样Django会确保不对它执行写操作,同时允许连接:from django.test import TestCase class ReadOnlyDBTest(TestCase): databases = {"default", "blah": {"readonly": True}} def test_read_blah_data(self): data = MyModel.objects.using("blah").all() # 只读操作完全没问题,要是尝试写操作会被Django拦截第三方库偷偷连接数据库的情况:
有些第三方库可能会在内部自行建立数据库连接,这时候你可以用override_settings装饰器临时配置并允许该数据库:from django.test import TestCase, override_settings # 先临时配置blah数据库的连接信息 @override_settings(DATABASES={"blah": YOUR_BLAH_DATABASE_CONFIG}) class ThirdPartyLibTest(TestCase): databases = ["default", "blah"] def test_third_party_function(self): # 现在调用第三方库的函数,它连接blah数据库就不会报错了 third_party_function_that_uses_blah()
内容的提问来源于stack exchange,提问作者Superpolock
相关产品推荐
相关产品推荐

