Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Keshaw KumarОтветов: 1

Я пытаюсь протестировать устаревшее приложение 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 и запустить тесты.

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

javajacocojboss-arquillian

Ответы

Ответ 1 · рейтинг 1 · Godin

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

[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 < / а>

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы