Использовал ли модуль copy в Python для тестирования?

«Использовал ли модуль copy в Python для тестирования?» — вопрос из категории Python, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, использовал модуль copy при написании автотестов на Python, в основном для подготовки и изоляции тестовых данных. Это критически важно, когда тесты работают с изменяемыми объектами (списками, словарями, пользовательскими классами), чтобы изменения в одном тесте не влияли на другие.

Основные сценарии использования в QA:

  1. Создание фикстур: Глубокая копия сложного конфигурационного объекта перед его модификацией для конкретного тестового случая.
  2. Проверка функций, изменяющих входные данные: Использую copy.deepcopy(), чтобы сохранить исходное состояние данных для последующего сравнения (assert) с результатом работы функции.
  3. Изоляция тестов: Поверхностное или глубокое копирование данных, которые инициализируются на уровне модуля или класса (например, в setUp), для каждого отдельного тестового метода.

Пример из практики тестирования:

import copy

def test_process_user_data_modifies_input():
    # Исходные тестовые данные
    original_users = [
        {'id': 1, 'name': 'Alice', 'roles': ['admin']},
        {'id': 2, 'name': 'Bob', 'roles': ['user']}
    ]

    # Сохраняем копию для проверки
    users_backup = copy.deepcopy(original_users)

    # Вызываем тестируемую функцию, которая может изменить список
    result = process_user_data(original_users)

    # Проверяем, что функция не изменила исходные объекты внутри списка
    # Без deepcopy это assertion мог бы упасть из-за побочного эффекта
    assert original_users[0]['roles'] == users_backup[0]['roles']
    assert result is not None  # Основная проверка логики

Без copy тесты становятся хрупкими и зависимыми от порядка выполнения.