unittest的tearDown和setUp不会以同样的方式更新属性

时间:2018-03-30 16:38:23

标签: python unit-testing scope installation teardown

我正在编写一些单元测试,在每次测试之前我都有一些准备工作,每次测试后我应该撤消。因此,我使用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 == []?以前的泪水似乎没有改变价值,我不知道为什么。 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

indexedDB替换为self.valMyTest.val是类级变量,而不是对象级变量。另一种方法是在val内初始化self.val,而不是将其作为类级变量。

答案 1 :(得分:1)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>是一个类属性。当你这样做时:

val

这会修改self.val.append("AAA") 的班级版本。但是当你这样做时:

val

您创建名为self.val = [] 的实例属性并将其设置为空列表。你真正想做的是:

val

这将修改可变类属性self.val[:] = []