У нас есть мультипроект, для которого мы пытаемся запустить отчеты о тестовом покрытии Cobertura как часть нашей сборки сайта mvn. Я могу заставить Cobertura запускать дочерние проекты, но он ошибочно сообщает о нулевом покрытии, хотя в отчетах по-прежнему выделяются строки кода, которые были затронуты модульными тестами.
Мы используем mvn 2.0.8. Я пробовал запускать mvn clean site, mvn clean site:stage и mvn clean package site. Я знаю, что тесты запущены, они отображаются в надежных отчетах (как в txt / xml, так и в отчетах сайта). Мне что-то не хватает в конфигурации? Cobertura плохо работает с мультипроектами?
Это в родительском .pom:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<inherited>true</inherited>
<executions>
<execution>
<id>clean</id>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<inherited>true</inherited>
</plugin>
</plugins>
</reporting>
Я пробовал запускать его с дочерними .poms и без них:
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
</plugin>
</plugins>
</reporting>
Я получаю это на выходе сборки:
...
[INFO] [cobertura:instrument]
[INFO] Cobertura 1.9 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file
Instrumenting 3 files to C:\workspaces\sandbox\CommonJsf\target\generated-classes\cobertura
Cobertura: Saved information on 3 classes.
Instrument time: 186ms
[INFO] Instrumentation was successful.
...
[INFO] Generating "Cobertura Test Coverage" report.
[INFO] Cobertura 1.9 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file
Cobertura: Loaded information on 3 classes.
Report time: 481ms
[INFO] Cobertura Report generation was successful.
А отчет выглядит так:






Мне не удалось заставить Cobertura объединить репортажи из нескольких проектов. Это было проблемой в общем случае с отчетностью по нескольким проектам.
Мы оценивали сонар как решение для нашей отчетности по метрикам. Кажется, он отлично справляется с предоставлением сводных показателей по проектам, включая мультипроекты.
Я подозреваю, что вам не хватает выполнения подключаемого модуля cobertura на этапе компиляции, так что код инструментируется подключаемыми модулями отчетов только в жизненном цикле сайта после запуска тестов. Таким образом, тестовые прогоны не выполняются, потому что они выполняются на неинструментированном коде. Тщательно анализируйте журналы сборки - если я прав, вы заметите, что перед cobertura: instrument выполняются верные тесты.
Моя конфигурация аналогична вашей, но помимо указания чистого выполнения в pluginManagement (как и вы), я явно указываю плагин cobertura в разделе плагинов сборки:
<build>
...
<plugins>
...
<plugin>
<inherited>true</inherited>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>${cobertura.plugin.version}</version>
</plugin>
</plugins>
</build>
Моя конфигурация вроде работает, и все вещи Cobertura находятся в глобальном организационном pom, который все проекты используют в качестве родительского.
Таким образом, проекты не указывают ничего, связанного с Кобертурой, в своих файлах pom.xml, но они по-прежнему создают отчеты о покрытии.
Реализованное мной решение несколько ручное, но работает. Он состоит из нескольких шагов, один из которых объединяет несколько файлов .ser, сгенерированных Cobertura. Это можно сделать с помощью инструмента командной строки cobertura-merge внутри задачи maven.
Согласно выводам, которые вы показываете, это то, что файлы фактически не инструментированы, это говорит о том, что инструментированы только 3 файла.
Ты прав. Эта страница демонстрирует эту настройку: thomassundberg.wordpress.com/2012/02/18/…. Ant используется для вызова слияния cobertura, поскольку у maven нет цели вызвать слияние.
@Marco прав, этого невозможно добиться с помощью maven только потому, что в плагине maven cobertura отсутствует цель слияния.
Вы можете достичь этого, сочетая цели maven и ant: http://thomassundberg.wordpress.com/2012/02/18/test-coverage-in-a-multi-module-maven-project/
Тем не менее, в случае, если вы тестируете один-единственный проект, нет необходимости в объединении. В тестовом проекте вы можете скопировать файл .ser и инструментированные классы из тестируемого проекта:
//in test project
<plugin>
<groupId>com.github.goldin</groupId>
<artifactId>copy-maven-plugin</artifactId>
<version>0.2.5</version>
<executions>
<execution>
<id>copy-cobertura-data-from-project-under-test</id>
<phase>compile</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${project.basedir}/../<project-under-test>/target/cobertura</directory>
<targetPath>${project.basedir}/target/cobertura</targetPath>
<includes>
<include>*.ser</include>
</includes>
</resource>
<resource>
<directory>${project.basedir}/../<project-under-test>/target/generated-classes/cobertura/</directory>
<targetPath>${project.basedir}/target/generated-classes/cobertura</targetPath>
<preservePath>true</preservePath>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
//in parent project
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<configuration>
<format>xml</format>
<aggregate>true</aggregate>
</configuration>
<executions>
<execution>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>${cobertura.version}</version>
</plugin>
</plugins>
</reporting>
Блин, тебе нужен новый монитор! Я с трудом могу прочесть эти названия классов.