Django 不会为某些测试用例重新加载夹具

Posted

技术标签:

【中文标题】Django 不会为某些测试用例重新加载夹具【英文标题】:Django do not reload fixture for some test cases 【发布时间】:2020-09-29 17:10:05 【问题描述】:

对于每个测试类,我生成了带有数据的基本.json 夹具。这是一种非常清晰和快速的方法,因为我不需要花时间来生成数据。我可以直接在测试中使用工厂生成的任何其他数据。

class ProfileViewTests(MyProjectTestCase):
    fixtures = [os.path.join('compiled', 'test_companies_and_users.json')]

    def test1(self):
        pass
   
    def test2(self):
        pass

加载一些fixture的问题需要15秒,因为它们创建了一个巨大的测试数据环境。

现在我有 70% 的时间浪费在每个测试用例之后加载固定装置上。好处是当我们更新对象时,我们不需要关心刷新这些数据,但坏处是每次测试都会增加时间。

我可以将一些数据移至setUpTestData,但重新访问所有这些数据以进行所有这些测试几乎是不可能的。

我的问题是有一个装饰器说一些测试用例不会重新加载固定装置,如果它们不修改数据。

@do_not_flush_data_from_database_for_next_test_case_from_this_class
def get_users_test(self):
    pass

因为我的测试只针对 get 用户,我不想浪费 15 秒来重新加载我的夹具文件以进行下一次测试。

或者我需要深入研究:“为什么我的灯具加载这么慢?”

【问题讨论】:

【参考方案1】:

我有 70% 的时间浪费在每个测试用例之后加载夹具。

为了澄清起见,我假设 test case 等于 test class。否则,如果 test case 只是单个测试,那么只有在您的 MyProjectTestCase 继承自 django.TransactionTestCase。因为TransactionTestCase setup fixtures 每次测试,当TestCase setup fixtures 每班。


在您的情况下,对于具有长负载夹具的不同测试类,一种解决方案可能是使用custom test runner,它会在每次./manage.py test 运行时调用loaddata 命令来加载夹具一次。

【讨论】:

以上是关于Django 不会为某些测试用例重新加载夹具的主要内容,如果未能解决你的问题,请参考以下文章

在 django 单元测试中加载固定装置

加载夹具时 django unittest 出错

pytest自动化测试框架详解+mark标记+fixture夹具

pytest自动化测试框架详解+mark标记+fixture夹具

在 Django 中为 Selenium 测试加载夹具时出现完整性错误

带有加载夹具的 Django 单元测试,用于解决几个相关的应用程序问题