Search This Blog

Saturday, May 19, 2012

cobertura-maven-plugin

Recently I created a parent pom for my team to use.  All my team's projects need to inherit this parent pom.  This parent pom is rather simple:

  <properties>
    <default.encoding>UTF-8</default.encoding>
    <default.jdk>1.6</default.jdk>
    <line.coverage.target>90</line.coverage.target>
    <branch.coverage.target>90</branch.coverage.target>
  </properties>

  <build>
    <defaultGoal>install</defaultGoal>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.3.2</version>
          <configuration>
            <source>${default.jdk}</source>
            <target>${default.jdk}</target>
            <encoding>${default.encoding}</encoding>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
          <version>2.1.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>2.5</version>
          <configuration>
            <encoding>${default.encoding}</encoding>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>2.8</version>
          <configuration>
            <encoding>${default.encoding}</encoding>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.2.2</version>
        </plugin>

        <!-- Sonar uses these versions, below -->
        <plugin>
          <artifactId>maven-pmd-plugin</artifactId>
          <version>2.7.1</version>
          <configuration>
            <targetJdk>${default.jdk}</targetJdk>
            <encoding>${default.encoding}</encoding>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-checkstyle-plugin</artifactId>
          <version>2.9.1</version>
          <configuration>
            <encoding>${default.encoding}</encoding>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>cobertura-maven-plugin</artifactId>
          <version>2.5.1</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.12</version>
        </plugin>
      </plugins>
    </pluginManagement>

    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <configuration>
          <check>
            <!-- Per-class thresholds -->
            <branchRate>${branch.coverage.target}</branchRate>
            <lineRate>${line.coverage.target}</lineRate>
            <!-- Project-wide thresholds -->
            <totalLineRate>${line.coverage.target}</totalLineRate>
            <totalBranchRate>${branch.coverage.target}</totalBranchRate>
          </check>
          <formats>
            <format>html</format>
          </formats>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>clean</goal>
              <goal>cobertura</goal>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
      </plugin>
      <plugin>
        <!-- Ensure that source code is packaged and deployed for inclusion into IDEs -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

    </plugins>
  </build>
We are targeting a pretty high unit test coverage, 90% for both line and branch coverage.  However, some classes don't need unit test or don't need high coverage.  Then each individual project can include the following to its project pom:
    <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <configuration>
          <instrumentation>
            <ignores>
              <ignore>org.slf4j.*</ignore>
            </ignores>
            <excludes>
              <exclude>com/zhentao/Some.class</exclude>
              <exclude>com/zhentao/other.class</exclude>
            </excludes>
          </instrumentation>
        </configuration>
      </plugin>
    </plugins>
  </build>
 <ignore>org.slf4j.*</ignore> ignores all log statement in the code since we don't need to test logs.
<exclude>com/zhentao/Some.class</exclude> excludes Some.class from the cobertura report.

However, this flexibility can be abused by some developers.  I got an build failed notification today:
11:52:52  Archiving artifacts
11:52:52  [htmlpublisher] Archiving HTML reports...
11:52:52  [htmlpublisher] Archiving at PROJECT level /target/site/cobertura to /htmlreports/Cobertura_Report
11:52:52  ERROR: Specified HTML directory '/target/site/cobertura' does not exist.
11:52:52  Build step 'Publish HTML reports' changed build result to FAILURE
 One developer excluded all classes from testing.  What a developer!

No comments:

Post a Comment