Django setUpTestData()与setUp()

时间:2015-04-03 08:37:19

标签: python django unit-testing

Django 1.8附带a refactored TestCase,允许通过setUpTestData()方法使用事务和保存点在类级别进行数据初始化。这与在每种测试方法之前运行的unittest的setUp()形成对比。

问题:现在setUp()存在,Django中setUpTestData()的用例是什么?

我只是在寻找客观的,高级别的答案,否则这个问题对Stack Overflow来说太宽泛了。

3 个答案:

答案 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的建议)