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'])
Вернуться на верх