2016-10-26 9 views
0

Я пытаюсь протестировать устаревшее приложение с большим содержанием EAR (app.ear) с использованием Arquillian и TestNG. Чтобы запустить тест, я добавил тестовый файл войны (test.war) в существующее приложение и развернуто на сервере WildFly 10 удаленно.«IllegalStateException: Несовместимые данные выполнения для класса в ...» исключение из Jacoco при запуске для существующего уха

@Deployment 
public static EnterpriseArchive createDeployment(){ 
    return ShrinkWrap.createFromZipFile(EnterpriseArchive.class, new File("../earapp/target/earapp-0.0.1-SNAPSHOT.ear")) 
      .addAsModule(Testable.archiveToTest(ShrinkWrap.create(WebArchive.class, "test.war") 
        .addClass(CurrencyConverterTest.class) 
        .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"))); 
} 

Следующей частью моего требования является получение отчета о покрытии кода после запуска тестов. Для этого я использую Jacoco и запускаю его с плагином Jacoco Maven.

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.7.201606060606</version> 
    <executions> 
     <execution> 
      <id>default-prepare-agent</id> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>default-report</id> 
      <goals> 
       <goal>report</goal> 
      </goals> 
     </execution> 
</plugin> 

app.ear развертывается и даже тесты работает нормально, но когда речь идет о генерации отчёта Jacoco терпит неудачу с исключением и «IllegalStateException: Несовместимые данные исполнения для класса в Jacoco ...... ... "

Исключение распространяется только на класс, содержащий тестовые примеры. Если я исключаю этот класс (CurrencyConverterTest.class), используя исключение в плагине Jacoco Maven, исключение уходит, но отчеты, созданные Jacoco, не содержат данных. Также я проверил jacoco.exec и, насколько я могу судить, содержит достоверные данные.

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

  • Проект 1 (currencycoverter): Этот проект имеет один безгражданный ejb с дистанционным интерфейсом, имеющим три метода.
  • Проект 2 (earapp): Этот проект создает файл уха, используя проект 1 как модуль ejb.
  • Проект 3 (eartest): Этот проект тестирование уха, генерируемого проект 2.

Для меня это выглядит, что есть какая-то ошибка в коде Jacoco, но я мог бы быть неправильно тоже. Пожалуйста, помогите мне.

Update:шаги по созданию проектов, разделяемых мерзавца репо

Шаг 1: Проверьте все три проекта и импортировать в затмение, как затмение проектов.

Шаг 2: Запустите команду Maven чистый instll для проекта 1 (CurrencyConverter)

Шаг 3: Выполнить команду Maven чистый пакет для проекта 2 (earapp). Это создаст файл уха в целевом каталоге.

Шаг 4: Запустите WildFly 10 в автономном режиме на локальном компьютере.

Шаг 5: Запустите команду maven clean install для проекта 3 (eartest). Это будет использовать ухо, сгенерированное на шаге 3, и развернуть его на сервере приложений WildFly 10 и запустить тесты.

+0

Поскольку Stackoverflow не позволяет мне добавить более двух ссылок в вопрос, ссылка на проект 1 https://github.com/keeshaaw/currencyconverter –

ответ

1

К сожалению, ваш пример не может быть построен:

[ERROR] Failed to execute goal on project eartest: 
Could not resolve dependencies for project com.sg.eartest:eartest:jar:0.0.1-SNAPSHOT: 
Could not find artifact org.jboss.osgi.metadata:jbosgi-metadata:jar:3.0.1.Final in central (https://repo.maven.apache.org/maven2) 

Также будет проще играть с ним, если он будет находиться в одном хранилище GitHub.

Однако:

Убедитесь, что вы используете точно такой же вариант JaCoCo во всех модулях при тестировании.

И убедитесь, что проверенная JVM закончена, иначе вы можете получить поврежденный файл «jacoco.exec», потому что по умолчанию он сохраняется при завершении JVM. В более ранних версиях JaCoCo такие испорченные файлы могут вызвать

IllegalStateException: Incompatible execution data for class... 

(как на https://github.com/jacoco/jacoco/issues/95#issuecomment-17271597)

Сообщение об ошибке в случае усеченных файлов в JaCoCo версии была улучшена 0.7.7 - https://github.com/jacoco/jacoco/pull/397 И это хорошо практика использования последних выпущенных версий, поскольку они приносят исправления и исправления ошибок. http://www.eclemma.org/jacoco/trunk/doc/changes.html

Наконец-то - кажется, что ваши тесты полностью размещены в отдельном модуле из основного тестируемого кода. «report» mojo создает отчет для классов текущего модуля. Используйте «агрегат отчетов» для агрегирования охвата всех модулей. Его документация может быть найдена в http://www.eclemma.org/jacoco/trunk/doc/report-aggregate-mojo.html. Некоторые примеры были упомянуты в https://groups.google.com/forum/#!msg/jacoco/8zjkSseaxD4/QOux-Ws-AgAJ.

+0

Привет, Годин, у меня уже есть проекты, которые имеют одинаковую структуру, поэтому я попытался имитировать то же самое, и, следовательно, тесты находятся в другом проекте, чем проект, содержащий источник приложения. Я очистил жуткий проект pom, а также проверил в файлах .project и .classpath eclipse в git repo. Теперь, если вы выполните шаги (обновленный вопрос), вы сможете создавать проекты и тестировать их. –

+0

@KeshawKumar Я не собираюсь проверять его - см. Окончательную часть моего ответа: используйте «report-aggregate» вместо «report», когда тесты находятся в отдельном модуле. – Godin

+0

Да, из последней части вашего ответа совершенно ясно, где я ошибаюсь. Спасибо за помощь. Я очень ценю это. :-) –

-1

Я задал этот вопрос группе пользователей Jacoco, и они попросили меня обновить версию Jacoco до последней.

Я использовал Jacoco 0.7.4.201502262128, и я получал это исключение. Теперь я переехал в Jacoco 0.7.7.201606060606, и проблема решена. Также группа пользователей Jacoco попросила меня использовать ту же самую версию Jacoco core Jacoco agent и Jacoco maven plugin, чтобы избежать каких-либо проблем в будущем.

+0

Извините, но я не вижу в https://groups.google.com/d/msg/jacoco/Y7x6e0ECLI0/GVktU1kXAQAJ, что я сказал, что была ошибка в ранее версии. – Godin

+0

@Godin Извините, я сделал предположение, поскольку не было другого способа объяснить, почему исключение исчезло после обновления Javaoco до текущей версии. Я удалил часть ответа, в котором говорится, что была ошибка. Извините снова за допущение без каких-либо подтверждений с вашей стороны. –