首页 > 解决方案 > 对于某些测试用例,Django 不会重新加载夹具

问题描述

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

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

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

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

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

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

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

@do_not_flush_data_from_database_for_next_test_case_from_this_class
def get_users_test(self):
    pass

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

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

标签: pythondjangounit-testing

解决方案


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

为了澄清起见,我将假设test case等于test class。否则,如果测试用例只是单个测试,那么只有在您MyProjectTestCase继承自 django.TransactionTestCase. 因为为每个测试设置夹具,TransactionTestCase 所以在为每个类TestCase 设置夹具时。


对于具有长负载夹具的不同测试类的情况,可能一种解决方案将使用自定义测试loaddata运行程序,该运行程序每次./manage.py test运行仅调用一次负载夹具命令。


推荐阅读