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 不会为某些测试用例重新加载夹具的主要内容,如果未能解决你的问题,请参考以下文章
pytest自动化测试框架详解+mark标记+fixture夹具
pytest自动化测试框架详解+mark标记+fixture夹具