Как провести рефакторинг выживших мутаций для try-ресурса и эквивалентного мутанта? - PullRequest
2 голосов
/ 03 июня 2019

Я экспериментирую с junit5 и pitest. Мой тестируемый код выглядит так:

// [...]
InputStream istream = this.getClass().getResourceAsStream("/" + file.getName());
if (istream == null) // 1. negated condition -> suvived 
 {
  istream = Files.newInputStream(this.files.get(varname).toPath(), StandardOpenOption.READ);
 }
try (BufferedReader reader = new BufferedReader(new InputStreamReader(istream, StandardCharsets.UTF_8))) // 2. removed call to java/io/BufferedReader::close → SURVIVED // 3. removed call to java/lang/Throwable::addSuppressed → SURVIVED
 {
  // [...]
 } // 4. removed call to java/io/BufferedReader::close → SURVIVED

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

Моя проблема сейчас в том, что первая мутация является эквивалентным мутантом - если бы я не знала, как ее реорганизовать. Остальные три мутации неявны в инструкции try-resource.

Итак, мой вопрос: как провести рефакторинг этих 4 мутаций? Потому что я уверен, что их нельзя убить дополнительными / измененными тестами.

1 Ответ

1 голос
/ 04 июня 2019

Первый мутант эквивалентен только в том случае, если наблюдаемое поведение функции одинаково с обеих сторон оператора if.

Для этого случая 'file' и 'this.files.get (varname)' должны будут всегда преобразовывать в один и тот же входной поток.

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

Если они всегда будут разрешать одно и то же, тогда зачем нужна первая ветвь?Если он не существует для какой-либо проблемы, которая не может быть проверена (например, производительность), тогда первая ветвь не требуется, и поток всегда может быть разрешен из 'this.files.get (varname) .toPath ()'.

Другие мутанты немного сложнее.

Они эквивалентны, поскольку имеют дело с проблемой, не поддающейся проверке (управление ресурсами).Что еще более важно, они являются «мусорными», так как они являются конструкцией компилятора и не отображаются непосредственно обратно в код.

Pitest пытается отфильтровать подобные нежелательные мутанты, но фильтрация несовершенна, поскольку они не совсем понятны.идентифицируется как конструкции компилятора в байтовом коде.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...