Django 1.8附带a refactored TestCase,允许通过setUpTestData()方法使用事务和保存点在类级别进行数据初始化。这与在每种测试方法之前运行的unittest的setUp()形成对比。
问题:现在setUp()
存在,Django中setUpTestData()
的用例是什么?
我只是在寻找客观的,高级别的答案,否则这个问题对Stack Overflow来说太宽泛了。
答案 0 :(得分:33)
设置代码不能作为类方法运行并不罕见。一个值得注意的例子是Django test client:你可能不希望在跨越大量相同数据的测试中重用相同的客户端实例,实际上,客户端实例自动包含在Django SimpleTestCase
的子类中是created per test method而不是整个班级。假设您使用setUp
方法从Django 1.8之前的世界进行了测试:
def setUp(self): self.the_user = f.UserFactory.create() self.the_post = f.PostFactory.create(author=self.the_user) self.client.login( username=self.the_user.username, password=TEST_PASSWORD ) # ... &c.
您可能希望通过将setUp
更改为setUpTestData
,将@classmethod
装饰器置于顶部,并将所有self
更改为{{1}来使测试用例现代化}}。但是cls
会失败!相反,您应该使用AttributeError: type object 'MyTestCase' has no attribute 'client'
作为共享数据,setUpTestData
作为per-test-method客户端:
@classmethod def setUpTestData(cls): cls.the_user = f.UserFactory.create() cls.the_post = f.PostFactory.create(author=cls.the_user) # ... &c. def setUp(self): self.client.login( username=self.the_user.username, password=TEST_PASSWORD )
注意:如果您想知道变量 f 在示例代码中做了什么,它来自factoryboy - 一个有用的灯具库,用于为您的测试创建对象。
答案 1 :(得分:6)
取自此测试教程:https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Testing#Views
setUpTestData()在测试运行开始时调用一次,用于类级别设置。您可以使用它来创建在任何测试方法中都不会被修改或更改的对象。
在每个测试函数之前调用setUp()来设置可能被测试修改的任何对象(每个测试函数都会获得这些对象的新版本#34;
答案 2 :(得分:4)
缓存问题。即使Django在提供事务回滚的测试隔离方面做得更好,仍然会生成缓存并手动清除。
[编辑]: SetUpTestData定义每次测试后DB将恢复到的状态,并且使用仅执行一次的方法执行此操作,事务回滚由Django幕后完成。这对缓存不起作用。如果您希望每个测试的缓存都相同,则需要在每次测试之间重置它,因此需要setUp。 Django可以回滚数据库但无法回滚所有内容。
(谢谢bryan-oakley的建议)