天天看點

maven_SonarQube中的Maven項目的單元和內建測試報告

maven_SonarQube中的Maven項目的單元和內建測試報告

maven

自SonarQube 4.2起。 測試報告不是在Maven建構期間由Sonar Maven插件生成的(請參閱SonarQube的部落格文章)。 是以,在Sonar Maven插件收集SonarQube伺服器的資訊之前,必須由另一個插件生成測試報告。 在這裡,Jacoco Maven插件可以提供幫助。 它有可能生成SonarQube可以了解的測試報告。 Jacoco Maven插件更進一步,它有可能生成用于內建測試的測試報告。

在以下各節中,提出了滿足以下條件的解決方案:

  • Maven被用作建構工具。
  • 該項目可以是多子產品項目。
  • 單元測試和內建測試是每個子產品的一部分。 這裡,內建測試是測試子產品中類之間的內建的測試。
  • 測試報告在單元測試報告和內建測試報告中是分開的。

下一部分的路線圖是,首先顯示了Maven項目結構,用于單元測試和內建測試的分離。 然後顯示了Maven項目配置,其中包含單獨的單元測試運作和內建測試運作。 之後,我們來看看Maven項目配置,以生成在單元測試和內建測試中分開的測試報告。 最後,SonarQube的儀表闆中顯示了SonarQube的配置,用于測試報告的可視化。

Maven項目結構

首先,我們看一下預設的Maven項目結構在單個子產品項目中的樣子。

my-app
├── pom.xml
├── src
│   ├── main
│   │   └── java
│   │       └──
│   └── test
│       └── java
│           └──
           

目錄src / main / java包含生産源代碼,目錄src / test / java包含測試源代碼。 我們可以将單元測試和內建測試放到這個目錄中。 但是我們想将這兩種類型的測試放在單獨的目錄中。 是以,我們添加了一個名為src / it / java的新目錄。 然後将單元測試放在src / test / java目錄中,并将內建測試放在src / it / java目錄中,是以新的項目結構如下圖所示。

my-app
├── pom.xml
├── src
│   ├── it
│   │   └── java
│   │       └──
│   ├── main
│   │   └── java
│   │       └──
│   └── test
│       └── java
│           └──
           

單元和內建測試運作

幸運的是,單元測試運作配置是Maven預設項目配置的一部分。 如果滿足以下條件,Maven将自動運作這些測試:

  • 測試位于目錄src / test / java和
  • 測試類名稱以Test開頭或以Test或TestCase結尾。

Maven在Maven的建構生命周期階段測試中運作這些測試。

內建測試運作配置必須手動完成。 它存在可以提供幫助的Maven插件。 我們希望滿足以下條件:

  • 內建測試存儲在目錄src / it / java和
  • 內建測試類名稱要麼以IT開頭,要麼以IT或ITCase結尾,
  • 內建測試在Maven的建構生命周期階段進行內建測試。

首先,Maven必須知道它必須在其測試類路徑中包含目錄src / it / java 。 在這裡,Build Helper Maven插件可以提供幫助。 它将目錄src / it / java添加到測試類路徑。

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>1.8</version>
  <executions>
    <execution>
      <id>add-test-source</id>
      <phase>process-test-sources</phase>
      <goals>
        <goal>add-test-source</goal>
      </goals>
      <configuration>
        <sources>
          src/it/java
        </sources>
      </configuration>
     </execution>
     <execution>
       <id>add-test-resources</id>
       <phase>generate-test-resources</phase>
       <goals>
         <goal>add-test-resource</goal>
       </goals>
       <configuration>
          <resources>
            <resource>
              src/it/resources
            </resource>
          </resources>
       </configuration>
     </execution>
   </executions>
 </plugin>
           

上面的代碼段必須插入到項目根pom中的<project> <build> <plugins>部分。

Maven的建構生命周期包含一個稱為內建測試的階段。 在此階段,我們要運作內建測試。 是以,我們将Maven故障安全插件綁定到階段內建測試:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>2.13</version>
  <configuration>
    <encoding>${project.build.sourceEncoding}</encoding>
  </configuration>
  <executions>
    <execution>
      <id>failsafe-integration-tests</id>
      <phase>integration-test</phase>
      <goals>
        <goal>integration-test</goal>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
</plugin>
           

同樣,以上代碼片段也必須插入到項目根pom中的<project> <build> <plugins>部分。 然後,當Maven故障保護插件的類名稱以IT開頭或以IT或ITCase結尾時,它們會自動運作內建測試。

測試報告生成

我們想使用Jacoco Maven插件生成測試報告。 它應該生成兩個測試報告,一個用于單元測試,一個用于內建測試。 是以,該插件必須要準備兩個單獨的代理。 然後他們在測試運作期間生成報告。 Maven的建構生命周期包含自己的階段,可以在測試階段之前進行準備(測試和內建測試)。 測試階段的準備階段稱為過程測試類,而內建測試階段的準備階段稱為內建前測試。 在這兩個階段中,我們綁定了Jacoco Maven插件,是以,此插件的配置類似于以下代碼片段(同樣,它是<project> <build> <plugins>一節的一部分):

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.7.2.201409121644</version>
  <executions>
    <execution>
      <configuration>
        <destFile>${sonar.jacoco.reportPath}
      </configuration>
      <id>pre-test</id>
      <phase>process-test-classes</phase>
      <goals>
        <goal>prepare-agent</goal>
      </goals>
    </execution>
<!-- we want to execute <span class="hiddenSpellError" pre="execute " data-mce-bogus="1">jacoco</span>:prepare-agent-integration in test phase,-->
but before executing maven failsafe plugin -->
    <execution>
      <configuration>
        <destFile>${sonar.jacoco.itReportPath}</destFile>
      </configuration>
      <id>pre-itest</id>
      <phase>pre-integration-test</phase>
      <goals>
        <goal>prepare-agent-integration</goal>
      </goals>
    </execution>
  </executions>
</plugin>
           

配置元素destFile是應将測試報告存儲到的位置的路徑。 使用屬性$ { sonar.jacoco.reportPath}和$ { sonar是很重要的。 jacoco.itReportPath}。 SonarQube使用這些屬性查找可視化的測試報告。

現在,我們可以運作目标mvn install,并且我們的項目已建構為包含單元和內建測試,并生成兩個測試報告。

SonarQube測試報告可視化

現在,我們想在SonarQube中可視化我們的測試報告。 是以,成功建構後,我們必須在我們的項目中運作Sonar Maven 3插件(指令mvn sonar:sonar )。

在SonarQube儀表闆中打開項目時,我們僅看到每個子產品的單元測試的報告。 原因是必須在SonarQube中分别配置內建測試的報告可視化。 SonarQube文檔中很好地描述了這些配置步驟。

概要

該部落格描述了如何在Maven建構期間為單元測試和內建測試生成測試報告。 在GitHub上,我托管了一個示例項目,示範了所有配置步驟。 作為技術環境,我使用

  • Maven的3.2.5
  • Maven插件:
    • Maven Surefire插件
  • SonarQube 4.5.1
  • Java 7

連結

  1. SonarQube的部落格文章SonarQube中的單元測試執行
  2. Jacoco Maven插件項目站點
  3. Maven建構生命周期簡介
  4. Maven故障安全插件項目站點
  5. 建構助手Maven插件項目站點
  6. SonarQube文檔,有關Java Projec內建測試的代碼覆寫率
  7. GitHub上的示例Maven項目
翻譯自: https://www.javacodegeeks.com/2015/05/unit-and-integration-test-reports-for-maven-projects-in-sonarqube.html

maven