【问题标题】:How to write tests for django multi tenant applications?如何为 django 多租户应用程序编写测试?
【发布时间】:2023-10-01 07:07:01
【问题描述】:

我在 django 中有带有 postgresql 模式的多租户应用程序。我试图在租户文件夹“t002”中编写测试代码:

from django.test import TestCase
from path.customers.models import Client
# TestClass to test tenant setup
class TestTenantSetup(TestCase):
    def setUp(self):
        Client.objects.create(
            name='t002',
            schema_name='t002', 
            domain_url='t002.cmpny.com'
            )

    def test_tenant_exists(self):
        client = Client.objects.get(name='t002')
        self.assertEquals(client.schema_name, "t002")

但是当我使用 python manage.py test path/t002/tests 运行测试时,它正在为我的实际数据库创建一个测试数据库。所以假设我会遵循这个 SO 答案 (django unit tests without a db) 并避免创建数据库,但我不确定我是否遵循正确的路径来测试多租户 django 项目。当我查看 django-tenant-schemas 文档 (https://django-tenant-schemas.readthedocs.io/en/latest/test.html) 时,我无法轻易掌握它。谁能告诉如何开始对 django 多租户应用程序进行测试?并且请检查上面的代码是否正确。

规格 - python==2.7、django==1.11、postgres==9.6

【问题讨论】:

  • 能否为您的问题添加更多信息。看来您不希望创建测试数据库。你想要什么?让测试使用真实的数据库并在那里创建新行?
  • 是的那部分,我已经检查了一个 SO 答案,但基本上如何为 django 多租户应用程序启动单元测试是我的问题。以上 sn-p 是我尝试测试租户设置的方法,这是正确的方法吗?或者我是否应该关注其他人?我主要要求多租户@gelonida

标签: python django unit-testing multi-tenant


【解决方案1】:

取决于您在多租户应用程序中使用的隔离软。

如果您使用不同的数据库设置或任何其他设置,您可以使用 @django.test.override_settings 在您的测试中覆盖它们的测试版本。

例如:

from django.test import override_settings

@override_settings(DATABASES=<...>)  # you can also load and/or override other settings for a specific application
class TestTenantSetup(TestCase):
    def setUp(self):
        Client.objects.create(
            name='t002',
            schema_name='t002', 
            domain_url='t002.cmpny.com'
            )

    def test_tenant_exists(self):
        client = Client.objects.get(name='t002')
        self.assertEquals(client.schema_name, "t002")

【讨论】:

  • 实际上我提到有一个解决方案可以覆盖数据库创建。但我问的是,我们是应该像普通的 Django 单元测试一样进行还是有其他方法来测试多租户系统?
  • 是的,把它当作一个普通的 Django 应用。一般来说,最好让测试保持简单和孤立。如果您需要测试 Django 应用程序内的应用程序之间的一些交互,请创建一个测试设置。它应该接近您实际使用的内容,但不需要超出您正在测试的范围的依赖项。