Как стенд паритета доказывает верность переписывания
Стенд паритета повторяет реальный трафик, точно сравнивает результаты, контролирует случайность и выявляет спорные ошибки старой системы.

Переписанная система готова, когда на значимых входных данных ведет себя так же, как заменяемая. Чистая архитектура, успешные модульные тесты и знакомые экраны не доказывают, что новая система проводит те же суммы по счетам, выбирает ту же налоговую базу или отклоняет ту же неверно составленную корректировку. Это доказывает стенд паритета. Он отправляет один и тот же записанный запрос в обе системы, фиксирует каждый наблюдаемый результат, нормализует только те поля, которым разрешено меняться, и показывает расхождение, которое может объяснить ответственный сотрудник.
Все это похоже на обычное регрессионное тестирование, пока в дело не вступают деньги, даты, состояние и внешние эффекты. Тогда простое сравнение перестает работать. Старое приложение может читать часы посреди расчета, зависеть от порядка записей, округлять после каждой строки, повторно брать устаревший курс или записывать пять строк до возврата одного ответа. Некоторые из этих особенностей входят в требования. Другие возникли случайно, но от них уже зависят пользователи. Третьи остаются ошибками. Стенд должен различать их, не скрывая неудобных доказательств.
Я использую паритет как аргумент для приемки, а не как процент на панели. Аргумент состоит из четырех частей: воспроизводимый ввод представляет реальную эксплуатацию, обе системы начинают с эквивалентного состояния, правила сравнения заданы явно, а у каждого принятого расхождения есть ответственный и причина. Если хотя бы одна часть расплывчата, зеленый результат мало что значит.
Чем паритет отличается от обычного регрессионного тестирования
Стенд паритета сравнивает две реализации одного поведения. Набор регрессионных тестов сравнивает одну реализацию с ожиданиями, которые записали люди. От этого различия зависит, что способен найти каждый тест. Модульный тест может подтвердить, что переписанная функция начисления процентов совпадает с выбранной для теста формулой. Но он не сообщит, что старая система отбрасывает часть дневной ставки до капитализации, если кто-то заранее не знал об этой особенности и не закрепил ее в тесте. Повтор одной и той же операции по счету в обеих системах сразу покажет разницу.
Старая система дает исполняемую спецификацию, но она не безошибочна. Если считать ее оракулом, результат надо воспринимать как доказательство, а не как истину. Стенд должен сообщить, что старая система вернула 104,17, а новая 104,18. Владелец продукта, финансовый контролер или назначенный владелец предметной области решает, относится этот цент к контракту или к дефекту. Тестовый механизм не должен принимать такое решение, незаметно округляя оба значения до совпадения.
Регрессионные тесты все равно нужны. Они изолируют правила, покрывают искусственные граничные случаи и выполняются достаточно быстро для каждого коммита. Паритет охватывает сочетания, которые никто не догадался описать: строку с нулевой суммой после кредит-ноты, клиента с двумя календарями выставления счетов или программу на RPG, которая по-разному обрабатывает пробелы и нули. Оставьте оба вида тестов. После решения по расхождению превратите его в точечный регрессионный тест, чтобы команде не пришлось снова исследовать большую запись трафика.
Стенд сравнивает больше, чем видимый ответ. Наблюдаемый контракт транзакции может включать изменения в базе, созданные файлы, сообщения в очереди, бухгалтерские проводки, коды состояния, категории ошибок и порядок. Если замена возвращает правильную сумму, но проводит ее в неверном отчетном периоде, сравнение одних ответов дает опасный ложный пропуск. Задайте границу наблюдения до записи трафика и включите каждый эффект, который видит другая система или человек.
Записанному трафику нужен контракт воспроизведения
Полезная запись содержит достаточно данных для воспроизведения намерения и не превращается в бесконтрольную копию журналов. Обычных журналов доступа почти никогда не хватает. В них могут отсутствовать тела запросов, подтвержденная личность, состояние сеанса, заголовки для выбора бизнес-правила или последовательность, которая создала текущее состояние базы. В журналах также могут оказаться секреты, которым нельзя попадать в тестовое хранилище.
Используйте версионируемый конверт воспроизведения. В нем указано, что поступило, какой контекст повлиял на поведение, какая контрольная точка состояния нужна и какие результаты проверит стенд. Практический формат выглядит так:
{
"case_id": "close-004812",
"captured_at": "2026-01-31T23:58:42Z",
"operation": "POST /accounts/close",
"identity_ref": "role:month_end_operator",
"state_checkpoint": "ledger-2026-01-31-r7",
"request": {"account_id": "A1842", "period": "2026-01"},
"observe": ["response", "ledger_entries", "outbox"]
}
Храните ссылки на личности и секреты, но не действующие учетные данные. Заменяйте персональные поля только детерминированным сопоставлением, потому что случайная анонимизация может разрушить связи и бизнес-смысл. Если клиент 842 встречается в запросе, строке проводки и таблице адресов, очищенный набор должен сохранить эти ссылки связанными. Сохраняйте длину строк и классы символов, когда от них зависит проверка.
Для выборки нужна письменная политика. Случайный срез частых запросов дает объем, но нередко пропускает редкие случаи с финансовым или операционным риском. Сочетайте производственную выборку с намеренно выбранными группами: тип операции, успех и отказ, крупные и нулевые суммы, календарные границы, необычные кодировки, долгие задания и каждая ветвь, связанная с деньгами или правами. Записывайте многошаговые сеансы как упорядоченные случаи, если поздние вызовы зависят от ранних.
Не меняйте исходную запись. Создавайте из нее очищенные и воспроизводимые наборы с помощью версионируемых преобразований и отмечайте версию преобразования в каждом запуске. Иначе измененный фильтр поменяет ввод, пока команда считает, что оценивает только новую программу. Доступ к записям должен быть узким, срок хранения конечным, а идентификаторы сбойного случая надо показывать через контролируемую диагностику, не выгружая полные записи в журналы CI.
Эквивалентное начальное состояние входит в тест
Один запрос к разным данным ничего не доказывает. Перед каждой единицей воспроизведения обеим реализациям нужно логически эквивалентное состояние, включая справочные таблицы, настройки функций, позиции последовательностей, границы пакетной обработки и записи, созданные предыдущими шагами. Обычно подготовить это труднее, чем отправить запрос.
Выберите наименьшую границу сброса, которая сохраняет смысл. Чистый расчет предложения может запускаться с компактным набором для каждого случая. Для закрытия счета может понадобиться упорядоченный сценарий с несколькими предыдущими проводками. Ночному заданию может требоваться полная контрольная точка базы и управляемая очередь. Сбрасывать всю среду перед каждым запросом медленно, а одна изменяемая база позволяет случаям влиять друг на друга. Объединяйте случаи в независимые сценарии, сбрасывайте состояние на их границах и сохраняйте порядок запросов внутри группы.
Не требуйте одинаковых физических схем. Модернизированный сервис с Postgres не должен копировать файлы VSAM или физический файл AS/400 только ради удобного сравнения. Создайте адаптеры состояния, которые выражают одни и те же бизнес-факты в каждом представлении. Затем сравнивайте наблюдаемые бизнес-результаты, а не внутреннюю структуру таблиц. Паритет архитектуры лишил бы переписывание смысла.
В подготовку состояния должны входить значения, о которых часто забывают: бизнес-дата, база часовых поясов, локаль, метаданные валюты, режим округления, налоговые таблицы, курсы, начальные значения последовательностей и контекст авторизации. Привяжите зависимости к версии набора. Если старая программа выбирает курс по дате действия, а новая берет последнюю строку на сегодня, одинаковый JSON запроса все равно задает разные задачи.
Проверяйте подготовку, а не доверяйте загрузчику. Перед выполнением вычислите компактный семантический отпечаток, например количества и хеши канонических бизнес-записей. Старый и новый отпечатки не совпадут побайтно из-за разных схем, но смогут подтвердить факты: 418 открытых позиций, одинаковую сумму основного долга по каждой валюте и один набор идентификаторов активных правил. Ошибка подготовки должна остановить случай как недействительный, а не проявиться позже как расхождение приложений.
Точное сравнение начинается с канонических значений
Сравнивайте деньги как десятичные значения с объявленным масштабом и валютой, но не как форматированные строки или двоичные приближения с плавающей точкой. Выражение «до цента» звучит просто, однако команды регулярно сравнивают 12,3 с «12,30», преобразуют оба значения во float или округляют лишь итог, хотя старая программа округляет каждую строку. Стенду нужен арифметический контракт предметной области.
IEEE 754 объясняет, почему двоичное число с плавающей точкой не может точно представить многие десятичные дроби. Это не делает неверным каждый расчет с float. Но необъяснимый эпсилон плохо подходит для политики финансового паритета. Разбирайте денежные результаты на десятичные коэффициенты и масштабы, затем применяйте бизнес-правило на том же этапе, что и рабочая система. Если контракт требует округлять каждую налоговую строку от нуля, делайте это до суммирования. Если промежуточная ставка должна сохранять четыре знака, сравните ее, когда она наблюдаема, или добавьте точечную диагностику.
Канонизация должна удалять шум представления, сохраняя смысл. Она может приводить время к UTC, сортировать явно неупорядоченное множество по стабильным бизнес-полям, обрабатывать отсутствующие необязательные поля JSON по контракту API и декодировать дополненное значение фиксированной ширины. Нельзя менять регистр чувствительных идентификаторов, сортировать видимую пользователям последовательность, удалять дубликаты строк или сводить все ошибки к общему отказу.
Задайте политику как читаемые данные, а не прячьте ее в сравнительном коде:
rules:
- path: response.total_due
type: decimal
scale: 2
tolerance: 0
- path: response.generated_at
type: timestamp
mode: injected-clock
- path: outbox[*].headers.trace_id
mode: ignore
reason: generated transport identifier
- path: response.allocations
mode: ordered
Такая политика не даст безобидной чистке расширить допуск на весь набор. Требуйте причину для каждого игнорируемого пути и каждого ненулевого допуска. Проверяйте изменения политики так же, как рабочий код: компаратор способен скрыть дефект эффективнее, чем переписывание способно его создать.
Сообщайте о расхождении на уровне бизнес-поля, а не двумя огромными блоками JSON. Полезный результат выглядит как invoice.lines[7].tax: legacy 1.34, rewrite 1.35, после чего идут примененное правило сравнения и версия набора. Показывайте общие количества, но не позволяйте совпадению 99,9 процента скрыть провалившуюся десятую долю. Один неверный вычет из зарплаты важнее тысяч одинаковых проверок доступности.
Контролируйте недетерминизм до его исключения
Большую часть недетерминизма можно превратить во входные данные. Внедрите часы, задайте генератор случайных чисел, зарезервируйте идентификаторы, заморозьте справочники и изолируйте конкурентное выполнение. Когда обе программы получают одинаковые явные значения, стенд проверяет поведение, а не сравнивает две случайности.
Отнесите каждое меняющееся поле к одной из четырех групп. Контролируемые значения получают одинаковый ввод в обеих системах. Канонические отличаются представлением, но сводятся к одному смыслу. Игнорируемые не имеют бизнес-значения, например транспортный идентификатор трассировки. Статистическим результатам нужен отдельный тест, потому что один повтор не доказывает паритет стохастической модели. Такая классификация точнее глобального списка исключений и дает проверяющим конкретные правила для обсуждения.
Время вызывает большинство предотвратимых сбоев. Процесс может читать часы при получении запроса, при проводке и еще раз при форматировании ответа. Если заменить лишь последний timestamp, логика на границах дат останется бесконтрольной. Все обращения к бизнес-часам в новой системе должны идти через внедряемый источник. Старую систему по возможности запускайте в изолированной среде с управляемым системным временем, перехватывайте ее источник времени или фиксируйте использованные значения и сравнивайте производные результаты в сценарии, который не пересекает границу. Никогда не меняйте часы общего рабочего хоста.
Сгенерированным идентификаторам нужна корреляция, а не равенство, если они не несут предметного смысла. Допустим, обе системы создают новый ID требования, затем используют его в трех строках и событии. Свяжите старый ID с новым в точке создания и проверьте, что последующие ссылки сохраняют эту связь. Исключение всех ID скроет сломанную внешнюю ссылку. Требование одинаковых последовательностей привяжет новую систему к детали реализации.
Для конкурентности нужны повторяемые управляемые тесты, а не оптимистичная нормализация. Если порядок результата не входит в контракт, сравнивайте мультимножество и все равно проверяйте кратность. Если две проводки конкурируют за один баланс, принудительно воспроизведите оба чередования с барьерами вокруг спорных чтения и записи. Широкий допуск не оправдывает потерянные обновления. Отделяйте нагрузочные и длительные тесты от семантического паритета, но превращайте найденный там сбой в небольшой воспроизводимый сценарий паритета.
Внешние эффекты надо фиксировать, а не дублировать
Воспроизведение не должно отправлять настоящие платежи, письма, задания на печать или сообщения партнерам. Замените границу регистратором, который принимает ту же команду, возвращает управляемое подтверждение и сохраняет каноническое представление для сравнения. Нужно доказать, что новая система намеревалась выполнить тот же эффект, но не выполнять его дважды.
Ставьте регистраторы на последней подконтрольной границе. Перехват внутреннего вызова функции может дать успех при неверной сериализации, маршрутизации или заголовках. Перехват за границей может затронуть третью сторону. Для брокера сообщений записывайте итоговый топик, бизнес-заголовки, значимое поле секционирования и полезную нагрузку после сериализации. Для файлового интерфейса сохраняйте байты и разобранное бизнес-представление, если фиксированная ширина, кодировка или окончания строк входят в контракт.
Эффекты в базе требуют сравнения с учетом транзакций. Снимите состояние нужных бизнес-сущностей до запуска, выполните случай и вычислите изменение после. Сравнивайте вставки, обновления, удаления и инварианты между двумя представлениями. Не сравнивайте напрямую время аудита или суррогатные ID, если от них не зависят потребители. Проверяйте равенство дебетов и кредитов, одну строку outbox на подтвержденное действие и отсутствие частичного бизнес-изменения после отката.
Отказы тоже являются результатами. Сопоставляйте класс ошибки, статус, возможность восстановления и внешние эффекты. Точный текст старой ошибки не всегда стоит сохранять, особенно если новая система возвращает структурированную ошибку, но вызывающий компонент может зависеть от кода или сигнала повтора. Запишите это правило совместимости. Замена, превращающая постоянную ошибку проверки в повторяемую ошибку сервера, способна причинить больше вреда, чем разница на один цент на экране.
Регистратор должен показывать повторные попытки. При повторах сравнивайте идемпотентность всей последовательности: первый запрос, потерянное подтверждение, повторный запрос и итоговое состояние. Две одинаковые исходящие команды не становятся безвредными только потому, что тестовая среда следующего компонента приняла обе.
Для расхождения нужен след решения
Каждое расхождение должно пройти небольшой явный процесс: воспроизведение, локализацию, классификацию, назначение ответственного и фиксацию решения. Без такого следа команды либо днями преследуют безобидные временные метки, либо отмахиваются от финансовых различий ради срока.
Сначала сократите неудачный сценарий. Сохраните контрольную точку состояния, удалите посторонние записи и уменьшайте последовательность запросов, пока расхождение не останется в минимальном случае. Затем исследуйте первое разошедшееся наблюдаемое значение, а не итоговую сумму. Разница в один цент по счету может начаться с округления одной строки, а двадцать следующих полей лишь повторят ее. Храните сокращенный случай рядом со стендом и запускайте при каждом изменении.
Используйте короткий набор классов:
- Дефект новой системы: новая реализация нарушает принятое старое поведение.
- Дефект стенда: состояние, запись, нормализация или наблюдение неверны.
- Одобренное исправление: старое поведение ошибочно, ответственный разрешил новый результат.
- Изменение контракта: организация намеренно меняет поведение шире исправления дефекта.
- Не решено: пока не хватает доказательств или ответственного, поэтому выпуск для этого случая заблокирован.
В записи об одобрении должны быть случай, поле, старое значение, новое значение, обоснование, согласовавший, дата решения и регрессионный тест, который теперь определяет ожидаемое поведение. Избегайте свободных исключений вроде «проблема округления принята». Через шесть месяцев никто не поймет, касалось ли оно одной налоговой юрисдикции или всех расчетов. Ограничивайте срок широких исключений и запрещайте шаблонные пропуски без ограниченной причины.
Полезный артефакт сбоя помещается в проверку и не раскрывает полную рабочую запись. Включите очищенный ввод, семантический отпечаток состояния, оба нормализованных результата, структурированный diff, версию политики и команду воспроизведения. По такому пакету инженер воспроизведет результат, пока владелец предметной области оценит реальное бизнес-последствие.
Если старая система ошибается, сохраняйте доказательства
Известные старые дефекты должны стать одобренными расхождениями, а не хитростями компаратора. Сначала докажите, что новая система дает иной результат. Затем покажите, почему старый результат нарушает выбранное правило. Наконец, запишите, кто отвечает за решение изменить наблюдаемое поведение. Так технические полномочия миграции остаются отделены от бизнес-полномочий.
Популярный совет «сначала добиться совпадения, исправить потом» полезен, только если это «потом» действительно наступит. Он сокращает число одновременных переменных и упрощает анализ миграции. Совет вреден, если сохраняет известную переплату, воссоздает небезопасный путь авторизации или закрепляет испорченные данные, потому что второе изменение никто не запланировал. Порядок определяют тяжесть и обратимость. Временно сохраняйте безвредные странности, если это снижает риск выпуска. Вредное поведение исправляйте до переключения с явным одобрением и уведомлением.
Проверяйте одобренные исправления двумя утверждениями. Утверждение паритета документирует намеренную разницу: старая система выдает X, замена выдает Y. Бизнес-регрессия доказывает Y через независимое правило или пример. Если позднее удалить старую сторону, второй тест останется долговечной спецификацией. Он также не даст будущему сопровождающему «исправить» новую систему обратно к старому дефекту после красного случая.
Исторические данные могут переносить дефект дальше. Правильная программа все еще способна расходиться со старыми отчетами, потому что сохраненные балансы, флаги состояний или производные поля уже содержат неверные результаты. Для каждого затронутого класса записей решите, надо ли его мигрировать, пересчитать, изолировать или сохранить. Репетируйте эту политику данных в той же контрольной точке, что и воспроизведение. Паритет программы без решения по данным оставляет аргумент переключения неполным.
Сообщайте об измененном поведении на границе, где его заметят пользователи или зависимые системы. Для исправленной суммы может потребоваться отчет сверки. Более строгая проверка может обнаружить записи, которые старая система молча принимала. Исправление авторизации способно нарушить рабочий процесс. В следе решения должен быть операционный ответ, а не только арифметическое обоснование.
Исполнителю старой системы нужен стабильный интерфейс
Стенд должен вызывать старую систему через самую узкую стабильную границу, которая все еще задействует настоящее поведение. HTTP endpoint удобен, если уже существует, но многие старые пути начинаются с пакетного файла, записи в очереди, транзакции терминала или хранимой процедуры. Оберните точку входа исполнителем, который принимает конверт воспроизведения, устанавливает контекст, ждет завершения и возвращает наблюдения в едином версионируемом формате. Не переписывайте бизнес-логику в оболочке. Каждое скопированное правило создает еще одну реализацию, которая может разойтись.
Отделяйте работоспособность исполнителя от результата приложения. Тайм-аут, недоступный регион, сбой загрузки набора или ошибка регистратора делают случай неопределенным. Это не означает, что старая система вернула ошибку, и тем более не считается паритетом. Используйте конверт результата, различающий completed, application_failure и infrastructure_failure, и прикладывайте журналы заданий или диагностические коды с контролируемым хранением. Так нестабильная тестовая инфраструктура не завысит кажущуюся долю совпадений.
Изоляция ресурсов нужна, когда у старой платформы есть глобальное состояние. Два параллельных повтора могут использовать общие временные файлы, имена заданий, генераторы последовательностей или рабочую таблицу, которую производственная программа считает доступной одному писателю. Явно блокируйте такие ресурсы или выделяйте изолированные пространства имен, если платформа позволяет. Если изоляция невозможна, выполняйте затронутый сценарий последовательно и укажите это в метаданных. Быстрый стенд, меняющий измеряемое поведение, дает худшие доказательства, чем более медленный, но честный.
Версионируйте исполнитель, адаптеры, политику сравнения, наборы и кандидатную сборку в каждом результате. Идентификатора воспроизведения должно хватать для восстановления всех пяти компонентов. По возможности храните артефакты по адресу содержимого, чтобы проверяющий мог доказать использование тех же нормализованных результатов в позднем отчете. Защищайте итоговые приемочные пакеты по действующим правилам управления изменениями. Стенду не нужна новая бюрократия, но его доказательства должны жить не меньше одобрения выпуска.
Наконец, испытайте сам стенд намеренно внесенными расхождениями. Измените один цент, удалите запись outbox, переставьте два упорядоченных распределения, сдвиньте бизнес-дату и принудительно оставьте изменение после отката в контролируемом наборе. Каждая мутация должна вызвать ожидаемый сбой на уровне поля. Команды постоянно тестируют прикладную программу и считают компаратор исправным. Компаратор, который никогда не демонстрировал чувствительность, остается непроверенной частью миграции.
Доказательства выпуска должны сопротивляться красивой статистике
Убедительный критерий выпуска называет покрытое поведение и оставшуюся неопределенность. Он не ограничивается сообщением, что прошло 98 процентов случаев. Показывайте покрытие по операциям и классам риска, число точных совпадений, одобренных исправлений, сбоев стенда, нерешенных различий и непроверенных границ. Укажите, входят ли в выборку закрытие периода, откат, повтор, неверный ввод, крупные транзакции и самые старые поддерживаемые форматы данных.
Держите критерий строгим: ни одного нерешенного расхождения в критическом классе, неожиданного внешнего эффекта, скрытого в кандидатной сборке изменения политики сравнения или ошибки подготовки, засчитанной как успех. Для менее рискованных расхождений можно принять документированное решение, но они все равно остаются в доказательствах. Знаменатель, который незаметно исключает упавшие повторы, равен мошенничеству с таблицей.
Запускайте один корпус несколько раз. Повторяемость выявляет неконтролируемое время, порядок, общее состояние и влияние среды. Затем воспроизведите свежую отложенную запись, которую разработчики не использовали при настройке новой системы. Корпус может стать целью переобучения, как набор модульных тестов. Отложенная выборка не обязана быть огромной. У нее должны быть репрезентативное защищенное происхождение и документированный метод отбора.
При переключении теневой режим может дать дополнительные доказательства, если система допускает его безопасно. Отправляйте копию подходящих рабочих чтений или команд новой системе, подавляйте ее эффекты и сравнивайте результаты вне пользовательского пути. Никогда не позволяйте обеим сторонам подтвердить теневую операцию. Следите за конфиденциальностью, емкостью и изменениями времени, которые вносит сам теневой путь.
CodeHero использует записанный производственный трафик и стенд паритета, чтобы переписанные на Go, Rust и TypeScript системы сохраняли исходное поведение при новой архитектуре. В проекте, который поставляется менее чем за 30 дней, такие доказательства надо проектировать при приеме задачи, а не собирать на встрече перед выпуском.
Приемочный пакет должен также показывать, чего воспроизведение не доказало. Перечислите операции без пригодной записи, интеграции, представленные только заглушкой, отсутствующие в наборах периоды данных и конкурентные сценарии, проверенные лишь под нагрузкой. Для каждого пробела укажите компенсирующее доказательство: точечный набор регрессионных тестов, запрос сверки, репетицию работы оператора или ограниченное по времени наблюдение после переключения. Не называйте эти проверки паритетом. Они отвечают на другой вопрос и должны сохранять такое обозначение. Тогда согласующий оценит ограниченный риск, а не будет считать, что большое число случаев покрывает все пути. Приложите реестр пробелов к итоговому результату: он станет первым планом проверки рабочего мониторинга и следующего цикла записи. Если в теневом режиме встретится непредставленная операция, добавьте ее в корпус, сохранив происхождение. Доказательства улучшаются, когда новые случаи расширяют объявленную границу. Они теряют доверие, когда команда незаметно меняет смысл слова «покрытие».
Доверие к стенду паритета создают различия, которые он отказывается скрывать. Сделайте входные данные воспроизводимыми, состояние эквивалентным, арифметику явной, переменные поля классифицированными, а исключения закрепите за ответственными. Тогда последний красный случай даст полезное доказательство, а не помеху, которую хочется покрасить в зеленый.
Вопросы
Что такое стенд паритета при переписывании системы?
Стенд запускает один записанный случай в старой и новой системах, затем сравнивает каждый наблюдаемый бизнес-результат. Он учитывает начальное состояние, правила нормализации, внешние эффекты и решения по расхождениям.
Какой объем производственного трафика надо воспроизводить?
Честного универсального процента нет. Выберите обычный трафик и добавьте редкие операции, отказы, границы сумм и календаря, повторы и ветви, влияющие на деньги или доступ.
Можно ли напрямую использовать рабочие журналы как тестовые наборы?
Обычно нет. В журналах часто отсутствуют тела, контекст личности, состояние или порядок запросов, а еще они могут раскрывать секреты. Создайте версионируемые конверты и детерминированную очистку.
Допустим ли порог расхождения для денежных значений?
По умолчанию используйте нулевой допуск после десятичного разбора и применения заданного правила округления. Ненулевой допуск разрешайте только по контракту предметной области и обосновывайте для конкретного поля.
Как сравнивать созданные идентификаторы двух систем?
Свяжите старый ID с новым при создании объекта, затем проверьте все дальнейшие ссылки. Игнорирование всех ID скрывает сломанные связи, а требование одинаковых последовательностей напрасно связывает системы.
Как работать с временными метками при проверке паритета?
По возможности внедряйте одинаковые бизнес-часы и нормализуйте представление, например часовой пояс, только с сохранением смысла. Исключение всех меток может скрыть ошибки дат проводки, окончания срока или процентов.
Что делать с известной ошибкой старой системы?
Запишите одобренное исправление со старым и новым значениями, причиной, ответственным и датой. Оставьте утверждение паритета о различии и независимый регрессионный тест исправленного правила.
Нужно ли стенду паритета сравнивать таблицы базы данных?
Сравнивайте изменения бизнес-состояния и инварианты, а не одинаковые структуры таблиц. Современная архитектура может хранить данные иначе, если создает те же подтвержденные факты, сообщения и видимое поведение.
Как безопасно тестировать внешние эффекты?
Замените границы платежей, писем, файлов, печати и партнеров регистраторами, которые фиксируют итоговую команду без выполнения. Сравнивайте данные, маршрутизацию, количество, результат транзакции и поведение при повторах.
Когда доказательств паритета достаточно для переключения?
Когда представлены критические операции и рисковые случаи, запуски повторяемы, внешние эффекты совпадают и нет нерешенных критических различий. Публикуйте одобренные исправления и непроверенные границы рядом с успешными результатами.