首页 > 解决方案 > 如何在 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 以外的其他库来编写单元测试用例?如果是,是哪一个?

前进的理想方式是什么?

提前致谢!

标签: djangopytest-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的评论中得到了这个解决方案。


推荐阅读