Меню

Фикстуры с тестовыми данными: структура и воспроизводимость

Фикстуры с тестовыми данными делают проверки повторяемыми: один сценарий — одна запись, закреплённая заранее. Разбираем, как называть наборы, какие образцы в них держать и почему случайные данные мешают отладке.

Опубликовано

  • фикстуры
  • тестовые данные
  • автотесты

Фикстура — это заранее подготовленный набор данных, на котором выполняется проверка. Она нужна не ради красоты, а ради повторяемости: если каждый запуск теста получает новую случайную запись, то и падение, и успех одинаково невоспроизводимы. Ниже разберём, чем фикстура отличается от случайно сгенерированного значения, как устроить набор так, чтобы им можно было пользоваться годами, и какие образцы обязательно должны в нём быть.

Что такое фикстура и чем она отличается от случайных данных

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

Фикстура решает эту проблему, фиксируя вход целиком. Она описывает не «какое-то имя», а конкретную запись с конкретными значениями, и эта запись хранится вместе с тестом. Тогда падение воспроизводится одним повторным запуском, а не поиском подходящего случая.

Разница видна и в назначении. Случайные данные проверяют, что система работает на произвольном вводе. Фикстуры проверяют, что она правильно обрабатывает заранее названные случаи. Это разные задачи, и подменять одну другой не стоит.

Почему случайная запись при каждом запуске мешает отладке?

Потому что она превращает падение в событие, которое нельзя повторить. Сообщение об ошибке содержит значения, которых в следующем запуске уже не будет, а значит, воспроизвести дефект можно только гадая. Чем реже случайность воспроизводит нужное сочетание, тем дольше длится разбор.

Есть и обратная сторона. Если генератор случайных значений настроен так, что всегда выдаёт похожие записи, то он годами не проверяет ничего нового: короткие имена, простые адреса, одинаковые даты. Покрытие оказывается иллюзорным — тестов много, а случаев, на которых логика ломается, среди них нет.

Практичный компромисс — сочетать оба подхода. Основной набор собирается из фикстур и покрывает названные сценарии. Отдельные проверки могут дополнительно прогонять случайные записи, но при падении такие тесты обязаны сохранять запись, на которой они упали, иначе их результат бесполезен.

Как называть фикстуры по сценарию

Имя фикстуры должно отвечать на вопрос, что она проверяет, а не откуда взялась. Название вида «запись номер четыре» не сообщает ничего, тогда как «человек с одним именем» или «запись без региона» сразу объясняет и назначение, и ожидаемое поведение.

Полезно держать два уровня описания. Внутри файла — комментарий или заголовок, который фиксирует, что это за случай и какое поведение ожидается. Снаружи — короткое имя, по которому запись находят в наборе и в отчёте о падении. Когда тест падает, в отчёте должно быть видно, какой именно случай сломался, без открытия исходников.

Отдельно стоит записать, чего в фикстуре быть не должно. Если образец создавался для проверки одного поля, лишние подробности в нём только мешают: они увеличивают набор и создают связи, которых никто не планировал.

Какие образцы стоит держать в наборе

  • Человек с одним именем, без фамилии.
  • Очень длинное составное имя с несколькими компонентами.
  • Имя с диакритикой и имя, записанное не латиницей.
  • Запись с обратным порядком частей имени.
  • Дата рождения ровно на возрастном пороге и за день до него.
  • Дата рождения 29 февраля.
  • Адрес без региона и адрес с длинным названием региона.
  • Номер документа на нижней и на верхней границе допустимой длины.

Этот список стоит не расширять бесконечно, а поддерживать. Каждый образец должен проверять конкретное поведение: длинная запись — вёрстку и предел поля, односложное имя — обязательность второго поля, граничная дата — расчёт возраста. Как такие значения уживаются друг с другом, разобрано в статье про согласованность полей.

Как закрепить запись в генераторе

В генераторе данных личности одна и та же запись возвращается по одному и тому же ключу личности. Это позволяет не хранить фикстуру вручную, а воспроизводить её: ключ записывается рядом с тестом, и все поля записи — имя, дата рождения, номер документа, адрес и контакты — приходят те же самые. Если нужен другой набор, берётся другой ключ; если нужен тот же — повторяется прежний.

Такой подход удобен тем, что фикстура не устаревает вслед за списком в файле и не разъезжается с описанием. Достаточно проверить, что ключ по-прежнему даёт ожидаемую запись, а не сверять десятки строк. Как имена и адреса подбираются под страну, описано в статье про имена в разных странах, а образцы на возрастных границах — в статье про проверку возраста.

Значения из этого материала созданы генератором исключительно для тестовых фикстур. Они не описывают реальных людей, и попытка выдать себя за другого человека или пройти проверку личности с их помощью недопустима.

Когда фикстуру пора обновить?

Фикстуры стареют сразу по нескольким причинам. Первая — время: граничная дата, подобранная относительно текущего дня, со временем перестаёт быть граничной, и тест начинает проверять не то, что задумано. Вторая — изменения в правилах: формат почтового индекса или длина номера документа в стране могут измениться, и образец перестанет быть правдоподобным. Третья — изменения в самом продукте: поле, ради которого создавался образец, могли убрать вместе с проверкой.

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

Что важно разработчику: структура набора и его старение

Первое — держите фикстуры рядом с теми проверками, которые ими пользуются, но не дублируйте их копиями. Один образец, размноженный по десяти файлам, при первом же изменении разъедется на десять разных версий, и понять, какая из них правильная, будет невозможно.

Второе — задайте форму набора. Записи удобно описывать одной структурой с понятными именами полей, а не набором отдельных строк, порядок которых нужно помнить. Тогда добавление нового поля не превращается в правку всего файла.

Третье — следите за старением. Набор, созданный два года назад, может содержать дату рождения, из-за которой возраст давно перестал быть граничным: то, что было «ровно восемнадцать лет» при написании теста, сегодня стало «двадцать лет». Граничные значения нужно пересчитывать относительно текущей даты, а не хранить как готовое число.

Четвёртое — не превращайте фикстуру в свалку. Если образец перестал проверять то, ради чего создавался, его лучше удалить или заменить, иначе набор растёт, а польза от него падает.

Что делать дальше

Возьмите свои самые нестабильные проверки и посмотрите, на каких данных они выполняются. Если на случайных — замените вход фикстурой и убедитесь, что падение теперь повторяется. Затем соберите небольшой набор образцов из списка выше, начиная с одного и того же имени и граничной даты. Готовые записи можно получить и закрепить ключом в генераторе, выбрав подходящую страну.

Читать дальше

Статьи: Генератор данных личности и тестовых данных онлайн