Django Unit Tests - Изменения свойств self сохраняются от теста к тесту
У меня есть тестовый класс, который устроен следующим образом. Мы импортируем словарь из файла test_helpers, который имеет некоторые данные по умолчанию. Данные установлены как FORM_DATA['value_A'] = 0
и FORM_DATA['value_B'] = 1000000
с самого начала.
Устанавливаю ли я FORM_DATA в значение self.form_data или присваиваю его переменной в каждом тесте, не имеет значения. Во втором тесте, похоже, сохраняются изменения словаря из первого теста, что не идеально для тестирования.
Я добавил кучу отладочных операторов print, чтобы показать, что происходит. Даже в setUp() для 2-го теста он показывает значения из предыдущего теста! Что здесь происходит? Почему словарь 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
для создания мелкой копии .
Измените вашу функцию setUp на:
def setUp(self):
self.form_data = FORM_DATA.copy()
print("setUp", self.form_data['value_A'], self.form_data['value_B'])