第一个测试用例运行后,Django DB记录消失

Ale*_*aev 1 python django unit-testing django-rest-framework

我正在基于Django REST Framework的项目上工作。因此,我需要为REST API编写一些测试用例。

我已经写了一些从标准DRF APITransactionTestCase继承的基本类(我们称之为BaseAPITestCase)。

在此类中,我定义了setUp方法,在其中创建了一些属于某些组的测试用户(我使用的是用FactoryBoy编写的UserFactory)。

当我运行测试时,第一个(第一个子类中的第一个测试用例方法)成功创建了具有指定组的用户,而其他用户则没有(指定了同一类中的其他测试用例方法)。

用户组目前不在数据库中。似乎在每次运行新的测试用例时,都会从数据库中删除现有记录。但是,它如何第一次起作用?

我已阅读Django测试文档,但无法弄清楚为什么会发生...有人可以解释吗?

主要问题是我应该怎么做才能使这些测试起作用

我应该创建一次用户并将其存储在对象变量中吗?

是否应该添加一些参数来保留用户组数据?

还是应该将用户组添加到灯具中?在这种情况下,如何正确创建此灯具?(所有相关模型,例如权限和内容类型)

用于说明的简化源代码:

from rest_framework.test import APITransactionTestCase    

class BaseAPITestCase(APITransactionTestCase):

    def setUp(self):
        self.user = UserFactory(
            username='login',
            password='pass',
            group_names=('admin', )
        )
        self.client = APIClient()
        self.client.force_login(self.user)

    def tearDown(self):
        self.client.logout()    

class CampaignListTest(BaseAPITestCase):

    def test_authorized_get(self):
        # successfully gets user groups from DB

    def test_authorized_post(self):
        # couldn't find any groups
Run Code Online (Sandbox Code Playgroud)

knb*_*nbk 6

TransactionTestCase是测试交易的测试用例。因此,它明确不使用事务来隔离测试,因为这会干扰正在测试的事务的行为。

要隔离测试,请TransactionTestCase通过截断所有表来回滚数据库。这是不使用事务处理的最简单,最快的解决方案,但是您已经注意到,这将删除所有数据,包括在post_migrate信号接收器中生成的组。您可以serialized_rollback = True在类上进行设置,在这种情况下,它将序列化所有对数据库所做的更改,并在每次测试后将这些更改反向。然而,这是显著慢,而且常常大大增加需要运行测试套件的时间,所以这是不是默认。

TestCase没有此限制,因此它将每个测试用例包装在一个事务中,并将每个测试包装在一个保存点中。使用事务和保存点的回滚速度很快,并允许您保留事务或保存点开始时的数据。因此,最好TestCase在可能的情况下使用。

这扩展到DRF的APITransactionTestCaseAPITestCase,它们仅继承自Django的测试用例。