Так как ваша цель - разработать набор тестов, адекватный мутациям, неубитые мутанты, по сути, предоставляют руководство для того, что тестировать.В идеале ваш вопрос должен содержать несколько примеров для генерируемых мутантов, которые не уничтожаются вашим набором тестов, чтобы другие могли прокомментировать, как писать тесты, которые убивают их.
Позвольте мне лучше ответить на ваш вопрос с общими рекомендациями и примерами.Я не знаком с конкретным инструментом тестирования мутаций, который вы используете, но в целом вы должны следовать процессу, подобному следующему *:
Выберите мутанта, который не был убит вашим тестомустановить и определить, можно ли его убить (мутант может быть семантически эквивалентен вашей программе - если да, отбросить его из пула мутантов).
Написать тест, который убиваетвыбранный мутант - то есть, напишите тест, который проходит по вашей исходной программе, но не работает на мутанте.
- Определите подходящие входные данные, которые запускают некорректное поведение, введенное мутантом.
- Определите подходящего тестового оракула, который утверждает ожидаемое поведение / вывод вашей программы (т. Е. Тестового оракула, который проходит по вашей исходной программе, но не работает с мутантом).
Пожалуйста, имейте в виду, что ваша цель должна не заключаться в написании минимальных тестов, которые просто убивают всех мутантов, а скорее тестов, которые имеют смысл вконтекст вашего проекта и как побочный продукт убивают мутантов.Опять же, если бы вы могли предоставить конкретные примеры для мутантов, которые не убивает ваш набор тестов, я и другие лучше прокомментируем, какие тесты отсутствуют.
Пример: Предположим, у вас есть мутантэто приводит к следующей ошибке (т. е. изменяет реляционный оператор в операторе if вашей исходной программы):
- if cipher_letter > @z_offset
+ if cipher_letter >= @z_offset
Чтобы убить этого мутанта, требуется тест, который проверяет граничное условие - то есть тест, который кодирует хотя бы один символк «Z».Ваш текущий набор тестов не имеет такого теста.
* Этот процесс описывает традиционное тестирование мутации.Недавнее исследование [1] , [2] предполагает, что (1) не все убиваемые мутанты должны быть убиты (некоторые мутанты вызывают тесты, которые просто не имеют смысла) и (2)эквивалентные мутанты могут указывать на проблему в вашей программе (например, нежелательную избыточность или неоднозначность), которую вы, возможно, захотите устранить вместо удаления эквивалентного мутанта.