Java 覆盖率相关实践总结

最近接手的新项目需要使用代码覆盖率进行辅助测试,所以结合之前项目的实践笔记及经验,把Java代码覆盖率相关的知识做了一个回顾和总结。
我们一般都是用jacoco+jenkins进行代码覆盖率的统计和展示。从实践来看,变更代码覆盖率分析更贴合我们日常的使用场景。在版本迭代及回归测试阶段,可以采用黑盒测试+变更覆盖分析(白盒测试)的灰盒测试方法,完善测试场景,减少测试遗漏,保证测试的充分性。

具体的jacoco的配置及jenkins的配置可以参考以下文档:
jenkins+jacoco配置代码覆盖率
Jacoco Code Coverage

附我们项目中使用的build.xml配置:

<?xml version="1.0" ?>
<project name="Example" xmlns:jacoco="antlib:org.jacoco.ant" basedir="." default="rebuild">
    <!--Jacoco文件路径-->
    <property name="jacocoantPath" value="/home/test/tools/jacoco-0.7.4/lib/jacocoant.jar"/>
    <!--最终生成.exec文件的路径,Jacoco根据这个文件生成最终的报告-->
    <property name="jacocoexecPath" value="/home/test/jenkins/workspace/Example-Coverage/jacoco_ci_report/exec/"/>
    <!--生成覆盖率报告的路径-->
    <property name="reportfolderPath" value="/home/test/jenkins/workspace/Example-Coverage/jacoco_ci_report/report/"/>
    <!--远程tomcat服务的ip-->
    <property name="server_ip" value="10.165.***.**"/>
    <!--jacocoagent服务打开的端口-->
    <property name="server_port" value="8035"/>
    <!--源代码路径-->
    <property name="checkOrderSrcpath" value="/home/test/jenkins/workspace/Example-Coverage/moduleName/src/main/java" />
    <!--.class文件路径-->
    <property name="checkOrderClasspath" value="/home/test/jenkins/workspace/Example-Coverage/moduleName/target/classes" />
    <tstamp>  
        <format property="stime" pattern="yyyy-MM-dd HH-mm-ss" locale="cn"/>  
    </tstamp> 
    <!--ant知道去哪儿找Jacoco-->
    <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
        <classpath path="${jacocoantPath}" />
    </taskdef>

    <!--dump任务: 根据前面配置的ip地址和端口,访问目标tomcat服务,并生成.exec文件。-->
    <target name="dump">
        <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}ExampleApiTest${stime}.exec" port="${server_port}" append="true" dump="true"/>
    </target>
    <!--merge指定的.exec文件-->
    <target name="merge_exec">
        <jacoco:merge destfile="${jacocoexecPath}ExampleApiTest-merge.exec">
            <fileset dir="${jacocoexecPath}" includes="ExampleApiTest*.exec" />
        </jacoco:merge>
    </target>

    <!--jacoco任务:根据前面配置的源代码路径和.class文件路径,及merge后生成的.exec文件,生成最终的html覆盖率报告-->
    <target name="report">
        <delete dir="${reportfolderPath}" />
        <mkdir dir="${reportfolderPath}" />
     <jacoco:report>
          <executiondata>
              <file file="${jacocoexecPath}ExampleApiTest-merge.exec" />
          </executiondata>

          <structure name="JaCoCo Report">
              <group name="Check Order related">           
                  <classfiles>
                      <fileset dir="${checkOrderClasspath}" />
                  </classfiles>
                  <sourcefiles encoding="gbk">
                      <fileset dir="${checkOrderSrcpath}" />
                  </sourcefiles>
              </group>
          </structure>

          <html destdir="${reportfolderPath}" encoding="utf-8" />         
          <_xml destfile="${reportfolderPath}/jacoco_report.xml" encoding="utf-8" />
    </jacoco:report>
    </target>
    <target name="rebuild" depends="dump,merge_exec,report"></target>
</project>