我有一个测试类,它有这样的设置。我们从具有一些默认数据的test_helpers文件中导入一个字典。数据从一开始就被设置为FORM_DATA['value_A'] = 0和FORM_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发布于 2022-08-23 12:19:08
运行此代码时:
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。如果比较复杂,还可以使用built-in copy library创建一个浅拷贝。
将setUp函数更改为:
def setUp(self):
self.form_data = FORM_DATA.copy()
print("setUp", self.form_data['value_A'], self.form_data['value_B'])https://stackoverflow.com/questions/73458568
复制相似问题