django - 如何在 django pytest 中使用多个数据库进行单元测试用例
问题描述
我一直在开发一个 django 应用程序,它通过数据库路由器使用多个数据库,如下所示。我想为使用 Django Rest Framework 开发的 api 编写单元测试用例。
class MultiDbRouter(object):
"""
Router for handling multiple database connections
based on the db configs in the request object
"""
def _multi_db(self):
if hasattr(request_cfg, 'db'):
if request_cfg.db in settings.DATABASES:
return request_cfg.db
else:
raise Http404
else:
return 'default'
def db_for_read(self, model, **hints):
"""
Set database for reading based on request config
"""
if model._meta.app_label == 'survey':
return 'survey'
if model._meta.app_label != 'analytics':
return 'default'
return self._multi_db()
def db_for_write(self, model, **hints):
"""
Set database for writing based on request config
"""
if model._meta.app_label == 'survey':
return 'survey'
if model._meta.app_label != 'analytics':
return 'default'
return self._multi_db()
def allow_relation(self, obj1, obj2, **hints):
"""
allow relation between objects
"""
return True
def allow_syncdb(self, db, model):
"""
allow syncing of database
"""
return True
我已经开始使用 pytest 来编写测试用例,但是当我阅读 pytest-django 库的文档时,它说“目前 pytest-django 不专门支持 Django 的多数据库支持。”
有没有办法解决这个限制?或者我应该使用 pytest-django 以外的其他库来编写单元测试用例?如果是,是哪一个?
前进的理想方式是什么?
提前致谢!
解决方案
可以使用 pytest 和多个数据库,所有测试都使用通常的 pytest 语法编写。在您的conftest.py
文件中,将以下内容添加到顶部:
from django.test import TestCase
TestCase.databases = {"default", "survey"}
这将导致所有 pytest 测试都使用您的两个数据库。
pytest-django 上的文档暗示无法在逐个测试的基础上或使用 pytest 夹具来配置多数据库支持。当然,上述情况可能会使您的测试套件变慢,因为您的测试将在每次测试之间回滚跨两个数据库的更改。
我从对 pytest-django 和django docs on multi database support的评论中得到了这个解决方案。
推荐阅读
- ios - 从 firebase 检索用户信息
- javascript - 在反应本机应用程序中获取位置并调用状态更新功能
- amazon-web-services - 通过 RowVersion 更新记录,使用“SQL WHERE”过滤最大值
- sql - 如何在 postgreSQL 中执行深度优先搜索
- php - 如何防止 For Each 循环中的重复结果?
- html - 如何将 overflow-y 设置为 bootstrap-vue 表的单元格或行
- reactjs - NextJS + React Router - 部分 SSR 应用
- python - 如何在张量流中的某些函数中打印中间张量的值?
- python - 如何在 Google App Engine 上使用 Django 创建自定义 gunicorn 设置?
- python - h5py OSerror 由于文件关闭不当