Смогут ли ваши тесты пережить грядущий апокалипсис мутантов?

Эффективны ли ваши модульные тесты против мутаций кода? Нет, вам не нужно беспокоиться о том, что ваш код подвергнется бомбардировке гамма-лучами или вас укусит радиоактивный паук. Вопрос в том, будут ли ваши тесты обнаруживать незначительные изменения в кодовой базе, которые могут иметь катастрофические последствия. Мутационное тестирование существует с 1971 года, но большинство людей в мире программного обеспечения о нем не слышали. Так что поздравляем, вы только что узнали что-то, что может удивить ваших сверстников за обеденным столом.

Взломать код легко

Это может быть потрясающей новостью, но инженеры-программисты не идеальны. Мы делаем ошибки, но именно поэтому мы тестируем. Код, написанный во время кодирования в 2 часа ночи, весь разрекламированный на Jolt Cola, может стать легендой, которая создаст следующее приложение, меняющее парадигму, но одна опечатка может привести к катастрофе. Вы когда-нибудь тратили часы за часами на отладку критического дефекта, который приводил к чему-то глупому, например, к использованию неправильного оператора или, что еще хуже, к отсутствующей точке с запятой?

100% покрытие кода = эффективные тесты

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

«И знаете, что самое худшее? Я НИКОГДА НЕ НАУЧИЛСЯ ЧИТАТЬ ТЕСТ.”

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

Так что же такое мутационное тестирование?

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

показатель выживаемости мутантов = количество убитых мутантов / общее количество мутантов

Создание армии мутантов

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

Приведенный выше код может привести к 50 или более мутантам, против которых затем будут выполняться ваши модульные тесты. Если какой-либо из этих мутантов не вызывает провала теста, он «выживает».

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

Вы еще не боитесь мутантов?

Не тревожьтесь. Эти мутанты здесь, чтобы спасти вас. Высылайте мутантов! Сохраните свои тесты. Ваш проект может быть одним нажатием клавиши жирным пальцем от катастрофы.

Узнайте больше: Придайте вашим тестам силу мутанта с помощью PIT [Часть 1]

Исходный источник статьи