unittest 的 tearDown 和 setUp 不会以相同的方式更新属性
unittest's tearDown and setUp don't update the properties the same way
我正在编写一些单元测试,在每次测试之前我都需要做一些准备,并且我应该在每次测试后撤消这些测试。所以我正在使用 setUp 来准备它们,使用列表来列出我执行的操作,并且在拆解中,我撤消了所述列表中列出的操作并清除了列表。
但是当我进行以下测试时,列表与 tearDown 离开时的状态不同,而是之前 setUp 离开时的状态。而且感觉很奇怪。我是不是做错了什么?
这是一个简短的示例,没有我的业务代码:
class MyTest(TestCase):
val = []
def setUp(self):
super().setUp()
print("before setup, val = {}".format(self.val))
self.val.append("AAA")
print("after setup: val = {}".format(self.val))
def tearDown(self):
super().tearDown()
print("before teardown, val = {}".format(self.val))
self.val = [] # or whatever
print("after teardown, val = {}".format(self.val))
def test_one(self):
assert True
def test_two(self):
assert True
会return
before start, val = []
after setup: val = ['AAA']
before teardown, val = ['AAA']
after teardown, val = []
.
before start, val = ['AAA'] # <- why is this not []??
after setup: val = ['AAA', 'AAA']
before teardown, val = ['AAA', 'AAA']
after teardown, val = []
.
第二个测试的setUp不应该找到.val == []吗?这个值似乎没有被之前的拆解改变过,我不知道为什么。
有什么想法吗?
将 self.val
替换为 MyTest.val
。 val
是一个 class-level 变量,而不是 object-level 变量。另一种方法是在 setUp
中初始化 self.val
而不是将其设为 class-level 变量。
val
是一个 class 属性。当你这样做时:
self.val.append("AAA")
这修改了 val
的 class 版本。但是当你这样做时:
self.val = []
您创建了一个名为 val
的实例属性并将其设置为一个空列表。你真正想在这里做的是:
self.val[:] = []
这将修改可变 class 属性 val
。
我正在编写一些单元测试,在每次测试之前我都需要做一些准备,并且我应该在每次测试后撤消这些测试。所以我正在使用 setUp 来准备它们,使用列表来列出我执行的操作,并且在拆解中,我撤消了所述列表中列出的操作并清除了列表。
但是当我进行以下测试时,列表与 tearDown 离开时的状态不同,而是之前 setUp 离开时的状态。而且感觉很奇怪。我是不是做错了什么?
这是一个简短的示例,没有我的业务代码:
class MyTest(TestCase):
val = []
def setUp(self):
super().setUp()
print("before setup, val = {}".format(self.val))
self.val.append("AAA")
print("after setup: val = {}".format(self.val))
def tearDown(self):
super().tearDown()
print("before teardown, val = {}".format(self.val))
self.val = [] # or whatever
print("after teardown, val = {}".format(self.val))
def test_one(self):
assert True
def test_two(self):
assert True
会return
before start, val = []
after setup: val = ['AAA']
before teardown, val = ['AAA']
after teardown, val = []
.
before start, val = ['AAA'] # <- why is this not []??
after setup: val = ['AAA', 'AAA']
before teardown, val = ['AAA', 'AAA']
after teardown, val = []
.
第二个测试的setUp不应该找到.val == []吗?这个值似乎没有被之前的拆解改变过,我不知道为什么。 有什么想法吗?
将 self.val
替换为 MyTest.val
。 val
是一个 class-level 变量,而不是 object-level 变量。另一种方法是在 setUp
中初始化 self.val
而不是将其设为 class-level 变量。
val
是一个 class 属性。当你这样做时:
self.val.append("AAA")
这修改了 val
的 class 版本。但是当你这样做时:
self.val = []
您创建了一个名为 val
的实例属性并将其设置为一个空列表。你真正想在这里做的是:
self.val[:] = []
这将修改可变 class 属性 val
。