如何为Django多租户应用编写测试?

4

我有一个使用Postgresql模式的Django多租户应用程序。我尝试在一个名为"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

请问您能否在您的问题中添加更多信息呢? 看起来您不想创建一个测试数据库。那么您希望怎样呢?让测试使用真实的数据库并在其中创建新行吗? - gelonida
是的,我已经查看了一个SO答案,但基本上如何为Django多租户应用程序启动unittest是我的问题。上面的代码片段是我尝试测试租户设置的代码,这是正确的方法吗?还是我应该遵循其他方法?我主要是在询问多租户方面的@ gelonida。 - amrs-tech
1个回答

3

根据您在多租户应用中使用的隔离类型不同,您可以使用@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")


实际上,我提到了有一种覆盖DB创建的解决方案。但我的问题是,我们应该像正常的Django单元测试那样进行,还是有其他的方法来测试多租户系统? - amrs-tech
1
是的,请将其视为普通的Django应用程序。一般来说,最好保持测试简单和隔离。如果您需要测试Django应用程序内部应用程序之间的某些交互,则创建一个测试设置。它应该接近您在现实中使用的内容,但不需要超出您正在测试范围的依赖项。 - Yann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接