Меню

Масштабирование тестовых данных по странам: инварианты и исключения

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

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

  • масштаб
  • инварианты
  • генерация

Масштабирование тестовых данных по странам почти никогда не упирается в объём. Подготовить сведения по нескольким десяткам стран — механическая работа. Настоящая трудность начинается позже: когда нужно понять, кто отвечает за какие утверждения и как узнать, что очередная добавленная страна ничего не сломала.

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

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

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

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

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

Как разделить общие утверждения и перечень исключений?

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

Типичные примеры общих утверждений:

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

Исключения — это сведения, которые верны не для всех, а для конкретной страны. Они не нарушают общие утверждения; они их дополняют. У одной страны нет почтового обозначения. У другой адрес содержит больше строк, чем принято. Третья пишется символами не латинского алфавита. Четвёртая использует название, не совпадающее с привычным международным.

Различие проводит простой вопрос: если завтра добавится новая страна, должно ли это утверждение остаться верным? Если да — это общее утверждение. Если оно верно только для части стран — это исключение.

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

Как сделать генерацию воспроизводимой?

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

Что для этого нужно:

  1. Полное описание входа. Набор определяется перечнем стран, перечнем исключений и версией правил. Все три части должны быть известны и зафиксированы.
  2. Отсутствие зависимости от текущего момента. Время получения не должно влиять на содержимое. Если какое-то значение меняется со временем, оно задаётся входом, а не берётся из окружения.
  3. Отсутствие зависимости от порядка обхода. Порядок записей определяется правилом сортировки, а не тем, в каком порядке файлы попали в память.
  4. Явная версия набора. К набору должна прилагаться метка, позволяющая отличить его от предыдущего.

Отдельно стоит сказать про случайность. Случайный выбор допустим, но источник случайности должен задаваться входом. Тогда «случайный» набор становится воспроизводимым, а это именно то, что нужно: разнообразие без потери сравнимости.

Когда стоит переходить к выборке вместо полного перебора?

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

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

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

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

Что проверять при добавлении новой страны?

Добавление страны — это не «добавить запись», а небольшой протокол. Он должен быть одинаковым для каждой новой страны, иначе качество набора начнёт зависеть от того, кто именно её добавлял.

Протокол выглядит так:

  1. Прогнать общие утверждения. Если какое-то из них перестало выполняться, останавливаться и разбираться. Скорее всего, дело не в новой стране, а в том, что она вскрыла давнее допущение.
  2. Проверить, нужны ли исключения. Возможно, страна не имеет особенностей, и тогда перечень не меняется. Это нормальный и хороший исход.
  3. Сверить сведения с источником. Если у страны есть особенности, они должны опираться на источник и дату, а не на память автора.
  4. Добавить образец в набор. Один представитель, проверяющий именно те свойства, из-за которых страна попала в набор.
  5. Убедиться, что выборка выросла осмысленно. Если новая страна попадает в уже представленный слой и ничего нового не проверяет, стоит спросить, зачем она нужна.

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

Что важно разработчику

Первое: держите перечень исключений в системе контроля версий рядом с набором. Исключения, живущие в переписке или в чьей-то памяти, теряются при первой же смене состава команды.

Второе: у каждого исключения должно быть основание. Не «так исторически сложилось», а ссылка на источник и дату. Без основания исключение невозможно ни проверить, ни отменить.

Третье: не ослабляйте общие утверждения ради одной страны. Если общее утверждение мешает, это повод разобраться в модели данных, а не убрать проверку.

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

Пятое: проверьте, что набор воспроизводится. Прогоните его дважды на одном входе и сравните результат целиком. Расхождение означает, что где-то осталась зависимость от окружения или от порядка обхода.

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

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

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

Перечни утверждений, исключений и примеры сбоев в этой статье — условная схема, приведённая для объяснения порядка работы. Она не описывает проверки какой-либо существующей системы и не является полным перечнем утверждений.

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

Статьи: Форматы адресов и данных личности по странам