У меня есть довольно многомодульная сборка проектов Maven. Я начинаю со всех наших тестов с помощью PowerMock и используя Jacoco 0.7.8 и автономную аппаратуру.Изменено JaCoCo от офлайн до онлайн, но до сих пор не видно покрытия для классов в других модулях
Несмотря на то, что они называются «модульными испытаниями», тесты для классов в одном модуле требуют значительного кода в других модулях. В результате, когда мы рассматриваем сгенерированные отчеты, мы видим покрытие для классов в том же модуле, что и тест, но мы не видим покрытия для классов в других модулях, которые были выполнены во время теста.
Мое ПРЕДПОЛОЖЕНИЕ заключается в том, что если я смогу изменить это для использования онлайн-инструментов, в итоговый отчет о покрытии будут включены классы из других модулей за пределами текущего модуля.
Итак, я приступил к фиксации одной детали в наших тестах (класс под тестом), который требовал использования PowerMock вместо Mockito (эта часть была довольно простой). Я исправил это по одному в каждом тесте и соответствовал CUT, но пока я сделал эти изменения только в одном модуле в более крупной сборке. Я проверил, что тесты работают, и что я могу видеть интерактивное покрытие с помощью EclEmma (еще одно ограничение PowerMock).
Плагин jacoco-maven сконфигурирован в родительском помпе, который используется всеми дочерними модулями, чтобы в настоящее время использовать автономную аппаратуру. В конце концов, я собираюсь изменить конфигурацию в этом родительском pom, чтобы использовать онлайн-инструменты, но я решил оставить это там до сих пор и переопределить конфигурацию в каждом модуле, в котором я сделал преобразование, так что этот модуль использует онлайн-инструменты. Я считаю, что я сделал это «правильно», хотя мне пришлось использовать hack, чтобы переопределить список выполнения в дочернем модуле (помните, что я собираюсь удалить их, как только все они будут преобразованы).
При запуске сборки («clean install
„), я вижу это сделать“prepare-agent
», напечатав в результате „argLine
“ значения, то в дальнейшем безошибочном выполняется, то „report
“ цель выполняет, печать пути к jacoco.exec
файл, и я вижу, что он говорит «Analyzed bundle 'my-module-name' with 1 classes
». Это кажется показателем проблемы.
Поскольку сборка была завершена, я открыл файл «target/site/jacoco/index.html
» в своем браузере, и я обнаружил, что он включает только покрытие для настоящего модуля и только один класс.
Было также любопытно, что я поверхностно осмотрел сгенерированный файл «jacoco.exec
». Я заметил, что это определенно больше, чем я привык видеть из других модулей, которые все еще используют автономную аппаратуру. У меня нет возможности интерпретировать формат файла, но я попробовал просто «cat
» в файле, чтобы посмотреть, что я вижу. Я видел строки, которые представляли имена классов в других модулях, которые выполняются моими тестами.
Итак, похоже, что онлайн-инструменты - это, по крайней мере, запись данных для классов в других модулях, но итоговый отчет не показывает этого.
Возможно ли получить это покрытие?
Ниже приводится отрывок из «эффективного» п выхода:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.8</version>
<executions>
<execution>
<id>default-instrument</id>
<phase>none</phase>
<goals>
<goal>instrument</goal>
</goals>
</execution>
<execution>
<id>default-restore-instrumented-classes</id>
<phase>none</phase>
<goals>
<goal>restore-instrumented-classes</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<executions>
<execution>
<id>default-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<argLine>@{argLine} -Xmx1024m</argLine>
<includes>
<include>**/*Test.java</include>
</includes>
<systemPropertyVariables>
<running-unit-test>true</running-unit-test>
<jacoco-agent.destfile>...\target/jacoco.exec</jacoco-agent.destfile>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
<configuration>
<argLine>@{argLine} -Xmx1024m</argLine>
<includes>
<include>**/*Test.java</include>
</includes>
<systemPropertyVariables>
<running-unit-test>true</running-unit-test>
<jacoco-agent.destfile>...\target/jacoco.exec</jacoco-agent.destfile>
</systemPropertyVariables>
</configuration>
</plugin>
Обратите внимание, что расстрелы, используемые для офлайновых приборов имеют фазы «none
», поэтому они не используются, и я также устанавливая свойство «jacoco-agent.destfile
», которое используется только для автономной аппаратуры.
Что мне действительно нужно понять, если все тесты для модуля являются mockito и с использованием онлайн-инструментов jacoco, как тесты для модуля показывают покрытие для классов вне модуля? Я предполагаю, что, поскольку я использую цель «слияния» для создания объединенного файла jacoco.exec, мой вывод sonarqube будет иметь весь охват, но я хотел бы видеть это покрытие в сгенерированном отчете jacoco. Есть ли способ получить это? –
@ DavidM.Karr На данный момент ни одного слова, ни о «SonarQube», ни о «объединении» в описании вашего вопроса нет. Как уже было сказано [несколько] (http://stackoverflow.com/questions/42302786/jacoco-only-shows-coverage-for-classes-in-the-same-module/42305077#42305077) [раз] (https: //groups.google.com/d/msg/jacoco/bFJlLT0sROk/9riq_jz9BgAJ) - сделайте попытку предоставить [полный пример] (http://stackoverflow.com/help/mcve), чтобы получить ответ, который точно соответствует вашему делу. Кстати, вы пытались выполнить «report-aggregate» в объединенном файле? – Godin
Я не упоминал sonarqube, потому что у меня нет никаких проблем с этим. Насколько я могу судить, он берет данные из объединенного файла exec, который имеет данные для классов за пределами вызывающего модуля в каждом случае. И да, я также использую агрегат report-aggregate, о котором я не упоминал в этом сообщении, потому что я сосредоточился на сборке каждого модуля, а не на агрегации, но я также отмечаю, что в отчете-агрегате также отсутствует покрытие для классы, которые достигаются извне модуля. В каждом случае покрытие является «мелким». –