Maven2 Multiproject Cobertura Проблемы с отчетами во время сборки mvn-сайта

У нас есть мультипроект, для которого мы пытаемся запустить отчеты о тестовом покрытии 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.

А отчет выглядит так: Maven2 Multiproject Cobertura Проблемы с отчетами во время сборки mvn-сайта

Блин, тебе нужен новый монитор! Я с трудом могу прочесть эти названия классов.

Andrew Swan 19.09.2008 03:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
6 312
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Мне не удалось заставить 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 нет цели вызвать слияние.

Snicolas 11.05.2013 09:57

@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>

Другие вопросы по теме