1. 程式人生 > >用 Cobertura 測量程式碼測試覆蓋率

用 Cobertura 測量程式碼測試覆蓋率

Cobertura是一個基於jcoverage的免費Java工具,它能夠顯示哪一部分程式碼被你的測試所覆蓋,並可生成HTML或XML報告.

cobertura 的大概基本工作思路:
1.對已經編譯好的class 檔案新增標記
2. 對新增好標記的程式碼進行單元測試
3. 輸出覆蓋率統計報告

在ant 中使用cobertura 的基本步驟:
1. 編譯程式碼
2. 定義cobertura 的ant task
3. 用nstrument 命令為編譯好的程式碼新增標記
4. 用junit 命令對新增好標記的程式碼進行單元測試
5. 用cobertura-report 命令輸出報告

編譯程式碼:

<target name="compile">
        <ant antfile="build.xml" inheritAll="false" target="compile"/>
 </target>
 

在 build.xml 檔案中新增一個任務定義:

<path id="cobertura.classpath">
        <fileset dir="${lib.dir}">
            <include name="cobertura/*.jar"/>
        </fileset>
        <pathelement location="${cobertura.instrumented.classes.dir}"/>
    </path>

    <taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>

新增一個instrument 任務,該任務將在已經編譯好的類檔案中新增標記。todir 屬性指定將測量類放到什麼地方。fileset 子元素指定測量哪些 .class檔案:

<target name="instrument" depends="compile">
        <cobertura-instrument todir="${cobertura.instrumented.classes.dir}">
            <fileset dir="${build.src.dir}">
                <include name="**/*.class"/>
                <exclude name="**/web/**/*.class"/>
                <exclude name="**/constant/*.class"/>
                <exclude name="**/*Test.class"/>
            </fileset>
        </cobertura-instrument>
    </target>

 可以排除一些不需要檢查的class檔案。

執行測試:

<target name="cover-test" depends="instrument">
        <mkdir dir="${cobertura.report.dir}"/>
        <junit fork="true" failureproperty="unit.tests.failed" printsummary="true" showoutput="yes">
            <classpath>
                <!--
                   Note the classpath order: instrumented classes are before the
                   original (uninstrumented) classes.  This is important.
               -->
                <path refid="cobertura.classpath"/>
                <path refid="test.classpath"/>
            </classpath>
            <formatter type="xml"/>
            <batchtest todir="${cobertura.report.dir}">
                <fileset dir="${build.unittest.dir}">
                    <include name="**/*Test.class"/>
                </fileset>
                <fileset dir="${build.functionaltest.dir}">
                    <include name="**/*Test.class"/>
                </fileset>
                <fileset dir="${build.integrationtest.dir}">
                    <include name="**/*Test.class"/>
                </fileset>
            </batchtest>
        </junit>
    </target>
 

最後,生成測試測量報告:

<target name="coverage-report" depends="cover-test">
        <cobertura-report format="html" destdir="${cobertura.report.dir}" srcdir="${src.dir}"/>
    </target>
 

生成的報告形式大概如下:

測量效果圖