单元测试的不可变变量

时间:2017-08-29 12:36:10

标签: django python-3.x unit-testing

我有一些依赖于同一变量foo

的测试用例
from unittest import TestCase

# actually FOO is imported because it is quite big
FOO = {'key_a': 'aaa', 'key_b': 'bbb'}

class TestFoo(TestCase):
    def setUp(self):
        self.foo = FOO

    def test_a(self):
        self.foo['key_a'] = 'ccc'
        self.assertEqual(self.foo['key_a'], 'ccc')

    def test_b(self):
        self.assertEqual(self.foo['key_a'], 'aaa')

我遇到的问题是,一旦我将test_a中的值更改为

        self.foo['key_a'] = 'ccc'
对于所有后续测试,

值“保持”这种方式。 test_b中的断言失败,因为self.foo['key_a']的值仍为'ccc'

如何在所有测试中编写测试用例self.foo{'key_a': 'aaa', 'key_b': 'bbb'}

1 个答案:

答案 0 :(得分:2)

当您在setUp方法中设置self.foo时,您没有复制字典,只是将其分配给self.foo['a']。当您设置FOO时,这会改变原始字典setUp,因此会影响其他测试。

您可以通过在class TestFoo(TestCase): def setUp(self): self.foo = FOO.copy() 方法中复制字典来避免此问题。

import copy

class TestFoo(TestCase):
    def setUp(self):
        self.foo = copy.deepcopy(FOO)

如果字典包含其他可变值,则可能必须使用share the state

ManyToOne