關係

2013-02-18 46 views
5

1句的問題:「的Cobertura不會產生正確的代碼覆蓋率」關係

下面是我的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
     xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>a.b.c</groupId> 
    <artifactId>MyProject</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <repositories> 
     <repository> 
      <id>google-api-services</id> 
      <url>http://google-api-client-libraries.appspot.com/mavenrepo</url> 
     </repository> 
    </repositories> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java-version>1.6</java-version> 
     <maven.test.skip.exec>false</maven.test.skip.exec> 
     <cobertura-maven-plugin.version>2.5.2</cobertura-maven-plugin.version> 
    </properties> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>com.google.appengine</groupId> 
       <artifactId>appengine-maven-plugin</artifactId> 
       <version>1.7.4</version> 
      </plugin> 
      <plugin> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.1.1</version> 
       <extensions>false</extensions> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.0</version> 
       <configuration> 
        <source>${java-version}</source> 
        <target>${java-version}</target> 
        <encoding>${project.build.sourceEncoding}</encoding> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.1.3</version> 
       <configuration> 
        <testFailureIgnore>false</testFailureIgnore> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>cobertura-maven-plugin</artifactId> 
       <version>${cobertura-maven-plugin.version}</version> 
       <configuration> 
        <formats> 
         <format>xml</format> 
         <format>html</format> 
        </formats> 
        <check/> 
       </configuration> 
       <executions> 
        <execution> 
         <goals> 
          <goal>cobertura</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <reporting> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>cobertura-maven-plugin</artifactId> 
       <version>${cobertura-maven-plugin.version}</version> 
      </plugin> 
     </plugins> 
    </reporting> 
    <dependencies> 
     ... 
    </dependencies> 
</project> 

當我嘗試建立與此POM,2件事情發生

  1. 所有的測試運行2次
  2. 戰爭產生
  3. 的Cobertura報告顯示0%的覆蓋率

請幫我調試這個問題。

+1

什麼是確切的'mvn'命令(和參數)的Cobertura你使用? – palacsint 2013-02-19 00:46:58

+0

'mvn乾淨安裝' – JAM 2013-02-19 00:48:49

+0

我會嘗試'mvn乾淨安裝cobertura:cobertura' – palacsint 2013-02-19 00:57:57

回答

2

我注意到的第一件事是,您正在使用maven-surefire-plugin(2.1.3即2006年左右!)的極舊版本,但當前版本爲2.13。

除此之外,您已將cobertura-maven-plugin綁定到包裝階段,報告目標爲cobertura這完全是錯誤的。

最好是先簡化設置,並得到它運行,這意味着剛剛在屬性定義的Cobertura,Maven的插件版本並執行安裝在報道這樣的區域:

<properties> 
    <cobertura-maven-plugin.version>2.5.2</cobertura-maven-plugin.version> 
    </properties> 

和以下爲報告區:

<project> 
    .. 
    <reporting> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>cobertura-maven-plugin</artifactId> 
     <version>${cobertura-maven-plugin.version}</version> 
     </plugin> 
     ... 
    </plugins> 
    </reporting> 
</project> 

只是這種設置測試,並檢查是否已創建或不是代碼覆蓋率。如果不是,你需要展示更多你的項目(POM,測試等)。

+0

我按照你的指示,得到了同樣的結果。唯一的區別是在2.13下,測試根本不運行。使用2.1.3所有測試運行。很奇怪。根據你的建議,我會在上面發佈整個pom.xml。再次感謝您的關注。 – JAM 2013-02-19 00:12:57

+0

另外請注意,如果我根本沒有任何階段,cobertura根本不運行 – JAM 2013-02-19 00:15:32

1

首先,我會建議運行mvn clean install cobertura:cobertura,當您希望生成覆蓋率報告時。這不太可能是你想爲每一個構建做的事情(我個人只在詹金斯使用Cobertura)。其次,讓所有測試運行兩次看起來似乎很煩人,但有些人認爲這更可靠,而且是有意的行爲。 這是因爲cobertura測試你的字節碼。因此,這個(很少)的機會會讓你的測試結果混亂起來。

但當然,這雙試運行非常耗時,這是另一個原因,你不會跑的Cobertura:在標準的生命週期