Статьи

Усиление тестирования с помощью мутаций: опыт инженера DevOps

Я работаю инженером DevOps в крупном общедоступном приложении, которое имеет около 90+ микросервисов (на основе Java). Мы постоянно сталкиваемся со сценариями, которые мы обнаруживаем в полевых условиях, которые не были зафиксированы ни в одном из наших испытаний. Несмотря на улучшение наших стратегий тестирования и оценки покрытия кода, мы не смогли оценить «силу» наших тестовых случаев.

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

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

Вам также может понравиться:  Mutation Testing: покрытие вашего кода правильными тестовыми примерами

Традиционные подходы к покрытию тестами имеют недостаток, поскольку они проверяют только код, выполняемый тестовыми примерами, и показывают код, который не охватывается. Они не помогают нам оценивать или идентифицировать скрытые проблемы в коде. Мутация позволяет разработчикам писать сильные случаи (а не просто указывать, был ли выполнен код во время выполнения тестовых случаев) и по сути обеспечивает тщательный тест кода.

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

Я попытался просмотреть концепции, которые я понял, и ключевые аспекты, которые я обнаружил в этом путешествии. Некоторые из самых больших задач заключались в том, чтобы донести это до наших разработчиков, успешно включить PIT Mutation Testing в нашей экосистеме и включить его в процесс сборки. Я суммирую свои знания и проблемы, с которыми мы столкнулись в этом путешествии: я надеюсь помочь моим коллегам-инженерам.

Я начинаю с некоторых основ о тестировании мутаций; Вы можете найти эти данные в открытом доступе на разных сайтах / порталах.

Что такое мутация?

При тестировании на мутацию мы модифицируем наш исходный код и запускаем тестовые примеры для нашего кода. Эти модификации исходного кода называются мутантами. Предположим, если вы написали (x> y) в своем коде, мутантом этого может быть код с (x <y).

Как только код мутанта запускается против ваших тестовых случаев, если он выживает (проходит тестовые случаи), он становится частью выживших мутантов. Если мутант терпит неудачу во время выполнения ваших тестовых случаев, он становится частью убитых мутантов. Чем больше убитых мутантов, тем сильнее ваши тесты.

Причина запуска мутаций — написать конкретные тестовые сценарии, которые должны убить мутанта.

Типы мутационного тестирования

Тестирование на мутации можно разделить на три категории: мутация значения, мутация решения и мутация оператора.

Значение Мутация

Он изменяет значение в исходном коде для обнаружения ошибок.

Пример:  if(x=)заменить x на что-то отличное от 20.

Решение Мутации

Они изменяют решения / условия для проверки ваших случаев на предмет ошибок проектирования.

Пример: if (  ), изменить   объект на NullnewResponse   instanceof   ErrorResponsenewResponse

Мутации
операторов Это изменяет оператор, удаляя или добавляя одну и ту же строку, чтобы проверить, скопировал ли разработчик код и вставил его.

Оценка мутации

Оценка мутаций — это единица, которая определяет, насколько силен / эффективен ваш анализ мутаций. Он определяется как:


Оценка мутации = (убитые мутанты / общее количество мутантов) * 100

Включение PIT с вашим исходным кодом Java

Существует несколько решений, которые могут включить анализ мутаций в вашем коде Java. Однако в этой статье мы рассмотрим инструмент PIT, чтобы включить тестирование мутаций. PIT быстрее и проще в использовании по сравнению с другими инструментами. Кроме того, он активно развивается и поддерживается.

Обратитесь к странице Github для PIT .

Мутаторы в Яме

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

Мутаторы по умолчанию

Условный граничный мутатор — заменяет реляционные операторы <, <=,>,> =

Инкременты Mutator  — заменить инкременты на декременты и наоборот.

Invert Negatives Mutator  — инвертирует отрицание целого числа и числа с плавающей точкой.

Math Mutator заменяет двоичные арифметические операции для целочисленных или арифметических операций с плавающей точкой другими операциями.

Отклонить условный мутатор  — отменить условные проверки.

Возвращаемые значения мутаторногомутирует в  возвращаемых значениях вызова метода в зависимости от типа возвращаемого значения методы. Для типа возвращаемого объекта, изменяется на ноль .

Void Method Calls Mutator удаляет вызовы методов для void методов.

Мутаторы не по умолчанию

Конструктор вызовов мутаторныйзаменяет конструктор  вызовов с нулем .

Inline Constant Mutatorизменяет  встроенные константы и заменяет значения по умолчанию в зависимости от типа данных.

Вызовы методов без Void Mutator удаляет вызовы методов для не void методов, и их возвращаемое значение заменяется значением Java по умолчанию для этого конкретного типа.

Remove Conditionals Mutator удалить все условные операторы, чтобы всегда выполнялись защищенные операторы.

Мутатор переменных-членов (экспериментальный) удаление назначений переменных-членов, а также конечных членов.

Switch Mutator (Experimental)изменяет  оператор switch, заменяя метку по умолчанию.

Настройка PIT

Настройте PIT плагин в вашей IDE

Вы можете перейти на рынок Eclipse, скачать плагин PIT и запустить мутационные тесты.

Включение Pit для вашего Java-кода

1. Добавить зависимость

Вам нужно добавить зависимость для pitest в pox.xml , чтобы загрузить jeste jar.


XML