python - unittest 的tearDown 和setUp 不会以相同的方式更新属性

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

最佳答案

self.val 替换为 MyTest.valval 是类级别变量,而不是对象级别变量。另一种方法是在 setUp 中初始化 self.val,而不是使其成为类级变量。

关于python - unittest 的tearDown 和setUp 不会以相同的方式更新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49578050/

相关文章:

python - 多处理,pool.ready 做什么?

unit-testing - 单元测试Web Api 2模拟用户

unit-testing - 如何对第三方库包装器进行单元测试?

bash - 为什么这个自定义采购函数不能使我声明的变量全局可用?

超时后循环中的javascript变量作用域/闭包

python - 使用浏览器使用 Python3 更新 facebook 状态

python - Numpy 函数输出随着每次运行而增加

python - 无法在 jupyter notebook 中导入模块;错误的系统路径

unit-testing - 如何从多个维度构建 BDD 单元测试?

ruby-on-rails - 将数组或参数传递给 Rails 中的 hstore 范围时出错