单元测试不可变对象变量?

时间:2019-01-24 10:59:51

标签: python unit-testing class

我在更改类方法中的对象变量时遇到问题。示例:

import unittest

class Example(unittest.TestCase):

    def setUp(self):
        self.var_A = "foo"

    def test_1(self):
        self.assertEqual(self.var_A, "foo")
        self.var_A = "bar"

    def test_2(self):
        self.assertEqual(self.var_A, "bar")

if __name__ == '__main__':
    unittest.main()

test_2 失败,因为在 test_1

self.var_A的值尚未更改为“ bar”

如果我尝试将其放置在setUp之外并通过self.__class__.var_A进行更改,则它会起作用。
工作示例:

import unittest

class Example(unittest.TestCase):
    var_A = "foo"

    def setUp(self):
        pass

    def test_1(self):
        self.assertEqual(self.var_A, "foo")
        self.__class__.var_A = "bar"

    def test_2(self):
        self.assertEqual(self.var_A, "bar")

if __name__ == '__main__':
    unittest.main()

问题:第二个示例为何有效而第一个示例无效?
之所以令人困惑,是因为它似乎self.var_A是不可变的,并且在 setUp 之后无法更改,但是我可以将其用作其他测试方法中对象的一部分

1 个答案:

答案 0 :(得分:1)

测试运行程序将为每种测试方法执行setUp()方法,因此每次重置setUp()中定义的属性。这是有意记录的FWIW-您不希望测试相互依赖。

另一方面,

Class属性被保留,这就是第二个示例“有效”的原因。

请注意,还有一个setUpClass方法仅对测试用例中的所有测试执行一次,但是您只应将其用于设置为1 /只读和2 /设置成本较高的属性。再一次,您的测试不应依赖于其他测试的副作用,每个测试都必须独立工作,并且每个测试都必须能够执行(或不执行)同一测试用例中的其他任何测试。