Как убить мутанта условной границы

Я начинаю копаться в анализе кода и мутантах. Я использую PITest в качестве плагина в своем проекте eclipse. Я столкнулся с этим мутантом, которого не могу убить. Предположим, у меня есть следующий код.

class Mutation{
        public static void main(String [] args){
            int i=0;
            String SPECIAL_CHARS = "?!$@";
            String password = "Something";
            for (int pos = 0; pos < password.length(); pos++) {
                char c = password.charAt(pos);
                if(SPECIAL_CHARS.indexOf(c) < 0) {
                 i++;
                }
            }
    }
}

Насколько я понимаю, если есть символ, который не принадлежит SPECIAL_CHARS (скажем, ( ), переменная i будет увеличиваться. PITest сообщает о двух мутантах.

введите здесь описание изображения

Со следующей информацией.

введите здесь описание изображения

введите здесь описание изображения

Я безуспешно пытался написать несколько тестов Junit, которые могут убить этого мутанта. Может кто-нибудь объяснить мне, как это возможно убить?

Теперь я знаю, что если мой пароль имеет ? в качестве первого символа строки password, проверка условной границы может быть отключена. Что с прибавкой? Что это значит?


person rockability    schedule 31.12.2017    source источник
comment
А где объявлено i? Ваш код вообще компилируется? Возможно, вы используете старую, скомпилированную версию.   -  person ta.speot.is    schedule 31.12.2017
comment
private static final String SPECIAL_CHARS = "?!$@"; это не может существовать внутри main. ideone.com/RhCJDS   -  person ta.speot.is    schedule 31.12.2017
comment
Пожалуйста, не обращайте на это внимания, я скопировал эту строку прямо из своего проекта, не имея большого логического смысла. Это просто для того, чтобы дать вам представление   -  person rockability    schedule 31.12.2017


Ответы (1)


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

Питест мог бы удалить весь код из этого метода, и программа была бы функционально эквивалентна.

Если бы код был изменен так, чтобы производился какой-то вывод (возможно, количество специальных символов?), а входной пароль не был жестко запрограммирован, тогда можно было бы написать тесты, которые отличали бы измененные программы от неизмененных.

Мутант условной границы создает код, эквивалентный

if (SPECIAL_CHARS.indexOf(c) <= 0 )

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

Оператор мутации инкрементов преобразует инкремент в декремент, т.е.

i++

to

i--

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

person henry    schedule 01.01.2018