Почему 100% покрытие кода больше не является обязательным

Почему 100% покрытие кода больше не является обязательным

13 июня 2025 г.

Представьте, что вы в больнице.

Вы лежите в комнате, ожидая лечения с совершенно новым высокотехнологичным медицинским устройством. Техник ведет его - Слик, современный, свежо, сборочной линии.

При настройке, они случайно упоминают:

«Это устройство только что вошло - сначала использовалось в реальном мире!»

А потом:

«Наши инженеры протестировали около 85% от его доставки. Довольно твердое, верно? У вас все будет в порядке».

Вы бы позволили им продолжить?

Наверное, нет. Вы бы попросили их остановиться, и вы вышли прямо из комнаты.

Мы все инстинктивно понимаем:85% протестированных недостаточно безопасны, когда на линии на линии нет реальной жизни.Итак, почему мы принимаем этот стандарт, когда в ставки включают миллионы пользователей, миллиарды долларов или критически важную инфраструктуру?


Наш код ничем не отличается

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

И все же, как -то мы нормализовали эту идею, что 75% покрытие кода «довольно хорошее», и что 85% - «удивительны».

Это не качество. Это игра.

Если четверть вашего кода не проверена, кто -товоляпротестировать это.

СПОЙЛЕР: Это будут ваши клиенты.


Почему высокого охвата недостаточно

Когда разработчики начинают писать тесты, они склонны сосредоточиться на «счастливых путях» - основных вариантах использования. Они важны, но просто их охватывает, возможно, на 50–60%.

Далее идут краевые случаи и обработка ошибок. Это может подтолкнуть вас к магическому количеству отрасли 75% или 85%, если вы особенно тщательно.

Но это длится 15%?

Это темный угол, где прячутся жуки. Это где живут редкие условия и странные входные данные. И чаще всего, именно здесь ваша система ломается -или используется.

В облаке краевые случаи не редки. В масштабе они случаютсявсе время.


Почему на самом деле имеет значение 100% покрытие кода

Добавление до 100% - это не перфекционизм или метрики тщеславия. Это оустойчивостьПолем Когда вы нажимаете на этот номер, происходит несколько важных вещей:

  • Надежность: Меньше ошибок достигают производства. Клиенты доверяют вашему программному обеспечению.
  • Устойчивость: Никто не может проникнуть в непроверенную логику - наскальментировать или случайно.
  • Скорость: Рефакторинг становится безопаснее. Вы двигаетесь быстрее с меньшим количеством регрессий.
  • Детерминизм: Вы устраняете флакированные тесты, которые случайным образом терпят неудачу, и тратить ваше время.

Я работал в командах, которые продвигали покрытие с 85% до 100%. Каждый раз мы обнаруживали настоящие ошибки на этом последнем отрезок - иногда дажеДизайн недостатковилимертвый кодМы не знали, что существует.


Но на 100% в инструменте не означает, что вы закончили

Ваш инструмент покрытия кода может сообщать о «100%», но это не всегда означает, что каждая строка действительно проверена. Часто существует несколько строк, таких как сбои сбоев или оборонительная регистрация, которые трудно или нецелесообразно тестировать.

Это нормально.

Просто отметьте их явно и позвоните в обзор кода. Важно то, чтоНикто не может спрятаться за цифрамиЧтобы избежать написания надлежащих тестов.


ЕДИНИЦА

Давайте будем ясны: 100% модульный тестовый охват имеет решающее значение, но это не вся история.

Тебе все еще нужноинтеграционные тестыВТестовые сценарии, имониторинг системного уровняЧтобы поймать, какие модульные тесты не могут.

В некоторых проектах мы также отслеживали охват для интеграции и сценариев, нацеленных на 80%. Это сложнее запечатлеть, но невероятно ценное, когда сможете.


Но как насчет мусорных тестов?

Общий откат:

«Если мы приведем на 100% охват, люди будут писать бесполезные тесты, чтобы пройти ворота».

Да, этот риск существует. И ответ прост:

  1. Обзоры кода- Не просто просмотрите функции - просмотрите тесты. Убедитесь, что онииметь в видучто-нибудь.
  2. Мутационное тестирование-Это изменение игры.

Что такое тестирование на мутации?

Тестирование на мутации задает более глубокий вопрос:
Ваши тесты действительно ловят настоящие ошибки?

Он работает, внедряя небольшие, преднамеренные изменения в ваш код - например, перевернутьtrueкfalse, или меняется>к<Полем Они называютсямутантыПолем

Затем он запускает ваши тесты.

Если ваш тестовый набор ловит изменение и терпит неудачу, мутантубитыйПолем


Если тест в любом случае проходит, мутантвыживает- И это проблема.

Выжившие мутанты означает, что ваши тесты слишком мелкие. Тестирование на мутации подчеркивает их.

Мы использовали такие инструменты, как stryker.net для c# иcargo-mutantsДля ржавчины подтвердить качество нашего теста. Результаты всегда открывают глаза-и делают ваш тестовый набор значительно лучше.


Сделайте ваши тесты детерминированными

Тяжелые тесты - кошмар. Они разрушают доверие к вашему трубопроводу CI и тратят время.

Основная причина? ОбычноНедотерминизм: Часы в реальном времени, случайные входы, общее глобальное состояние или внешние зависимости.

Чтобы исправить это:

  • Вытекайте в внешние системы
  • Используйте виртуализированное время (например,,TimeProviderв .net)
  • Избегайте полагаться на глобальное состояние окружающей среды

Тесты должны вести себя точно так же - каждый раз, когда они работают.


Последние мысли

Если вы стремитесь к 75% тестовым покрытиям, выДоставка ошибокПолем

Период.

100% модульный тестовый покрытие - это не роскошь или право хвастаться - этобазовый уровеньДля серьезного профессионального инженера.

Это то, как мы строим надежные системы.

Это то, как мы движемся быстро, не ломая вещи.

Это то, как мы защищаем наших пользователей, нашу команду и нашу репутацию.

Итак, в следующий раз, когда кто-то скажет вам: «85% достаточно хороши», спросите их, будут ли они доверять спасительному устройству, которое было протестировано на 85%.

Бьюсь об заклад, вы уже знаете ответ.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE