Тесты JUnit проходят, но PIT говорит, что пакет не зеленый

При попытке запустить тест на мутацию PIT я получаю следующую ошибку:

mutationCoverage failed: все тесты не прошли без мутации при расчете покрытия строки. Для мутационного тестирования требуется зеленый набор.

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

Я пытался:

  • добавление опции -Dthreads = 1 в правило любой проблемы с многопоточностью
  • не удалось найти какие-либо свойства системы, уникальные для пары тестов, которые не работают
  • тесты не игнорируются при нормальном запуске

Что еще мне следует попробовать? Или другие способы отладить, что здесь может происходить?


person Bobby    schedule 11.06.2015    source источник
comment
Вы пробовали включить vebose ведение журнала в PIT, чтобы получить более подробную информацию о неудачных тестах?   -  person Marcin Zajączkowski    schedule 11.06.2015
comment
Да, у меня есть. Дополнительный вывод не показывает ничего, кроме помощи, кроме обычного вывода. У него по-прежнему есть предупреждение, указывающее, что тестовый класс и тестовый метод не работают. 16:30:45 PIT ›› ПРЕДУПРЕЖДЕНИЕ: Описание [testClass = com.bobbylough.RandomTest, name = testToResource (com.bobbylough.RandomTest)] действительно не пройти без мутации.   -  person Bobby    schedule 11.06.2015


Ответы (1)


Распространенные причины неудач тестов на этапе покрытия:

  1. Тесты на сбор PIT не включены / исключены в стандартной тестовой конфигурации
  2. Тесты полагаются на переменную среды или другое свойство, установленное в конфигурации теста, но не заданное в конфигурации Pitest.
  3. У тестов есть скрытая зависимость порядка, которая не обнаруживается во время обычного запуска теста.
  4. PIT не нравится что-то в вашем техническом стеке - возможно, средство запуска тестов JUnit

Похоже, вы устранили 1 и 2. Остались 3 и 4.

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

  • Включает ли ваша кодовая база изменяемое статическое состояние? (например, в одиночках)
  • Попадают ли ваши тесты в базу данных (в памяти или иначе), где состояние может сохраняться между тестами?
  • Ваши тесты изменяют файлы на диске?

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

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

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

person henry    schedule 12.06.2015
comment
Спасибо, Генри. Буду продолжать отладку. Ваше право, это, вероятно, проблема с зависимостью от maven, которую всегда интересно отлаживать - person Bobby; 12.06.2015
comment
Под зависимостью от порядка я подразумеваю, что набор не пройдет, если тесты выполняются в определенном порядке. То есть, если набор запускает тесты в порядке A, B, C, D, все в порядке, но если C запускается до B, вы обнаружите, что B не работает. Это происходит, когда тест C изменяет какое-то состояние в jvm, на которое неявно полагается B. - person henry; 12.06.2015
comment
ах, ладно, теперь я понимаю, что ты имел в виду. К сожалению, у меня нет упрощенной версии, которая терпит неудачу, потому что она включена в два из более чем 4000 тестов JUNIT в моем проекте, и я не смог выделить их уникальность. Вы создали замечательный инструмент для тестирования мутаций. Я буду копать дальше. Это может быть что-то вроде системного свойства для статического метода во внешней библиотеке, которое я не могу имитировать. Спасибо за помощь - person Bobby; 12.06.2015
comment
@henry - есть ли способ передать / установить переменные среды в яму. в моем случае мы используем плагин surefire для установки переменных среды, которые будут использоваться при выполнении модульного теста. Поскольку эта переменная не передается в пит при запуске теста, тесты не проходят. Пожалуйста, предложите по этому поводу.Спасибо - person Somnath Goswami; 24.08.2017
comment
нашел решение установить переменную среды как конфигурацию плагина пит - ‹environmentVariables› ‹environment› test ‹/environment› ‹/environmentVariables› - person Somnath Goswami; 30.08.2017
comment
@henry Ваши тесты изменяют файлы на диске? 1. В моем коде есть загрузка файла, и об этой ошибке также сообщается. что я должен делать. 2. И в моем коде есть конфигурация для получения центра конфигурации, есть таймаут. Как это решить? - person byte mamba; 10.10.2019