Что такое мутационное тестирование?
Мутационное тестирование, также известное как мутационный анализ, представляет собой форму тестирования “белого ящика”, при котором тестировщики изменяют определенные компоненты исходного кода приложения. Делается это для того, чтобы убедиться, что набор тестов программного обеспечения обнаружит изменения. Все корректировки, вносимые в программное обеспечение, направлены на вызов ошибки в программе. Мутационное тестирование предназначено для обеспечения качества инструмента тестирования ПО, а не приложений, которые он анализирует.
Мутационное тестирование обычно используется для проведения модульных тестов. Его главная цель – убедиться, что тест программного обеспечения сможет обнаружить код, который не был протестирован должным образом, или скрытые дефекты, которые не были выявлены другими методами тестирования. Изменения, они же мутации, могут быть реализованы путем внесения изменений в существующие строки кода. Например, утверждение может быть удалено или продублировано, выражения true, false или другие переменные могут быть изменены. После чего код с мутациями тестируется и сравнивается с исходным кодом.
Если тесты с мутантами (новый код с мутацией) выявляют такое же количество проблем, как и тесты с исходной программой, значит либо код не выполнился, либо используемый тестовый набор не смог обнаружить мутации. В этом случае тесты программного обеспечения дорабатываются, чтобы стать более эффективным. При успешном тестировании результаты будут отличаться от результатов тестирования кода-мутанта. По окончании проверок созданные мутанты больше не используются.
Инструмент тестирования программного обеспечения оценивают с помощью показателя мутации. Оценка мутации – это количество убитых мутантов (на которые среагировали тесты), деленное на общее количество мутантов, умноженное на 100.
Оценка мутации = (количество убитых мутантов/общее количество убитых или выживших мутантов) x 100
Результат в 100% означает, что тест был адекватным.
Друзья, поддержите нас вступлением в наш телеграм канал QaRocks. Там много туторилов, задач по автоматизации и книг по QA.
Причины возникновения мутаций
Мутации – это небольшие синтаксические изменения, вносимые в исходный программный код. Они обычно содержат одну переменную, которая вызывает ошибку или сбой. Например, мутация может выглядеть следующим образом: утверждение (A<B) меняется на (A>B).
Тестировщики намеренно вносят изменения в программный код. Создается несколько версий исходной программы, каждая со своей мутацией. Затем мутанты тестируются вместе с оригинальным приложением. Закончив тестирование, QA инженеры сравнивают результаты с тестом оригинальной программы.
После исправления программного обеспечения мутанты могут быть сохранены и повторно использованы в другом мутационном тестировании. Если результаты тестирования измененного кода и оригинальной программы отличаются, то мутанты могут быть уничтожены.
Мутанты, на которые тесты не реагируют должным образом, обычно называются выжившими, а мутанты, обнаруженные в процессе мутационного тестирования, называются убитыми. Существуют и эквивалентные мутанты, которые в точности повторяют исходный код, даже если у них есть различия в синтаксисе. Они не могут быть убиты тестами и по этой причине не учитываются в оценке мутаций. Их распознавание – одна из самых больших проблем в мутационном тестировании.
Типы мутационного тестирования
Существует три основных типа мутационного тестирования:
- Мутация утверждений. Операторы удаляются или заменяются на другие. Например, “A=10 на B=5” заменяется на “A=5 на B=15”.
- Мутация значений. Значения изменяют для поиска ошибок. Например, “A=15” заменяется на “A=10” или “A=25”.
- Мутация решений. Арифметические или логические операторы изменяются для обнаружения ошибок. Например, “(A<B)” меняют на “(A>B).”.
Преимущества и недостатки
Преимущества мутации кода:
- Помогает идентифицировать слабые тесты или код.
- Гарантирует высокий уровень обнаружения ошибок.
- Увеличивает применение объектно-ориентированных фреймворков и модульных тестов.
- Предлагает больше инструментов для мутационного тестирования благодаря увеличению количества фреймворков и модульных тестов.
- Помогает организациям определить полезность инструмента тестирования оценочным методом.
Недостатки мутации кода:
- Непрактичность при отсутствии средств автоматизации.
- Серьезные потери времени и средств из-за большого количества тестируемых мутантов.
Инструменты мутационного тестирования
Инструменты для мутационного тестирования помогают ускорить процесс генерации мутантов. Ниже приведены примеры инструментов с открытым исходным кодом:
- Insure++.
- Jester для JUnit.
- PIT для Java и виртуальной машины Java.
- MuClipse для Eclipse.
Их можно использовать для запуска модульных тестов для проверки автоматически измененного кода. Инструменты также могут создавать отчеты, которые показывают убитые и живые мутации, а также отсутствие покрытия, тайм-ауты, память и ошибки запуска.
Как проводить мутационное тестирование
Основные шаги выполнения мутационных тестов.
- Напишите модульный тест.
- Напишите код для прохождения теста.
- Запустите мутационный тест одновременно с кодом, чтобы убедиться, что код и тест работают.
- Внесите некоторые изменения в код и прогоните новый код через тест. Для подтверждения эффективности теста в каждом мутанте должна быть одна ошибка.
- Сравните результаты исходного кода и версии с мутацией.
- Если результаты не совпадают, значит, тест успешно идентифицировал мутанта.
- Если тестовый пример выдал одинаковый результат между исходным и измененным кодом, тест не выполнен, и мутант сохраняется.
- Также может быть рассчитана оценка мутации, которая определяется по формуле, приведенной выше.
Мутационное тестирование против регрессионного тестирования
На первый взгляд, регрессионное тестирование можно перепутать с мутационным. Регрессионное тестирование проверяет новые изменения в программе, чтобы убедиться, что старая программа продолжает работать с этими изменениями. Разработчики QA отдела создают сценарии тестирования кода, которые проверяют новые блоки кода после их написания.
В то время как регрессионное тестирование используется для проверки возникновения новых проблем в программе при внесении новых изменений, мутационные тесты слегка изменяют в код, чтобы убедиться, что тест программного обеспечения работает так, как задумано.
Перевод статьи Alexander S. Gillis «Mutation testing».