軟件測試實驗學習筆記系列4--CppUnit
單元覆蓋測試
覆蓋測試是衡量軟件質量的一個重要的指標,是一種”白合”測試方法,覆蓋的標準有邏輯覆蓋,循環覆蓋,基本路徑覆蓋。其中邏輯測試包括語句覆蓋,判定覆蓋,條件覆蓋,判定/條件覆蓋,條件組合覆蓋和路徑覆蓋。
覆蓋測試必須擁有程序的規格說明書和程序清單,以程序的內部結構為清單設計測試用例。覆蓋測試主要使用在具有高可靠性要求的軟件領域(軍工企業,航空航天軟件,工業控制軟件).覆蓋測試需要借助一定的工具軟件,工具軟件具有的功能特點:
分析軟件內部接口,幫助定制覆蓋策略及設計測試用例
與適當的編譯器結合,對被測軟件實施自動插樁,以便在其運行過程中生成覆蓋信息并收集這些覆蓋信息
根據收集的覆蓋信息計算覆蓋率(Coverage),幫助測試人員找到未被覆蓋的軟件部分,以改進測試用例,提高覆蓋率
對主流開發語言的支持,因為對不同的開發語言來說,測試工具的實現的方式和內容差別是較大的。目前測試工具主要支持的開發語言是:標準C,C++,Visual C++,Java等,
進行動態覆蓋測試的三項任務:1.設計測試用例;2.對被測代碼進行插樁;3.收集覆蓋信息并進行分析。
2.1覆蓋測試工具介紹
xUnit基本不支持覆蓋測試(白盒測試中重要的內容)。覆蓋測試工具實現的技術方式和具體的語言是緊耦合的。不同語言使用的覆蓋測試的策略是不一樣的。實例如下:
Java(EclEmma+JUnit,JCoverage)
NET(NCover+NUnit)
CppUnit框架很難提供覆蓋測試的功能,c/c++測試覆蓋測試是通過插樁實現的.C/C++覆蓋測試工具:gcov
2.2JUnit下的覆蓋工具EclEmma
時至今日,IT人士更加關注測試的重要性。 測試驅動開發(TDD)被證明是一種能有效提高軟件質量的方法,測試優先原則,EclEmma2006年入圍Eclipse Community Awards Winners 決賽
2.2.1EclEmma
Emma是Sourceforge上的開源項目,某種程度上,EclEmma是Emma的圖形開發工具。
Eclipse,OpenJDK,JUnit,Ant,CVS或者Subversion,Emma -- java開發成套開源的解決方案。
Emma的同類產品:Coverlipse,Cobertura,Quilt,JCoverage.
EclEmma的特點:快速的開發和測試周期,非常豐富覆蓋信息分析以及非入侵方式。
EclEmma:一個封裝Emma覆蓋工具的Eclipse的插件。Eclemma的官方地址:http://sourceforge.net/projects/eclemma
EclEmma使用不同顏色標識的源代碼測試的情況,綠色-完整執行,紅色-根本沒有執行,黃色-部分被執行,其視圖能夠分層顯示代碼的覆蓋測試率。
2.2.2EclEmma環境建立
EclEmma的安裝是就是Eclipse插件的安裝,共有這樣三種方式安裝.
1.Eclipse自身的Software Update機制.
選中菜單欄中Help/Install New Softeware,在如下圖中對話框中填入插件的站點的信息。
本人是在Ubuntu12.04下使用eclipse的,如果是在windows下的話,具體操作可以參考[2]。
缺點是:當安裝了許多插件之后,eclipse的plugins中會充滿各種舊的或廢棄的插件,不便于更新和管理
2.蠻力法安裝
將插件的壓縮包解壓,然后將其中的plugins和features與eclipse安裝包中的同名文件夾合并,這樣就可以在Eclipse中使用新插件。實際上第一個方法自動安裝也是使用的這種方法,只不過由機器自動改成了手動。缺點同上。
3. links文件
首先從eclemma官方站點下載最新的eclemmaEclipse插件包:http://sourceforge.net/projects/eclemma/files/?source=navbar
在eclipse安裝的目錄下新建一個links文件夾,將相應的插件(例如eclemma-2.2.0)包拷貝到links文件夾下,并在links下新建一個eclemma.link空白的文本,在起中寫入:path=/usr/lib/eclipse/links/eclemma-2.2.0 。注意path=xxx是eclemma在系統中的絕對路徑, 由于我使用的Linux系統,在windows下可能是D:\xxx\eclipse\links\eclemma-2.2.0。
重新啟動一下eclipse就可以看到eclemma被安裝上的標志,最左邊的就是Eclemma的圖標。
備注: 上面的步驟在windows上已經算是安裝完成了,但是在Ubuntu下好像不太行,至少我自己的實踐表明是這樣的,Ubuntu下還要在加上兩步:
進入eclemma-2.2.0文件夾中,在其中建立一個eclipse文件夾并將eclemma目錄下其他的文件移到 eclipse目錄下
進入eclipse目錄,在其中建立一個空的.eclipseextension的隱藏文件(注意"."不可少),并為這個文件加上執行權限。具體的命令如下:
cd /usr/lib/eclipse/links/eclemma-2.2.0/ sudo mkdir eclipse sudo mv * eclipse/ cd eclipse/ vi .eclipseextension chmod +x .eclipseextension |
注意命令中是否需要使用sudo提升權限視情況而定, 如果不是類似 /usr/lib這樣的只有root權限才可以操作的目錄的話,就不需要使用sudo。
2.2.3 EclEmma的使用
關于Eclemma的使用,網上一堆,不再贅述,推薦一篇文章:
使用Eclemma進行覆蓋測試:http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/
2.3C++的覆蓋測試工具gcov
gcov是GNU/GCC的工具組件,可以C/C++代碼覆蓋率的測試工具,使用便捷,不要配置,不是可視界面,只支持CLI命令行界面.如果要使用可視界面,使用Ggcov。
2.3.1gcov環境
gcov是gcc的內部工作組件。利用gcc內部的工具進行代碼插樁。
2.3.2gcov測試功能及使用流程
grov的基本功能:可以查看測試時代碼執行的覆蓋率信息,支持函數覆蓋,語句覆蓋和分支覆蓋等覆蓋測試內容,幫助我們分析測試程序中的缺陷。使用該工具還可以查看程序在某個分析執行的頻率,進而分析程序的性能。
Gcc的覆蓋測試工具gcov,gcov必須和gcc編譯器聯合使用(需要在程序中插樁,參考百度百科程序插樁的解釋)。使用步驟:
在編譯時加上”-ftest-coverage-fprofile-arcs”,a.out(設置了-o選項就是輸出的文件名)和.gcda文件;
執行./a.out時,根據源程序的語句,條件,路徑,邊界等因素,以及設計好的輸入測試用例數據 ,執行的信息保存到.gcno和.gcda文件中-->gcov-b xxx.c-->xxx.c.gcov(里面顯示了每條語句執行的次數,沒有執行的語法則以“####”標注)
注意:使用gcov時,每次重新編譯,統計數據都會清空,所以項目測試必須在確定的版本上進行。
gcov的其他的選項命令可以查看gcov的在線文檔(man gcov)
/*Program: testgcov.c -- interpert the workflow of gcov */ #include<stdio.h> int main(){ printf("Hello,World\n"); } |
編譯執行:gcc-o testgcov -ftest-coverage -fprofile-arcs testgcov.c
./testgcov--->執行程序,各種執行語句將會被寫到testgcov.gcda和testgcov.gcno中
gcov-b testgcov.c --->testgcov.c.gcov詳細的覆蓋信息
testgcov.c.gcov 詳細信息:
-: 0:Source:testgcov.c |
注:gcov -b查看分支執行的頻率,-f查看每個函數執行的情況。
2.3.3gcov覆蓋測試應用舉例
/*Program:autosell.c -- design the input test case and get the code coverage of program */ *coin =0; |
編譯命令:gcc-o autosell -fprofile-arcs -ftest-coverage autosell.c
執行程序(./autosell)隨便輸入一些測試用例:
測試結果:
顯示總體覆蓋率:gcov autosell.c
File'autosell.c'
Linesexecuted:94.55% of 55
Creating'autosell.c.gcov'
顯示函數覆蓋信息:gcov-f autosell.c
Function'process'
Linesexecuted:90.00% of 20
Function'pushbutton'
Linesexecuted:100.00% of 9
Function'getcoin'
Linesexecuted:100.00% of 9
Function'nochange'
Linesexecuted:75.00% of 4
Function'welcome'
Linesexecuted:100.00% of 4
Function'main'
Linesexecuted:100.00% of 9
File'autosell.c'
Linesexecuted:94.55% of 55
Creating'autosell.c.gcov'
顯示分支信息:gcov-b autosell.c
File'autosell.c'
Linesexecuted:94.55% of 55
Branchesexecuted:100.00% of 28
Takenat least once:92.86% of 28
Callsexecuted:87.50% of 24
Creating'autosell.c.gcov'
具體的autosell.c.gcov信息自行查看
參考資料:
[1]軟件測試實驗指導教程/蔡建平, 清華大學出版社, 2009.11
[2]軟件測試學習:測試覆蓋率工具EclEmma安裝與使用:http://liangruijun.blog.51cto.com/3061169/803473
[3]使用Eclemma進行覆蓋測試:http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/
相關文章: