PITest: JavaLaunchHelper реализован в обоих
Недавно я начал использовать PITest для мутационного тестирования. После запуска команды, постройте мой проект, используя maven. mvn org.pitest:pitest-maven:mutationCoverage
Я получаю эту ошибку несколько раз:
-stderr : objc[2787]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be ustderr : sed. Which one is undefined.
Иногда ошибка сопровождается
PIT >> WARNING : Slave exited abnormally due to MEMORY_ERROR
или же PIT >> WARNING : Slave exited abnormally due to TIMED_OUT
Я использую OsX версии 10.10.4 и Java 8 (jdk1.8.0_74).
Любое исправление / обходной путь для этого?
1 ответ
Не беспокойся об этом;
-stderr : objc[2787]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be ustderr : sed. Which one is undefined.
Это просто для информации, что есть две реализации JavaLauncherHelper, и сообщение говорит вам, что одна из двух будет использовать поток вывода std-err, но не определено, какая из двух. Это известный исс, см. Также этот вопрос
Два других являются результатом того, что делает PIT: он модифицирует байтовый код, и может случиться так, что это не только повлияет на вывод операции (обнаруженный тестом), но фактически повлияет на поведение во время выполнения. Например, если границы цикла изменяются таким образом, этот цикл выполняется бесконечно. Яма способна обнаружить это и выдает ошибку. Мутации, обнаруженные либо ошибкой памяти, либо ошибкой тайм-аута, могут рассматриваться как "убитые". Но вы должны проверить каждый из них в отдельности, поскольку они также могут быть ложными срабатываниями.
PIT >> WARNING : Slave exited abnormally due to MEMORY_ERROR
означает, что измененный код создает больше или больше объектов, поэтому разветвленный jvm не хватает памяти. Представьте себе такую петлю
while(a < b){
list.add(new Object());
a++;
}
И a++
изменяется на a--
, Цикл может в конечном итоге закончиться, но, скорее всего, до этого вам не хватит памяти.
Из документации
Ошибка памяти может возникнуть в результате мутации, которая увеличивает объем памяти, используемой системой, или может быть результатом дополнительной нагрузки на память, необходимой для многократного запуска ваших тестов при наличии мутаций. Если вы видите большое количество ошибок памяти, подумайте о настройке большего количества кучи и пространства permgen для тестов.
Проблема с тайм-аутом похожа на эту, причина может быть либо в том, что вы запускаете бесконечный цикл, либо в том, что система считает, что вы запускаете бесконечный цикл, то есть когда система слишком медленная для вычисления измененного кода. Если вы испытываете много тайм-аутов, вам следует рассмотреть возможность увеличения значения тайм-аута. Но будьте осторожны, так как это может повлиять на общее время выполнения.
Из FAQ
Тайм-ауты при запуске мутационных тестов вызваны одной из двух причин
- 1 Мутация, которая вызывает бесконечный цикл
- 2 PIT, думая, что произошел бесконечный цикл, но он ошибается
Чтобы обнаружить бесконечные циклы, PIT измеряет нормальное время выполнения каждого теста без каких-либо мутаций. Когда тест выполняется при наличии мутации, PIT проверяет, что тест не выполняется дольше обычного времени * x + y
К сожалению, реальный мир сложнее, чем этот. Время тестирования может варьироваться в зависимости от порядка выполнения тестов. Первый тест в классе может иметь время выполнения намного больше, чем другие, так как JVM потребуется загрузить классы, необходимые для этого теста. Это может быть особенно ярко выражено в коде, который использует структуры связывания XML, такие как jaxb, где загрузка классов может занять несколько секунд.
Когда PIT запускает тесты на мутацию, порядок тестов будет другим. Тесты, которые раньше занимали миллисекунды, могут теперь занимать секунды, поскольку теперь они несут издержки загрузки классов. Поэтому PIT может неправильно пометить мутацию как вызывающую бесконечный цикл.
Исправление для этой проблемы может быть разработано в будущей версии PIT. Тем временем, если вы столкнулись с большим количеством тайм-аутов, попробуйте увеличить y в приведенных выше уравнениях до большого значения с помощью -timeoutConst (timeoutConstant в maven).