我在更改类方法中的对象变量时遇到问题。示例:
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 之后无法更改,但是我可以将其用作其他测试方法中对象的一部分
答案 0 :(得分:1)
测试运行程序将为每种测试方法执行setUp()
方法,因此每次重置setUp()
中定义的属性。这是有意记录的FWIW-您不希望测试相互依赖。
Class属性被保留,这就是第二个示例“有效”的原因。
请注意,还有一个setUpClass
方法仅对测试用例中的所有测试执行一次,但是您只应将其用于设置为1 /只读和2 /设置成本较高的属性。再一次,您的测试不应依赖于其他测试的副作用,每个测试都必须独立工作,并且每个测试都必须能够执行(或不执行)同一测试用例中的其他任何测试。