Вы действительно спрашиваете: «Помогли ли здесь модульные тесты?», Или вы спрашиваете: «Могли ли здесь помочь какие-либо тесты?».
Наиболее очевидная форма тестирования, которая могла бы помочь, - это предварительное условие в самом коде, что идентификатор ветви состоит только из цифр (предположим, что это предположение основано на кодере при написании кода).
Это могло произойти в каком-то интеграционном тесте, и как только будут введены новые буквенно-цифровые идентификаторы ветвей, утверждение разрушится. Но это не юнит тест.
В качестве альтернативы может быть проведен интеграционный тест процедуры, которая генерирует отчет SEC. Этот тест гарантирует, что каждый реальный идентификатор ветви сообщает о своих транзакциях (и, следовательно, требует реального ввода данных, списка всех используемых идентификаторов ветви). Так что это тоже не юнит тест.
Я не вижу никакого определения или документации задействованных интерфейсов, но может случиться так, что модульные тесты не могли обнаружить ошибку, потому что модуль не был неисправен . Если подразделению разрешено предполагать, что идентификаторы ветвей состоят только из цифр, и разработчики никогда не принимали решения о том, что должен делать код, если это не так, то они не должнынаписать модульный тест для обеспечения определенного поведения в случае нецифровых идентификаторов, потому что тест отклонил бы гипотетическую допустимую реализацию модуля, который правильно обрабатывал буквенно-цифровые идентификаторы ветвей, и вы обычно не хотите писать модульный тест, который препятствует действительному будущие реализации и расширения. Или, может быть, один документ, написанный 40 лет назад, неявно определил (с помощью некоторого лексикографического диапазона в необработанном EBCDIC, вместо более удобного для человека правила сопоставления), что 10B является идентификатором теста, потому что в действительности он находится между 089 и 100. Но тогда 15 лет назад кто-то решил использовать его в качестве реального идентификатора, поэтому «ошибка» не заключается в блоке, который правильно реализует исходное определение: он заключается в процессе, который не заметил, что 10B определен как тестовый идентификатор и, следовательно, не должен назначаться ветви. То же самое произошло бы в ASCII, если вы определили 089-100 в качестве диапазона тестирования, а затем ввели идентификатор 10 $ или 1,0. Просто так получается, что в EBCDIC цифры идут после букв.
Один модульный тест (или, возможно, функциональный тест), который возможновозможно, спас день, является тестом модуля, который генерирует или проверяет новые идентификаторы ветви. Этот тест подтвердит, что идентификаторы должны содержать только цифры, и будет записан, чтобы позволить пользователям идентификаторов ветвей предполагать то же самое. Или, может быть, где-то есть модуль, который импортирует реальные идентификаторы ветвей, но никогда не видит тестовые, и который может быть проверен модулем, чтобы убедиться, что он отклоняет все тестовые идентификаторы (если идентификаторы состоят только из трех символов, мы можем перечислить их все и сравнить поведение валидатор к тестовому фильтру, чтобы убедиться, что они совпадают, что касается обычного возражения против выборочных тестов). Затем, когда кто-то изменил правила, модульный тест не прошел бы, так как он противоречит новому обязательному поведению.
Поскольку тест проводился по уважительной причине, точка, в которой вам нужно удалить его из-за изменившихся бизнес-требований, дает возможность кому-то получить работу: «найдите в коде все места, которые зависят от поведения, которое мы хотим менять". Конечно, это сложно и, следовательно, ненадежно, так что это никоим образом не гарантирует спасения дня. Но если вы фиксируете свои предположения в тестах юнитов, свойства которых вы приобретаете, то вы даете себе шанс, и поэтому усилия не пропадают впустую.
Я согласен, конечно, что если бы единица не была определена в первую очередь с помощью ввода «забавной формы», то проверять было бы нечего. Непросто правильно проверить разделение пространства имен, поскольку сложность заключается не в реализации вашего забавного определения, а в том, чтобы все понимали и уважали ваше забавное определение. Это не локальное свойство одной единицы кода. Кроме того, изменение некоторого типа данных с «строки цифр» на «строку буквенно-цифровых символов» сродни созданию программы, основанной на ASCII, для обработки Unicode: это будет непросто, если ваш код сильно связан с исходным определением, и когда тип данных является основополагающим для того, что делает программа, тогда он часто тесно связан.
это немного тревожно думать, что это в значительной степени потраченные впустую усилия
Если ваши юнит-тесты иногда терпят неудачу (например, во время рефакторинга) и при этом дают вам полезную информацию (например, ваши изменения неверны), тогда усилия не пропали даром. Чего они не делают, так это проверяют, работает ли ваша система. Так что, если вы пишете модульные тесты вместо функциональных и интеграционных тестов, вы можете использовать свое время неоптимально.