【问题标题】:immutable variable for unit tests单元测试的不可变变量
【发布时间】:2017-08-29 12:36:09
【问题描述】:

我有一些测试用例依赖同一个变量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'}

【问题讨论】:

  • 我不认为你的例子说明了你的问题。 self.foo 在每次测试之前在 setUp 方法中设置,因此 test_a 的更改不应影响 test_b
  • 测试用例(方法)不是沙盒。在setUp 中设置的变量是共享的。
  • @Siegmeyer 我没有说这些方法是沙盒的,我说 setUp 方法在每次测试之前运行。在test_a 中对self.foo 的更改不会对test_b 产生任何影响,因为setUp 方法将在test_b 运行之前运行并再次设置self.foo。尝试运行示例 - 两个测试都通过了。
  • @Alasdair,为此道歉。我将示例简化了很多,但我提供的初始示例并未显示效果(正如您从一开始就指出的那样)。我现在只能更新代码。这次它显示了效果......

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


【解决方案1】:

当您在setUp 方法中设置self.foo = FOO 时,您并没有复制字典,您只是将它分配给self.foo。当你设置self.foo['a']时,这会改变原来的字典FOO,所以它会影响其他测试。

您可以通过在setUp 方法中复制字典来避免此问题。

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

如果字典包含其他可变值,那么您可能必须使用deepcopy

import copy

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

【讨论】:

  • 谢谢!也为self.foo = copy.deepcopy(FOO) 提示!成功了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2013-01-14
  • 2020-03-11
  • 2011-04-27
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多