Многомодульный проект Maven с отдельным тестовым модулем - покрытие кода?

У меня есть многомодульный проект maven.

root:
    moduleA/   # no unit tests
    moduleB/   # no unit tests
    moduleC/   # no unit tests
    tests/     # All unit tests, since depends on modules A, B and C

Все тесты находятся в одном модуле, называемом тесты/, а весь код находится в отдельных модулях.

Есть ли способ получить покрытие кода?


person nishant    schedule 13.11.2014    source источник
comment
Модульные тесты по определению являются локальными для соответствующего модуля и не извлекаются в отдельный модуль. Таким образом, ваша установка для отдельного модуля модульных тестов не имеет смысла. Намерение в Maven состоит в том, чтобы производственный код плюс соответствующие модульные тесты находились в одном модуле. Поскольку структура папок показывает src/main/java производственный код. src/test/java код модульного теста.   -  person khmarbaise    schedule 13.11.2014
comment
Я думаю, что это правильная установка, если вы рассматриваете модуль тестов как место для интеграционных тестов. На данный момент кажется, что jacoco не поддерживает это, вы можете попробовать Sonar, если вы действительно в настроении сделать это. В противном случае дождитесь следующей версии Jacoco, она может ее поддерживать :D (github.com/ жакоко/жакоко/тянуть/97)   -  person AMilassin    schedule 13.11.2014
comment
Если мы говорим об интеграционных тестах, то да, но в вопросе об этом не написано.   -  person khmarbaise    schedule 13.11.2014
comment
Если вам нравится запускать интеграционные тесты с jacoco, вам нужен агент, который должен быть настроен в maven-failsafe-plugin (если мы говорим об интеграционных тестах) соответствующим образом. См. здесь: petrikainulainen.net/programming/maven/   -  person khmarbaise    schedule 13.11.2014


Ответы (3)


Есть способ сделать это. Магия заключается в том, чтобы создать комбинированный файл jacoco.exec и сделать это в два этапа. Мой пом:

<properties>
    ...
    <jacoco.overall.exec>${maven.multiModuleProjectDirectory}/target/jacoco_analysis/jacoco.exec</jacoco.overall.exec>
</properties>

<build>
    <pluginManagement>
        <plugins>

            ...

            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.8</version>
                <configuration>
                    <destFile>${jacoco.overall.exec}</destFile>
                    <dataFile>${jacoco.overall.exec}</dataFile>
                </configuration>
            </plugin>

            ...

        </plugins>
    </pluginManagement>
</build>

<profiles>
    <profile>
        <id>runTestWithJacoco</id>
        <activation>
            <property>
                <name>runTestWithJacoco</name>
                <value>true</value>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>default-prepare-agent</id>
                            <goals>
                                <goal>prepare-agent</goal>
                            </goals>
                            <configuration>
                                <append>true</append>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>createJacocoReport</id>
        <activation>
            <property>
                <name>createJacocoReport</name>
                <value>true</value>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>default-report</id>
                            <phase>validate</phase>
                            <goals>
                                <goal>report</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Добавьте это в свой родительский pom и выполните mvn clean install -DrunTestWithJacoco, а затем mvn validate -DcreateJacocoReport. Теперь у вас есть полное покрытие класса, и не имеет значения, какой тест его покрывал. Магия заключается в использовании maven.multiModuleProjectDirectory для создания комбинированного файла jacoco.exec. Это свойство доступно начиная с maven 3.3.1 и указывает на папку, в которой вы начали сборку maven.

person Sven Oppermann    schedule 02.02.2017

Я не думаю, что jacoco или cobertura способны сообщать о покрытии кода между модулями. Вы можете попробовать инструментировать скомпилированные классы перед запуском отчета о покрытии тестами, а не полагаться на инструментарий "на лету".

См. эту jacoco maven цель, чтобы выполнить инструментирование в автономном режиме.

person mystarrocks    schedule 13.11.2014
comment
В jacoco вам не нужны инструменты, потому что у него есть агент, который можно настроить соответствующим образом. - person khmarbaise; 13.11.2014

Начиная с версии Jacoco: 0.7.7, вы можете использовать report-aggregate.

Корень pom.xml:

<project>
[...]
  <build>
    <plugins>
     <!--   refer:https://prismoskills.appspot.com/lessons/Maven/Chapter_06_-_Jacoco_report_aggregation.jsp     -->
    <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.6</version>
    <executions>
        <execution>
            <id>prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>

        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
                <goal>report-aggregate</goal>
            </goals>
        </execution>
    </executions>
    </plugin>
    <plugins>
  </build>
[...]
<pluginManagement>
  <plugins>
    <!--    unit test plugin        -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>3.0.0-M5</version>
      <dependencies>
        <dependency>
          <groupId>org.apache.maven.surefire</groupId>
          <artifactId>surefire-junit47</artifactId>
          <version>3.0.0-M5</version>
        </dependency>
      </dependencies>
      <configuration>
        <argLine>${argLine} -Dfile.encoding=UTF-8</argLine>
      </configuration>
    </plugin>
  </plugins>
</pluginManagement>
[...]
</project>

Подмодули pom.xml:

<project>
[...]
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <includes>
                <include>[path]</include>
            </includes>
        </configuration>
    </plugin>
</plugins>
[...]
</project>

Если вы используете Jenkin, вы можете просто использовать плагин jacoco и <goal>report</goal> без других новых вещей.

person kyakya    schedule 17.11.2020