Раздел 43 · Автотестирование с нуля

Данные в базе: сиды, фабрики, откат и изоляция

middle~30 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Оля · DevOps, #qa-antrakt

Две новости. Первая: на общем стенде 340 пользователей с почтами вида user_XkPqLmZa@antrakt.test, все созданы между тремя и половиной четвёртого ночи, ни у одного нет заказов. Вторая: вчера я впервые запустила ночной прогон в четыре потока, чтобы он шёл не час, а пятнадцать минут. Упало 37 тестов, и каждый раз разные. В одном потоке всё зелёное.

Вера Ланская · лид QA, #qa-antrakt

Первое это мусор Глеба, второе это тоже Глеб: в его conftest.py перед каждым тестом стоит TRUNCATE всех таблиц. В одном потоке это работает, в четырёх каждый поток стирает данные трём другим. Разберись, кто за чем убирает.

В прошлом уроке тест научился читать базу. Сегодня он будет в неё писать: класть состояние, которое нужно проверке, и убирать за собой. Здесь легко сделать набор, который зелёный у тебя и красный в CI, или чистый в CI и замусоривший общий стенд. Разберём, какие данные бывают, как их создавать воспроизводимо и как убирать так, чтобы параллельные прогоны не мешали друг другу.

Гостиничный номер

В гостинице три вида вещей. Мебель и шторы принадлежат номеру: их не уносят и не меняют между гостями. Вещи гостя приезжают и уезжают вместе с ним. А мусор после гостя убирает горничная, и если она не пришла, следующий гость заселяется в чужие обёртки.

Ещё в гостинице есть три способа подготовить номер. Можно убрать за прошлым гостем. Можно взять номер, где никто не жил. А можно, как в сказке, отмотать время назад, будто гостя и не было.

В базе всё так же. Сиды это мебель. Данные теста это вещи гостя. Уборка бывает трёх видов: удалить своё, очистить всё целиком, откатить транзакцию. Ошибки Глеба легко назвать на этом языке. Его тесты уезжали и оставляли вещи в номере. А его TRUNCATE это горничная, которая выносит вещи из всех номеров этажа, пока в них живут гости.

урок из курса

Урок из курса «Автотестирование с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.