Python 单元测试&x27;s拆卸和设置don';不要以相同的方式更新属性

Python 单元测试&x27;s拆卸和设置don';不要以相同的方式更新属性,python,unit-testing,scope,installation,teardown,Python,Unit Testing,Scope,Installation,Teardown,我正在编写一些单元测试,在每次测试之前我都要做一些准备,在每次测试之后我都应该撤销这些单元测试。因此,我使用设置来准备它们,使用列表来列出我执行的操作,在拆卸过程中,我撤消所述列表中列出的操作并清除列表 但是,当我进行以下测试时,列表的状态与tearDown离开它时的状态不同,而是处于上一个安装程序离开它时的状态。感觉很奇怪。我做错什么了吗 下面是一个简短的示例,没有我的业务代码: class MyTest(TestCase): val = [] def setUp(self)

我正在编写一些单元测试,在每次测试之前我都要做一些准备,在每次测试之后我都应该撤销这些单元测试。因此,我使用设置来准备它们,使用列表来列出我执行的操作,在拆卸过程中,我撤消所述列表中列出的操作并清除列表

但是,当我进行以下测试时,列表的状态与tearDown离开它时的状态不同,而是处于上一个安装程序离开它时的状态。感觉很奇怪。我做错什么了吗

下面是一个简短的示例,没有我的业务代码:

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 = []
.
开始前,val=[] 安装后:val=['AAA'] 拆卸前,val=['AAA'] 拆卸后,val=[] .
开始之前,val=['AAA']#将
self.val
替换为
MyTest.val
val
是类级变量,而不是对象级变量。另一种方法是在
setUp
中初始化
self.val
,而不是将其作为类级变量。

val
是类属性。当您这样做时:

self.val.append("AAA")
self.val = []
这将修改
val
的类版本。但是,当您这样做时:

self.val.append("AAA")
self.val = []
创建名为
val
的实例属性,并将其设置为空列表。您在这里真正想做的是:

self.val[:] = []

这将修改可变类属性
val

将其更改为
MyTest.val
在我的系统上工作。非常感谢!我理解我的错误。我可能会通过显式地创建instance属性或将类“one”与MyClass.val一起使用来更清楚地表达我的意图,具体取决于我必须对代码进行的重构(我不太喜欢self.val[:]的可读性)