Как управлять фикстурами и тестовыми данными для использования и очистки после тестов
Что проверяют
Умеете ли вы писать независимые тесты: каждый сам готовит данные и сам за собой убирает, а порядок запуска ни на что не влияет. Интервьюер смотрит, знаете ли вы механизмы своего фреймворка и что будет, если тест упал на середине. Следом часто спрашивают про параллельный запуск.
Как отвечать
Покажите на своём фреймворке. Для pytest:
- фикстура с
yield: всё доyieldэто подготовка, после него очистка. Очистка выполнится, даже если тест упал на ассерте, в отличие от удаления данных в конце самого теста; - область действия:
scopeбываетfunction(по умолчанию),class,module,package,session. Дорогие ресурсы вроде подключения к базе или браузера живут всю сессию, изменяемые данные создаются на каждый тест; conftest.py: фикстуры отсюда доступны тестам этого каталога и вложенных без импорта;- фабрика как фикстура: фикстура возвращает функцию, которая создаёт сущности с нужными полями и запоминает их для удаления.
В JUnit 5 то же делают @BeforeEach и @AfterEach, в Playwright Test свои фикстуры объявляются через test.extend.
Про сами данные:
- создание через API или напрямую в базе: через UI дольше и нестабильнее;
- уникальность: имена и почты генерируются через
uuidили Faker, иначе параллельные тесты вpytest-xdistстолкнутся. У Faker задавайте seed, чтобы падение воспроизводилось; - очистка: откат транзакции подходит, когда тест и код работают в одном соединении. Для тестов через API созданное удаляют в teardown или поднимают отдельную базу на прогон через Testcontainers;
- страховка на общем стенде: тестовые сущности помечают префиксом и периодически чистят скриптом.
Где спотыкаются
Тесты зависят друг от друга: один создаёт пользователя, другой его использует. Запуск по отдельности или в другом порядке всё ломает.
Делают изменяемые данные с областью session. Один тест поменял объект, и следующие падают по непонятной причине.
Рассчитывают на откат транзакции в e2e-тестах. Приложение коммитит в своём соединении, и в базе копится мусор.