【问题标题】:Django DB records disappears after first testcase run第一次运行测试用例后,Django DB 记录消失
【发布时间】:2017-11-02 14:07:48
【问题描述】:

我正在开发一个基于 Django REST 框架的项目。所以我需要为我的 REST API 编写一些测试用例。

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

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

当我运行我的测试时,第一个(来自第一个 child 类的第一个测试用例方法)成功地创建了具有指定组的用户,但其他的没有(其他测试用例方法在相同的类)。

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

我已经阅读了 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

【问题讨论】:

  • 你真的需要APITransactionTestCase而不是APITestCase吗?如果没有,切换到APITestCase 将是最简单的解决方案。
  • @knbk 谢谢。你能解释一下为什么事务一以这种方式工作吗?

标签: python django unit-testing django-rest-framework


【解决方案1】:

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

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

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

这延伸到 DRF 的 APITransactionTestCaseAPITestCase,它们只是继承自 Django 的测试用例。

【讨论】:

  • 谢谢@knbk!我不知道有两种清除数据。正如我所看到的,最初编写这些测试的开发人员也不知道这个事实,所以接下来还有很多工作要做:)
猜你喜欢
  • 2021-03-19
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多