唐躍川,趙渝潔,饒義瓊
(重慶金美通信有限責(zé)任公司,重慶 400030)
隨著軟件業(yè)的日益壯大和逐步成熟,軟件測(cè)試也在不斷發(fā)展。從簡(jiǎn)單的開(kāi)發(fā)人員自行調(diào)試逐漸往規(guī)范化、流程化的方向發(fā)展。其活動(dòng)過(guò)程十分復(fù)雜,如果不借助輔助工具,僅靠人工處理,則不僅效率低下、工作量巨大,而且可能出現(xiàn)無(wú)法解決的問(wèn)題。而單元測(cè)試又對(duì)測(cè)試人員的從業(yè)素質(zhì)提出了更高要求。鑒于以上問(wèn)題,利用一套好的單元測(cè)試工具來(lái)幫助軟件測(cè)試人員提高工作效率,提高工作質(zhì)量,改善工作條件是非常有必要的。
C++Test是美國(guó)Parasoft 公司研發(fā)的一款針對(duì)CC++的單元測(cè)試工具,具有自己的專(zhuān)利技術(shù),其功能覆蓋了從代碼靜態(tài)檢查到仿真代碼運(yùn)行環(huán)境進(jìn)行動(dòng)態(tài)檢查,以及自動(dòng)生成測(cè)試用例和回歸測(cè)試等方方面面,從橫向的測(cè)試寬度和縱向的測(cè)試過(guò)程都能夠給軟件單元測(cè)試提供足夠的支持。
C++Test 提供了以下一些功能:
(1)靜態(tài)代碼檢測(cè)。C++ TEST 內(nèi)建了包括MISRA C++2008 在內(nèi)的共1456種編程規(guī)范,用戶可根據(jù)實(shí)際需要選擇符合自己要求的規(guī)范來(lái)對(duì)代碼進(jìn)行靜態(tài)編程規(guī)范檢測(cè)。
(2)BugDetective(C ++ Test 專(zhuān)利技術(shù))。通過(guò)搜索代碼中的“可疑點(diǎn)”,開(kāi)始分析正在測(cè)試的源碼??梢牲c(diǎn)是潛在的錯(cuò)誤點(diǎn)。這些可疑點(diǎn)在Bug-Detective 規(guī)則中被定義。只要識(shí)別了可疑點(diǎn),Bug-Detective 就調(diào)查導(dǎo)致該可疑點(diǎn)的可能執(zhí)行路徑,并檢查是否有任何確實(shí)違反BugDetective 規(guī)則的路徑存在。如果找到了這樣的路徑,就報(bào)告一個(gè)違例。
(3)單元測(cè)試。用戶可根據(jù)需求,配置TestConfiguration,進(jìn)行異常測(cè)試,功能測(cè)試,回歸測(cè)試。
(4)自動(dòng)生成測(cè)試用例、驅(qū)動(dòng)函數(shù)、樁函數(shù)。根據(jù)用戶配置的TestConfiguration,自動(dòng)生成單元測(cè)試所需要的測(cè)試用例、驅(qū)動(dòng)模塊、樁模塊,并且用戶可以添加、修改、刪除這些自動(dòng)生成的模塊以達(dá)到精確測(cè)試的目的。
(5)TCM(團(tuán)隊(duì)配置管理)和CVS(源碼控制器)。TCM 主要用于一個(gè)項(xiàng)目或者一個(gè)公司級(jí)的測(cè)試配置、抑制條件、規(guī)則文件和測(cè)試用例文件的共享,C++TEST 支持與CVS的連接來(lái)支持共享源碼和相關(guān)測(cè)試資源。
(6)GRS(組報(bào)告系統(tǒng))。用于向項(xiàng)目管理者、軟件設(shè)計(jì)總師、軟件開(kāi)發(fā)人員提供基于角色的報(bào)告。
做單元測(cè)試最大的問(wèn)題就在于驅(qū)動(dòng)函數(shù)和大量樁函數(shù)的編寫(xiě),這將占用測(cè)試人員大量的時(shí)間并且要求測(cè)試人員必須擁有比較豐富的編程經(jīng)驗(yàn),現(xiàn)在,C++TEST 可以幫助我們完成這個(gè)復(fù)雜的工作。
其執(zhí)行過(guò)程如下:“Generate Unit Tests”→“Generate Stubs”→“Build Test Exectable”→“Run Unit Test”,其中“Generate Unit Tests”產(chǎn)生驅(qū)動(dòng)函數(shù),“Generate Stubs”產(chǎn)生樁函數(shù)。所產(chǎn)生的驅(qū)動(dòng)函數(shù)和樁函數(shù)均保存在用戶指定的工作空間內(nèi),可修改。
執(zhí)行“Generate Stubs”后,可以從用戶指定的工作空間中找到C++TEST 自動(dòng)產(chǎn)生的樁函數(shù)如圖1所示。
圖1 C++TEST 自動(dòng)產(chǎn)生的樁函數(shù)
用C ++Test 對(duì)某型交換機(jī)的嵌入式系統(tǒng)(Vx-Works)運(yùn)行程序(開(kāi)發(fā)環(huán)境:Tornado2.2)進(jìn)行靜態(tài)代碼測(cè)試。在系統(tǒng)環(huán)境變量下面添加PATH 變量的值如下:
從GUI 面板中直接導(dǎo)入Tornado 工程,方式如圖2所示。
然后執(zhí)行:“Test Using”→“Builtin”→“Static Analysis”→“MISRA C++2008”。執(zhí)行完成后察看C++TEST的違規(guī)報(bào)告如圖3 所示。
在C++Test的主面板中執(zhí)行:“Test Using”→“Builtin”→“StaticAnalysis”→“BugDetective”。我們選擇的程序中包含以下的函數(shù)語(yǔ)句:
執(zhí)行“BugDetecctive”后,C ++TEST 報(bào)告一個(gè)除0的違例。顯然,當(dāng)min(x,y,m,n)函數(shù)的返回值為0時(shí),出現(xiàn)除0的情況。該功能還能查找出使用未初始化內(nèi)存、空指針解除引用、內(nèi)存和資源泄露等問(wèn)題。
執(zhí)行嵌入式系統(tǒng)的單元測(cè)試過(guò)程如下:
(1)使用交叉編譯器,為目標(biāo)平臺(tái)建立C ++TEST 運(yùn)行時(shí)庫(kù);
(2)配置C++TEST 使其可以在交叉編譯器和開(kāi)發(fā)環(huán)境上工作;
(3)自定義測(cè)試流程定義;
(4)執(zhí)行測(cè)試并使用C++TESE的GUI 來(lái)進(jìn)行結(jié)果分析。
下面就Tornado2.0.2 編寫(xiě)的一個(gè)簡(jiǎn)單程序說(shuō)明如何在C ++TEST 上執(zhí)行嵌入式系統(tǒng)的單元測(cè)試。首先,從C++TEST的GUI 中導(dǎo)入一個(gè)Tornado項(xiàng)目,我們所使用的Tornado 源代碼如下:
在C++TEST的安裝目錄下找到pluginscom.parasoft.xtest.libs.cpp.win32.x86_7.2.10.34oswin32x86libsource arget 目錄下的WR_egcs_simnt_VxWorks5_4.mk 文件,然后查詢和修改相關(guān)變量,在主Mkefile 文件中找到了這個(gè)變量,并將其值修改為:WR_egcs_simnt_VxWorks5_4,然后查找PLATFORM 宏,并 在 主 Makefile 文 件 中 查 找CPPTEST_INC_DIR 變量,將其值定義為../../etc/include,然后將Tornado 安裝目錄中的make.exe 文件拷貝到主Makefile 文件所在的目錄并執(zhí)行Make,如果編譯順利通過(guò),可以在目標(biāo)目錄下得到third_tornadoTest.out 文件,將這個(gè)文件拷貝到C ++TEST工作空間下的workspace.cpptest hird_tornadounit-datacurrent_tubf179707 目錄下,開(kāi)啟Tornado的注冊(cè)器、目標(biāo)服務(wù)器和仿真器,之后,在C ++TEST的GUI 中按照單元測(cè)試的步驟依次執(zhí)行到“構(gòu)建測(cè)試可執(zhí)行文件”并執(zhí)行:“Test Using”→“Builtin”→“Embedded Systems”→“Tornado”→“Load and Run Vxworks Test Object”。
回歸測(cè)試是在確認(rèn)已知程序正確性的基礎(chǔ)上,為這些已知的正確程序生成一個(gè)叫做“回歸基”的測(cè)試套件。如果用戶更改了這個(gè)已知程序,比如:源碼修改、添加、刪除等,那么,可以運(yùn)行已經(jīng)生成的回歸基測(cè)試套件,C ++TEST 能自動(dòng)捕獲測(cè)試輸出的不同點(diǎn),并作為一個(gè)違例報(bào)告給用戶。如果所有的輸出都是相同的,則不會(huì)有違例報(bào)告產(chǎn)生。根據(jù)這個(gè)違例報(bào)告,可以確認(rèn)用戶修改后的源代碼是否使以前的程序功能受到了影響。當(dāng)我們對(duì)一個(gè)程序作了充分測(cè)試并修改后,執(zhí)行“Test Using”→“Builtin”→“Unit Testing”→“Generate Regression Base”,就可以生成回歸基。以前的測(cè)試用例集和現(xiàn)在作為回歸基的測(cè)試用例集的區(qū)別:
沒(méi)有作為回歸基的測(cè)試用例集的函數(shù)格式為:
CPPTEST_POST_CONDITION_INTEGER("int_return",(_return)),其作用是:當(dāng)這個(gè)測(cè)試用例執(zhí)行完成后,在C++TEST的Console 面板中報(bào)告_return的值。
而作為回歸基的測(cè)試用例集的函數(shù)格式為:
CPPTEST_ASSERT_INTEGER_EQUAL(0,(_return)),其作用是:當(dāng)這個(gè)測(cè)試用例完成后,比較_return 和0是否相等,如果相等,則不產(chǎn)生操作,如果不相等,則產(chǎn)生一個(gè)違例報(bào)告給用戶,其中的這個(gè)“0”值,就是在執(zhí)行“Generate Regression Base”時(shí),C++TEST 在執(zhí)行該測(cè)試用例時(shí)所產(chǎn)生的值。然后C++TEST 把這個(gè)值作為執(zhí)行這個(gè)測(cè)試用例的標(biāo)準(zhǔn)輸出,當(dāng)用戶以這個(gè)回歸基為標(biāo)準(zhǔn)進(jìn)行回歸測(cè)試時(shí),C++TEST 就將這個(gè)標(biāo)準(zhǔn)輸出和進(jìn)行回歸測(cè)試時(shí)得到的輸出作比較。
從圖4 中可以看出更改了函數(shù)內(nèi)容后C ++Test 所報(bào)告的違例。
圖4 C++Test 所報(bào)告的違例
從兩個(gè)紅色方框可以很清楚地看到,當(dāng)執(zhí)行test_max_3()這個(gè)測(cè)試用例時(shí),原來(lái)程序的返回值應(yīng)該是1,更改后的程序返回值是0,所以C ++TEST 給出一個(gè)回歸測(cè)試的違例報(bào)告。
C++TEST 支持以下幾種覆蓋率分析:
Line Coverage:語(yǔ)句覆蓋。
Block Coverage:塊覆蓋。
Path Coverage:路徑覆蓋。
Decision Coverage:決策覆蓋。
Simple Condition Coverage:簡(jiǎn)單條件覆蓋。
Modified Condition/Decision Coverage:修正的條件/決策覆蓋。
按照前面介紹的單元測(cè)試流程,執(zhí)行一遍單元測(cè)試,查看C++TEST的Coverage 面板如圖5 所示。
以上是選擇Line Coverage 顯示的覆蓋率結(jié)果,同時(shí),我們還可以選擇查看以其他方式統(tǒng)計(jì)的覆蓋率結(jié)果,如圖6 所示。
從C++TEST的主面板上查看源代碼的覆蓋率也是很方便的,它提供對(duì)已經(jīng)覆蓋部分和未被覆蓋部分的不同顏色的高亮顯示。
由于C ++TEST 不檢測(cè)預(yù)處理語(yǔ)句、變量和函數(shù)定義等語(yǔ)句的覆蓋率,如int x=1;這樣的語(yǔ)句是不會(huì)有綠色的高亮顯示的。
用于用戶定義適合自己項(xiàng)目的測(cè)試配置,包括測(cè)試源的過(guò)濾(只對(duì)某些代碼進(jìn)行測(cè)試,而另一些代碼不進(jìn)行測(cè)試)、靜態(tài)代碼規(guī)范的選擇、產(chǎn)生測(cè)試用例的規(guī)則(產(chǎn)生測(cè)試用例的對(duì)象、方式,測(cè)試用例集存放的地點(diǎn))、執(zhí)行超時(shí)時(shí)間、外部符號(hào)表等內(nèi)容,這里面的配置比較簡(jiǎn)單,各種選項(xiàng)基本上都能見(jiàn)名知義,并且?guī)в型ㄓ眯缘呐渲眠x項(xiàng)不多,只需要按照用戶自己的需求進(jìn)行選擇就行了。
C++TEST 作為一個(gè)以單元測(cè)試為主的測(cè)試工具,功能還是比較強(qiáng)大的。它的靜態(tài)編碼規(guī)范檢測(cè)內(nèi)置的編碼規(guī)范有1456種,并且具有TCM 和Rule-Wrizad 功能。只需要一個(gè)比較了解該項(xiàng)目或者公司實(shí)際需要的編碼規(guī)范的人來(lái)制定相應(yīng)的編碼規(guī)范,就可以在全公司范圍內(nèi)得到應(yīng)用和繼承。如果要做單元測(cè)試的話,利用它的這些功能,能極大地降低測(cè)試人員的工作量,還能降低出錯(cuò)概率和調(diào)試時(shí)間。由于它具有“回歸基”測(cè)試套件的功能,在比較熟悉一個(gè)項(xiàng)目源代碼的情況下,用它來(lái)作回歸測(cè)試也是個(gè)相當(dāng)不錯(cuò)的選擇。同時(shí),開(kāi)發(fā)人員也可以運(yùn)用這個(gè)功能作增量測(cè)試。
[1]Dorota Huizinga,Adam Kolawa.Automated Defect Prevention:Best Practices in Software Management [M].Wiley-Blackwell,2007.
[2]Adam Kolawa.The Next Leap in Productivity:What Top Managers Really Need to Know about Information Technology[M].Wiley,2009.
[3]Delores M Etter,Jeanine A Ingber.Engineering Problem Solving with C ++ (3rd Edition)[M].Prentice Hall,2011.
[4]D.S.Malik.C++ Programming:From Problem Analysis to Program Design[M].South-Western College Publishing,2012.
[5]Ana Colton- Sonnenberg.Computer- based Language Testing:C- Test Vs.Rapid Profile[M].GRIN Verlag oHG,2007.