testng查看覆盖率_使用Cobertura统计单元测试覆盖率
學(xué)習(xí)Cobertura的起因是前天晚上媳婦兒(終于有出場機(jī)會了)突然問我有沒有用過一些可以統(tǒng)計(jì)單元測試覆蓋率的工具,答曰:木有...感覺比較丟人,于是昨天晚上研究了一把,今天順便share一下。
因?yàn)橹皼]有用過這方面的工具,所以只能Google一下了,發(fā)現(xiàn)有很多這方面的工具,看著比較順眼的有JCoverage, EMMA, Cobertura等等,因?yàn)镴Coverage收費(fèi)了,所以最后挑了一個(gè)自己感覺生成的report比較好看的學(xué)習(xí)了一把:Cobertura。 (如果有更好的工具,還望不吝賜教)
剛看到Cobertura的時(shí)候,比較糾結(jié),因?yàn)椴徽J(rèn)識這個(gè)詞兒,也查不到是什么意思,據(jù)說是西班牙語的“覆蓋率”之類的意思,我也無從考究了,反正現(xiàn)在我是老寫錯(cuò),囧RZ...
以上都是閑篇兒...
--- James Gosling mused: "I don't think anybody tests enough of anything."
做單元測試是developer都要接觸的事情,工具也基本上都是選擇JUnit或者TestNG,但是無論是JUnit還是TestNG都只能得出一個(gè)測試用例相關(guān)的報(bào)表
從這個(gè)報(bào)表中我們能得信息是,測試用例的執(zhí)行情況,成功率,失敗率,哪個(gè)失敗了等等。通過這份報(bào)表我們并不能得悉我們是否把所有的功能代碼都測試到了,那么這時(shí)候我們就需要引入單元測試覆蓋率的概念了。
單元測試覆蓋率通俗的講就是多少行代碼被測試用例運(yùn)行到了,多少個(gè)block被執(zhí)行了,多少個(gè)包被執(zhí)行了等,通過這些數(shù)據(jù)我們可以清楚的了解測試的覆蓋率情況,進(jìn)而反向的改善已有的或者新添加測試用例去盡可能多的覆蓋功能代碼,block等,以提高代碼的可信賴度。
對于Java而言,進(jìn)行覆蓋率分析的方式有三類:第一種是將instrumentation(不知道怎么翻譯好,測試儀表?),直接加入到源代碼中;第二種是將instrumentation加入到編譯好的Java字節(jié)碼中;第三種是在一個(gè)可編輯的虛擬機(jī)中運(yùn)行代碼。Cobertura選擇了第二種方式。
為了便于使用,Cobertura提供了兩種方式將Cobertura集成到已有的運(yùn)行環(huán)境中: Ant和命令行
總結(jié)起來Cobertura做的事情就是:
1. Cobertura將instrumentation加入到編譯好的需要被檢測的Java類的字節(jié)碼中。
2. 運(yùn)行測試用例的時(shí)候Cobertura通過之前安插好的instrumentation統(tǒng)計(jì)每一行代碼是否被執(zhí)行,所有被植入instrumentation的類的序列化信息將被寫入cobertura.ser。
3. 根據(jù)統(tǒng)計(jì)結(jié)果生成報(bào)表,格式為XML或者HTML。
整個(gè)過程不需要我們額外寫任何Java代碼,只需要通過ant腳本或者命令行觸發(fā)相應(yīng)的操作。
下面首先介紹一下使用ant腳本的方式。
第二步,將Cobertura目錄下面的Cobertura.jar和lib下所有jar拷貝到你的工程的某個(gè)目錄下。
第三步,創(chuàng)建ant腳本,或者在已有的ant腳本中添加相應(yīng)的target。
現(xiàn)在開始設(shè)置ant腳本
第一步,將cobertura.jar以及Cobertura/lib下的所有jar引入classpath
注:lib.dir是你存放cobertura.jar以及/Conbertura/lib/*.jar的地方
第二步,將cobertura自身定義的task引入到ant腳本中
第三步,編譯工程代碼到某個(gè)目錄,比如${src.java.classes.dir}
注:你可以選擇將所有的業(yè)務(wù)代碼和測試代碼編譯到一個(gè)classes目錄下,或者選擇編譯到不同的目錄下,在本例中將使用不同的目錄存放java.src和test.src。
注:src.java.dir存放所有的將被測試的java類,src.java.classes.dir存放java類的編譯字節(jié)碼;src.test.dir存放所有的測試用例,?src.test.classes.dir存放測試用例的編譯字節(jié)碼。init target用來創(chuàng)建一些備用的目錄,將包含在附件的完整工程代碼中。
第四步,定義target,向生成的java.class里插入instrumentation,test.class將不插入instrumentation,因?yàn)槲覀儾魂P(guān)心測試用例本身的覆蓋率。
注:instrumented.classes.dir存在所有被植入instrumentation的Java class。如果java代碼和測試用例被編譯到了同一個(gè)目錄下,可以使用如忽略測試用例。
第五步,執(zhí)行測試用例,同時(shí)Cobertura將在后臺統(tǒng)計(jì)代碼的執(zhí)行情況。這一步就是普通的junit的target,將執(zhí)行所有的測試用例,并生成測試用例報(bào)表。
注:這一步非常需要注意的是${instrumented.classes.dir}應(yīng)該最先被引入classpath.
第六步,生成測試覆蓋率報(bào)表。
注:因?yàn)槲覍ava代碼和測試用例分別放在不同的包中,所以如果你的代碼都放在一個(gè)包中的話,應(yīng)該使用剔除測試用例;?coverage.cobertura.html.dir是存放report的地方。生成XML報(bào)表的方式將在完成的build.xml文件中給出。
報(bào)表如下圖:
到此我們已經(jīng)完成了生成測試覆蓋率報(bào)表的全部工作,如果還想驗(yàn)證一下測試覆蓋率,可以通過以下方式
現(xiàn)在給出完成的build.xml文件,僅供參考:
The ant file for study-cobertuna
工程目錄結(jié)構(gòu)如下圖:
如果還想使用命令行方式生成覆蓋率報(bào)表,可以參照以下命令行生成報(bào)表
命令行方式如下:
//@rem Go to the cobertura folder
cd C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\tool\cobertura
//@rem list all java source to javalist.txt
dir C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\java\*.java/s/b > javalist.txt
//@rem list all test case source to testlist.txt
dir C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\test\*.java/s/b > testlist.txt
//@rem compile all java sources
javac -d C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\build\src-java-classes @javalist.txt
//@rem compile all test case sources
javac -classpath "$CLASSPATH;C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\lib\junit-4.8.2.jar;C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\build\src-java-classes" -d C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\build\src-test-classes @testlist.txt
//@rem instrument the java class file
cobertura-instrument.bat --destination C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\build\instrumented-classes --ignore org.apache.log4j.* --datafile ../../cobertura.ser C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\build\src-java-classes
//@rem go to the java src folder
cd C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\build\src-java-classes
//@rem run test case through JUnit4
java -cp C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\lib\junit-4.8.2.jar;C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\lib\cobertura.jar;C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\build\instrumented-classes;C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\build\src-java-classes;C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\build\src-test-classes -Dnet.sourceforge.cobertura.datafile=C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\cobertura.ser org.junit.runner.JUnitCore com.javaeye.terrencexu.cobertura.CalculatorTest
//@rem go to cobertura folder
cd C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\tool\cobertura
//@rem generate coverage report
cobertura-report.bat --format html --datafile C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\cobertura.ser --destination C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\reports\cobertura-html C:\eclipse\workspace1\Terrence-JavaStudy\study-cobertura\java
命令行模式用的比較少,不再贅述,感興趣,可以按上述順序執(zhí)行一遍。
大小: 13.4 KB
大小: 9.7 KB
大小: 9.9 KB
3
頂
0
踩
分享到:
2010-07-22 13:55
瀏覽 15091
評論
總結(jié)
以上是生活随笔為你收集整理的testng查看覆盖率_使用Cobertura统计单元测试覆盖率的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【六】方法
- 下一篇: colorpix取色小工具_五款互联网人