Исключение «IllegalStateException: несовместимые данные выполнения для класса в…» исключение от Jacoco при запуске для существующего уха.

Я пытаюсь протестировать устаревшее приложение big fat EAR (app.ear) с помощью Arquillian и TestNG. Чтобы запустить тест, я добавил тестируемый файл войны (test.war) в существующий app.ear и удаленно развернул его на сервере WildFly 10.

@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 ………» < / em>

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

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

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

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

Обновление: Шаги по созданию проектов, опубликованных в репозитории git

Шаг 1. Проверьте все три проекта и импортируйте в eclipse как проекты eclipse.

Шаг 2. Запустите команду maven clean instll для проекта 1 (конвертер валют)

Шаг 3. Запустите команду maven clean package для проекта 2 (earapp). Это создаст файл Ear в целевом каталоге.

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

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


person Keshaw Kumar    schedule 26.10.2016    source источник
comment
Поскольку Stackoverflow не позволяет мне добавлять более двух ссылок в вопрос, ссылка на проект 1 - github.com/ keeshaaw / конвертер валют   -  person Keshaw Kumar    schedule 26.10.2016


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

person Godin    schedule 03.11.2016
comment
Привет, Годин, у меня уже есть существующие проекты с такой же структурой, поэтому я попытался имитировать то же самое, и, следовательно, тесты находятся в другом проекте, чем проект, содержащий исходный код приложения. Я очистил pom самого раннего проекта, а также проверил файлы .project и .classpath eclipse в репозитории git. Теперь, если вы выполните шаги (обновленный вопрос), вы сможете создавать проекты и тестировать их. - person Keshaw Kumar; 03.11.2016
comment
@KeshawKumar Я не собираюсь его тестировать - см. Заключительную часть моего ответа: используйте отчет-агрегат вместо отчета, когда тесты находятся в отдельном модуле. - person Godin; 03.11.2016
comment
Да, из последней части вашего ответа становится ясно, в чем я ошибаюсь. Спасибо за помощь. Я очень ценю это. :-) - person Keshaw Kumar; 03.11.2016