testng查看覆盖率_使用Cobertura统计单元测试覆盖率
學習Cobertura的起因是前天晚上媳婦兒(終于有出場機會了)突然問我有沒有用過一些可以統計單元測試覆蓋率的工具,答曰:木有...感覺比較丟人,于是昨天晚上研究了一把,今天順便share一下。
因為之前沒有用過這方面的工具,所以只能Google一下了,發現有很多這方面的工具,看著比較順眼的有JCoverage, EMMA, Cobertura等等,因為JCoverage收費了,所以最后挑了一個自己感覺生成的report比較好看的學習了一把:Cobertura。 (如果有更好的工具,還望不吝賜教)
剛看到Cobertura的時候,比較糾結,因為不認識這個詞兒,也查不到是什么意思,據說是西班牙語的“覆蓋率”之類的意思,我也無從考究了,反正現在我是老寫錯,囧RZ...
以上都是閑篇兒...
--- James Gosling mused: "I don't think anybody tests enough of anything."
做單元測試是developer都要接觸的事情,工具也基本上都是選擇JUnit或者TestNG,但是無論是JUnit還是TestNG都只能得出一個測試用例相關的報表
從這個報表中我們能得信息是,測試用例的執行情況,成功率,失敗率,哪個失敗了等等。通過這份報表我們并不能得悉我們是否把所有的功能代碼都測試到了,那么這時候我們就需要引入單元測試覆蓋率的概念了。
單元測試覆蓋率通俗的講就是多少行代碼被測試用例運行到了,多少個block被執行了,多少個包被執行了等,通過這些數據我們可以清楚的了解測試的覆蓋率情況,進而反向的改善已有的或者新添加測試用例去盡可能多的覆蓋功能代碼,block等,以提高代碼的可信賴度。
對于Java而言,進行覆蓋率分析的方式有三類:第一種是將instrumentation(不知道怎么翻譯好,測試儀表?),直接加入到源代碼中;第二種是將instrumentation加入到編譯好的Java字節碼中;第三種是在一個可編輯的虛擬機中運行代碼。Cobertura選擇了第二種方式。
為了便于使用,Cobertura提供了兩種方式將Cobertura集成到已有的運行環境中: Ant和命令行
總結起來Cobertura做的事情就是:
1. Cobertura將instrumentation加入到編譯好的需要被檢測的Java類的字節碼中。
2. 運行測試用例的時候Cobertura通過之前安插好的instrumentation統計每一行代碼是否被執行,所有被植入instrumentation的類的序列化信息將被寫入cobertura.ser。
3. 根據統計結果生成報表,格式為XML或者HTML。
整個過程不需要我們額外寫任何Java代碼,只需要通過ant腳本或者命令行觸發相應的操作。
下面首先介紹一下使用ant腳本的方式。
第二步,將Cobertura目錄下面的Cobertura.jar和lib下所有jar拷貝到你的工程的某個目錄下。
第三步,創建ant腳本,或者在已有的ant腳本中添加相應的target。
現在開始設置ant腳本
第一步,將cobertura.jar以及Cobertura/lib下的所有jar引入classpath
注:lib.dir是你存放cobertura.jar以及/Conbertura/lib/*.jar的地方
第二步,將cobertura自身定義的task引入到ant腳本中
第三步,編譯工程代碼到某個目錄,比如${src.java.classes.dir}
注:你可以選擇將所有的業務代碼和測試代碼編譯到一個classes目錄下,或者選擇編譯到不同的目錄下,在本例中將使用不同的目錄存放java.src和test.src。
注:src.java.dir存放所有的將被測試的java類,src.java.classes.dir存放java類的編譯字節碼;src.test.dir存放所有的測試用例,?src.test.classes.dir存放測試用例的編譯字節碼。init target用來創建一些備用的目錄,將包含在附件的完整工程代碼中。
第四步,定義target,向生成的java.class里插入instrumentation,test.class將不插入instrumentation,因為我們不關心測試用例本身的覆蓋率。
注:instrumented.classes.dir存在所有被植入instrumentation的Java class。如果java代碼和測試用例被編譯到了同一個目錄下,可以使用如忽略測試用例。
第五步,執行測試用例,同時Cobertura將在后臺統計代碼的執行情況。這一步就是普通的junit的target,將執行所有的測試用例,并生成測試用例報表。
注:這一步非常需要注意的是${instrumented.classes.dir}應該最先被引入classpath.
第六步,生成測試覆蓋率報表。
注:因為我將Java代碼和測試用例分別放在不同的包中,所以如果你的代碼都放在一個包中的話,應該使用剔除測試用例;?coverage.cobertura.html.dir是存放report的地方。生成XML報表的方式將在完成的build.xml文件中給出。
報表如下圖:
到此我們已經完成了生成測試覆蓋率報表的全部工作,如果還想驗證一下測試覆蓋率,可以通過以下方式
現在給出完成的build.xml文件,僅供參考:
The ant file for study-cobertuna
工程目錄結構如下圖:
如果還想使用命令行方式生成覆蓋率報表,可以參照以下命令行生成報表
命令行方式如下:
//@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
命令行模式用的比較少,不再贅述,感興趣,可以按上述順序執行一遍。
大小: 13.4 KB
大小: 9.7 KB
大小: 9.9 KB
3
頂
0
踩
分享到:
2010-07-22 13:55
瀏覽 15091
評論
總結
以上是生活随笔為你收集整理的testng查看覆盖率_使用Cobertura统计单元测试覆盖率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【六】方法
- 下一篇: 手把手带你入门Python爬虫(四、OR