每日構建(包含自動化測試,至少我是這麼做的)可以保證我們的代碼每天都在可控制的範圍內,任何人對於代碼庫中的修改都能通過每日構建反饋給開發小組,但是我們如何知道我們所有的測試是否夠呢,我們是否遺漏的某些代碼的四角了,這些問題通過簡單的測試報告是無法獲知的,幸好我們有代碼測試覆蓋工具可以幫助我們消除我們的擔憂.
下面我來說一下自己是如何實踐代碼覆蓋率測試的.
如下我已經擁有了自己的工程,工程結構圖如下
工程中的ant build是通過eclipse自動生成的,生成方法爲右擊工程名-->export.
大家可以根據自己的需要來選擇生成腳本,我對於家裏自己的工程基本都是用eclipse自己的生成的,至於公司則全部手寫,其實ant手寫也挺快的,而且也非常簡單.
好了,我們現在有了ant 腳本,我們加下來需要做的就是將單元測試覆蓋的功能加進去.我選擇使用cobertura,免費的鼕鼕生成的報告非常有用,而且能和ant非常好的集成.ant本身並沒有cobertura的task支持,我們需要做點手腳讓ant明白我們要用cobertura.
首先當然是從cobertura的官網上(http://cobertura.sourceforge.net/)下載cobertura的最新版本,現在最新版本爲1.9.
接下來我們需要在我們的build腳本中聲明cobertura的 task
<path id="cobertura.classpath">
<fileset dir="${cobertura.dir}">
<include name="cobertura.jar" />
<include name="lib/**/*.jar" />
</fileset>
</path>
<delete file="cobertura.ser" />
<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
要使用我們必須對我們所需要測試的class文件打上標籤
<cobertura-instrument todir="WebRoot/WEB-INF/instrumented-classes">
<fileset dir="WebRoot/WEB-INF/classes">
<include name="**/*.class" />
</fileset>
</cobertura-instrument>
</target>
標籤打好了,接下來就是測試了,這裏有一點很重要,就是打上標籤的class必須在被測試的class之前出現.
<mkdir dir="${junit.output.dir}/cover-test" />
<junit fork="yes" printsummary="withOutAndErr">
<formatter type="xml" />
<classpath>
<fileset dir="D:/developTools/cobertura-1.9/lib">
<include name="**/*.jar" />
</fileset>
</classpath>
<classpath refid="cobertura.classpath" />
<classpath location="D:/developTools/cobertura-1.9/cobertura.jar" />
<classpath location="WebRoot/WEB-INF/instrumented-classes" />
<classpath>
<pathelement path="WebRoot/WEB-INF/classes" />
</classpath>
<classpath refid="test.classpath" />
<batchtest fork="yes" todir="${junit.output.dir}">
<fileset dir="test">
<include name="**/*Test*.java" />
<exclude name="**/AllTests.java" />
</fileset>
</batchtest>
</junit>
</target>
ok測試也有了,現在該是產生測試報告的時候了
<cobertura-report destdir="cobertura">
<fileset dir="src">
<include name="**/*.java" />
</fileset>
<fileset dir="test">
<include name="**/*.java" />
</fileset>
</cobertura-report>
</target>
好了,到這裏爲止我們的build文件已經可以產生測試覆蓋率報告了,讓我們運行看看結果吧.