2016-04-04 2 views
1

Недавно я начал использовать PITest для тестирования мутаций. Начать строить мой проект с использованием Maven, когда я запускаю команду mvn org.pitest:pitest-maven:mutationCoverage я получаю эту кучу ошибок раз:PITest: JavaLaunchHelper имплицируется как в

-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).

Любое исправление/обход для этого?

ответ

0

Не беспокойтесь об этом;

-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 и сообщение о том, что один из двух будет использовать выходной поток станд-заблуждается, но это не определено, какой из двух. Это известный isse, см. Также this question

Другие два являются результатом того, что делает PIT: он изменяет байтовый код, и может случиться так, что это не просто влияет на вывод операции (обнаруженной тестом) но на самом деле влияет на поведение во время выполнения. Например, если границы цикла будут изменены таким образом, цикл будет выполняться бесконечно. Пит способен обнаружить это и выдает ошибку. Мутации, обнаруженные либо с ошибкой памяти, либо с ошибкой таймаута, могут быть определены как «убитые».

PIT >> WARNING : Slave exited abnormally due to MEMORY_ERROR означает, что модифицированный код создает больше или больше объектов, поэтому у разветвленного jvm заканчивается память. Представьте себе петлю, как этот

while(a < b){ 
    list.add(new Object()); 
    a++; 
} 

И в a++ получает изменено на a--. Петля может закончиться, но, скорее всего, у вас заканчивается память.

От documentation

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

Вопрос тайма-аута похож на это, причину coud быть, что вы запускаете бесконечный цикл или что система думает, что запустить бесконечный цикл, то есть, когда система работает слишком медленно, чтобы вычислить измененный код. Если вы испытываете много тайм-аутов, вам следует подумать об увеличении значения тайм-аута. Но будьте осторожны, так как это может повлиять на общее время выполнения.

Из FAQ

Timeouts при выполнении тестов мутаций вызваны одна из двух вещей

  • 1 мутации, которая приводит к бесконечному циклу
  • 2 PIT мышление бесконечного цикла произошла но не соответствует действительности

Для определения бесконечных циклов измерения PIT обычное время выполнения каждого теста без присутствия каких-либо мутаций. Когда тест выполняется при наличии мутации PIT проверяет, что тест не работает больше нормальное время * x + y

К сожалению, реальный мир более сложный, чем этот. Время тестирования может варьироваться в зависимости от порядка выполнения тестов. Первый тест в классе может иметь время выполнения намного выше, чем другие, поскольку JVM потребуется загрузить классы, необходимые для этого теста. Это может быть особенно ярко выражено в коде, который использует фреймворки привязки XML, такие как jaxb, где загрузка классов может занять несколько секунд.

Когда PIT запускает тесты против мутации, порядок испытаний будет отличаться. Тесты, которые ранее занимали милисекунды, теперь могут занимать секунды, так как теперь они несут накладные расходы на загрузку классов. Поэтому PIT может неправильно указывать мутацию как вызывающую бесконечный цикл.

Исправление этой проблемы может быть разработано в будущей версии PIT. Тем временем, если вы столкнулись с большим количеством тайм-аутов, попробуйте увеличить y в приведенных выше уравнениях до большого значения с помощью параметра timetimeConst (timeoutConstant in maven).

Смежные вопросы