繁体   English   中英

Django 单元测试 - 对自身属性的更改在测试之间持续存在

[英]Django Unit Tests - Changes to self properties are persisting from test to test

我有一个测试 class 具有这样的设置。 我们从包含一些默认数据的 test_helpers 文件中导入字典。 数据从一开始就设置为FORM_DATA['value_A'] = 0FORM_DATA['value_B'] = 1000000

我是否将 FORM_DATA 设置为 self.form_data 值,或者将其分配给每个测试中的变量,都无关紧要。 第二次测试似乎保留了第一次测试的字典更改,这对于测试来说并不理想。

我添加了一堆打印调试语句来显示正在发生的事情。 即使在第二次测试的 setUp() 中,它也会显示上一次测试的值? 这里发生了什么。 为什么字典 self?form_data 不能成为每次新测试时默认导入的数据?

from test_helpers import FORM_DATA

class TestBaselineScenarios(TestCase):
    @classmethod
    def setUpClass(cls):
        super(TestBaselineScenarios, cls).setUpClass()
        long_running_data_setup()

    def setUp(self):
        self.form_data = FORM_DATA
        print("setUp", self.form_data['value_A'], self.form_data['value_B'])

    def test_one(self):
        print("1")
        print(self.form_data['value_A'], self.form_data['value_B'])
        self.form_data['value_A'] = 25000
        self.form_data['value_B'] = 700000
        print("2")
        print(self.form_data['value_A'], self.form_data['value_B'])
        simulation = test_helpers.create_simulation(form_data=self.form_data)
        simulation.run()
        self.assertEqual(0.8416667, round(simulation.success_rate(), 7))

    def test_two(self):
        print("3")
        print(self.form_data['value_A'], self.form_data['value_B'])
        self.form_data['value_A'] = 10000
        print("4")
        print(self.form_data['value_A'], self.form_data['value_B'])
        simulation = test_helpers.create_simulation(form_data=self.form_data)
        simulation.run()
        self.assertEqual(0.9916667, round(simulation.success_rate(), 7))
setUp 0 1000000
1
0 1000000
2
25000 700000


setUp 25000 700000
3
25000 700000
4
10000 700000

当您运行此代码时:

self.form_data = FORM_DATA

您实际上并没有复制FORM_DATA的内容,只是存储了对它的引用。 因此,当您运行self.form_data['value_A'] = 25000时,您也在更改FORM_DATA

下次运行setUp时,它只是将修改后的FORM_DATA的相同引用分配回self.form_data

尝试做一份FORM_DATA的副本。

Python 有几种方法可以创建事物的副本。 假设FORM_DATA是一个字典,最简单的是调用dict.copy 如果它更复杂,您还可以使用内置的copy来创建浅拷贝

将您的设置 function 更改为:

    def setUp(self):
        self.form_data = FORM_DATA.copy()
        print("setUp", self.form_data['value_A'], self.form_data['value_B'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM