1

我正在编写一些单元测试,在每次测试之前我都有一些准备工作,并且我应该在每次测试后撤消这些测试。所以我使用 setUp 来准备它们,使用列表来列出我已经执行的操作,在 tearDown 中,我撤消所述列表中列出的操作并清除列表这样做。

但是当我到达以下测试时,列表与 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

将返回

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 == []吗?之前的tearDown似乎没有改变该值,我不知道为什么。有什么想法吗?

4

2 回答 2

2

替换self.valMyTest.valval是类级变量,而不是对象级变量。另一种方法是在self.val内部进行初始化,setUp而不是使其成为类级变量。

于 2018-03-30T16:48:53.360 回答
1

val是一个类属性。当你这样做时:

self.val.append("AAA")

这会修改val. 但是,当您这样做时:

self.val = []

您创建一个名为的实例属性并将val其设置为一个空列表。你真正想做的是:

self.val[:] = []

这将修改可变类属性val

于 2018-03-30T17:00:44.570 回答