沈雷 楊竣鐸
摘要:隨著國(guó)產(chǎn)化工作的推進(jìn),國(guó)產(chǎn)生態(tài)環(huán)境日益成熟,運(yùn)行于國(guó)產(chǎn)平臺(tái)的軟件數(shù)量不斷增加,對(duì)測(cè)試工具的需求也越來(lái)越高。文章對(duì)國(guó)產(chǎn)計(jì)算機(jī)系統(tǒng)的開源測(cè)試工具進(jìn)行研究,從靜態(tài)分析、單元測(cè)試、功能測(cè)試、性能測(cè)試和覆蓋測(cè)試對(duì)工具進(jìn)行了分類,提出了國(guó)產(chǎn)操作系統(tǒng)開源測(cè)試工具整合方案。
關(guān)鍵詞:國(guó)產(chǎn)化;開源工具;軟件測(cè)試
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2020)08-0080-03
0 引言
經(jīng)過(guò)多年發(fā)展,開源軟件運(yùn)動(dòng)已經(jīng)獲得很大成功,借助開源測(cè)試工具構(gòu)造一個(gè)完整的測(cè)試解決方案,既能提高測(cè)試效率又能降低測(cè)試成本。另一方面,國(guó)產(chǎn)操作系統(tǒng)雖愈來(lái)愈成熟,但缺乏基于這些操作系統(tǒng)的軟件測(cè)試方法。我們希望能夠把現(xiàn)有的較為成熟的開源軟件測(cè)試工具進(jìn)行整合,形成一個(gè)能穩(wěn)定運(yùn)行于國(guó)產(chǎn)操作系統(tǒng)的軟件測(cè)試解決方案。該方案能應(yīng)用于靜態(tài)分析、單元測(cè)試、功能測(cè)試、性能測(cè)試和覆蓋測(cè)試等測(cè)試常用場(chǎng)景。
與商業(yè)軟件測(cè)試工具相比,開源軟件測(cè)試工具具有如下特點(diǎn):
(1)數(shù)量大:僅在opensourcetesting.org網(wǎng)站上統(tǒng)計(jì)的開源軟件測(cè)試工具就有超過(guò)360種,其中面向Java程序的單元測(cè)試開源軟件工具就有70多種。
(2)目標(biāo)單一:開源軟件測(cè)試工具往往是面向一個(gè)非常具體的領(lǐng)域,而不像商業(yè)軟件測(cè)試工具會(huì)將各種功能模塊集成起來(lái),解決各個(gè)領(lǐng)域的問(wèn)題。例如,每種開源的軟件單元測(cè)試工具往往只能支持一種開發(fā)語(yǔ)言。
(3)運(yùn)行需求各異:不同的開源軟件測(cè)試工具有不同的運(yùn)行需求,包括不同的操作系統(tǒng)版本、不同的腳本語(yǔ)言版本(如不同版本的waitr需要先安裝不同版本的Ruby)。
(4)用戶使用不便:很多開源軟件測(cè)試工具都缺乏良好的用戶使用界面,也缺乏穩(wěn)定的維護(hù)團(tuán)隊(duì)。
這些特點(diǎn)決定了將開源測(cè)試工具整合起來(lái)并不容易。在后面的討論中,我們按照單元測(cè)試、功能測(cè)試、性能測(cè)試的順序推薦了一些較為成熟、使用較為廣泛的開源軟件測(cè)試工具。要說(shuō)明的是,考慮到廣泛使用的國(guó)產(chǎn)操作系統(tǒng)一般都是基于Linux或類似產(chǎn)品開發(fā)的,本文中只討論能基于Linux使用的開源測(cè)試工具。同時(shí)考慮到目前國(guó)產(chǎn)操作系統(tǒng)上較常使用的開發(fā)環(huán)境,本文中重點(diǎn)討論針對(duì)Java、C和C++的開源測(cè)試工具。
1 單元測(cè)試
單元測(cè)試(unit testing)中,軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測(cè)試。對(duì)于單元測(cè)試,使用最多的是基于XUnit框架的測(cè)試用例設(shè)計(jì)方法。
1.1 XUnit
XUnit是一個(gè)基于測(cè)試驅(qū)動(dòng)開發(fā)的測(cè)試框架體系,為用戶在開發(fā)過(guò)程中使用測(cè)試驅(qū)動(dòng)開發(fā)提供了一個(gè)方便的工具。根據(jù)被測(cè)軟件使用的開發(fā)語(yǔ)言的不同,XUnit的成員有很多,如JUnit、CUnit、CPPUnit、PythonUnit、PHPUnit、SQLUnit等,其中每個(gè)測(cè)試框架都有開源的安裝包。這里我們重點(diǎn)討論JUnit、CUnit和CPPUnit。
1.1.1 JUnit
Junit是單元測(cè)試框架體系XUnit的一個(gè)實(shí)例,也是該框架體系中最為成功的一個(gè)。通常使用JUnit進(jìn)行測(cè)試的基本流程如下:
(1)創(chuàng)建一個(gè)TestCase的子類;
(2)寫一個(gè)測(cè)試方法斷言期望的結(jié)果;
(3)寫一個(gè)suite()方法,創(chuàng)建一個(gè)包含全部testxxx方法的測(cè)試套件;
(4)寫一個(gè)main()方法以運(yùn)行測(cè)試;
1.1.2 CUnit
CUnit是一種C語(yǔ)言單元測(cè)試框架,使用CUnit進(jìn)行測(cè)試的基本流程如下:
(1)書寫待測(cè)試的函數(shù)(如果必要,需要寫suite的init/cleanup函數(shù));
(2)初始化Test Registry-CU_initialize_registry();
(3)把測(cè)試包(Test Suites)加入到Test Registry - CU_add_suite();
(4)加入測(cè)試用例(Test Case)到測(cè)試包當(dāng)中-CU_add _test();
(5)使用適當(dāng)?shù)慕涌趤?lái)運(yùn)行測(cè)試程序,例如CU_co-nsole_run_tests();
(6)清除Test Registry-CU_cleanup_registry()。
1.1.3 CPPUnit
CPPUnit是XUnit框架針對(duì)C++語(yǔ)言的實(shí)現(xiàn)。使用CPPUnit進(jìn)行測(cè)試的基本流程如下:
(1)初始化操作,包括:生成被測(cè)試的對(duì)象及其初始化值;
(2)按照要測(cè)試的功能或者流程對(duì)測(cè)試對(duì)象進(jìn)行操作;
(3)對(duì)結(jié)果進(jìn)行驗(yàn)證;
(4)測(cè)試資源的釋放清理。
1.2 其他工具
1.2.1 對(duì)JUnit的擴(kuò)展
一些開發(fā)者基于JUnit進(jìn)行了一些擴(kuò)展,增強(qiáng)了該框架的能力。例如,Cactus專門用于對(duì)服務(wù)端的Java代碼單元測(cè)試(Servlets、EJBs、Tag Libs、Filters、...),DbUnit專門用于對(duì)數(shù)據(jù)庫(kù)驅(qū)動(dòng)項(xiàng)目的Java代碼單元測(cè)試。
1.2.2 Check
Check是另一種對(duì)C語(yǔ)言進(jìn)行單元測(cè)試的測(cè)試框架,最主要的優(yōu)點(diǎn)是對(duì)于每一個(gè)測(cè)試用例的運(yùn)行都fork一個(gè)子進(jìn)程,這么做的原因是因?yàn)镃語(yǔ)言的獨(dú)特性:其他語(yǔ)言如Java,Python,Ruby等,單元測(cè)試運(yùn)行出錯(cuò)時(shí)最多不過(guò)是拋出異常,而C語(yǔ)言如果指針操作錯(cuò)誤,會(huì)遇到“coredump”問(wèn)題,測(cè)試框架直接退出,用戶看不到任何返回。Check的單元測(cè)試運(yùn)行在fork子進(jìn)程中,可以避免測(cè)試框架由于“coredump”而崩潰,優(yōu)點(diǎn)顯而易見。
1.2.3 CxxTest
CxxTest采用Perl分析C++源文件,從中抽取測(cè)試元素,創(chuàng)建用例。由于不需要編寫額外的代碼,增添新的測(cè)試工作量小,可移植性好。編譯即測(cè)試是其最大的優(yōu)點(diǎn)。
2 測(cè)試覆蓋率統(tǒng)計(jì)
很多測(cè)試項(xiàng)目對(duì)測(cè)試覆蓋率提出了明確的要求,因此對(duì)測(cè)試用例集的測(cè)試覆蓋率統(tǒng)計(jì)有著很大的現(xiàn)實(shí)意義。根據(jù)被測(cè)軟件使用的不同開發(fā)語(yǔ)言,已經(jīng)存在多種開源測(cè)試工具,下面討論幾個(gè)常用的工具。
2.1 Emma & EclEmma
Emma是JAVA代碼覆蓋率的開源工具,支持包,類,方法,語(yǔ)句塊(basic block)和行等多級(jí)別的覆蓋率指標(biāo):能測(cè)出某一行是否只是被部分覆蓋,如條件語(yǔ)句短路的情況。Emma能和Makefile和Ant集成,且執(zhí)行效率高,適用于大型項(xiàng)目。
EclEmma是Eclipse和Emma兩個(gè)工具的結(jié)合,增加了圖形界面以及對(duì)集成開發(fā)環(huán)境的支持,便于用戶使用。
2.2 gcov & lcov
gcov是C/C++軟件的測(cè)試代碼覆蓋率的工具,配合GCC共同實(shí)現(xiàn)對(duì)C/C++文件的語(yǔ)句覆蓋和分支覆蓋測(cè)試;結(jié)合程序概要分析工具(profiling tool,例如gprof),gcov可以統(tǒng)計(jì)每一行代碼的執(zhí)行頻率、覆蓋情況及耗時(shí)(執(zhí)行時(shí)間)。
lcov是gcov圖形化的前端工具,是LTP(Linux Test Project)維護(hù)的開放源代碼工具,最初被設(shè)計(jì)用來(lái)支持Linux內(nèi)核覆蓋率的度量。lcov基于Html輸出并生成一棵完整的HTML樹,包括概述、覆蓋率百分比、圖表,能快速瀏覽覆蓋率數(shù)據(jù)。lcov支持大項(xiàng)目,提供三個(gè)級(jí)別的視圖:目錄視圖、文件視圖、源碼視圖。
3 代碼靜態(tài)檢查
代碼靜態(tài)檢查是指通過(guò)分析或檢查源程序的語(yǔ)法、結(jié)構(gòu)、過(guò)程、接口等來(lái)檢查程序的正確性,找出代碼隱藏的錯(cuò)誤和缺陷,如參數(shù)不匹配、可能出現(xiàn)的空指針引用等。
3.1 Findbugs
FindBugs是一款開源Java靜態(tài)代碼分析工具。它通過(guò)檢查類文件或JAR文件,將字節(jié)碼與一組缺陷模式進(jìn)行對(duì)比從而發(fā)現(xiàn)代碼缺陷。在工具界面,需要先選擇待掃描的 .class文件。如果有這些.class檔對(duì)應(yīng)的源文件,可把這些 .java文件再選上,這樣便可以從稍后得出的報(bào)告中快捷定位到出問(wèn)題的代碼。此外,還可以選擇工程所使用的庫(kù),這樣可以幫助FindBugs做一些高階的檢查,發(fā)現(xiàn)一些更深層的缺陷。可以發(fā)現(xiàn)的典型缺陷如空指針引用、特定的資源未關(guān)閉、多余的If后置條件、錯(cuò)誤地使用了“==”等等。
3.2 Splint
splint是一個(gè)靜態(tài)檢查C語(yǔ)言程序安全弱點(diǎn)和編寫錯(cuò)誤的靜態(tài)測(cè)試工具,不需要運(yùn)行程序即可進(jìn)行錯(cuò)誤檢查,包括未使用的變量、類型不一致、使用未定義變量、無(wú)法執(zhí)行的代碼、忽略返回值、執(zhí)行路徑未返回、無(wú)限循環(huán)等錯(cuò)誤。能通過(guò)splint的輸出結(jié)果,分析出被測(cè)C語(yǔ)言程序中的錯(cuò)誤所在,并實(shí)現(xiàn)錯(cuò)誤在程序中的定位。
4 功能測(cè)試
功能測(cè)試是按功能需求對(duì)軟件進(jìn)行的測(cè)試,也叫黑盒測(cè)試或數(shù)據(jù)驅(qū)動(dòng)測(cè)試。面向功能測(cè)試的測(cè)試工具的主要任務(wù)是快速生成正確的測(cè)試用例。
4.1 Abbot
Abbot是一個(gè)用來(lái)測(cè)試JavaGUIs的框架。Abbot提供了一組API可以允許開發(fā)抓取應(yīng)用程序窗口中的各個(gè)組件,然后模擬用戶的操作。Abbot提供了錄制腳本的功能,可以利用錄制工具在配置好相關(guān)應(yīng)用的Jar包的類和函數(shù)后,啟動(dòng)應(yīng)用并錄制相關(guān)腳本。錄制的腳本可以導(dǎo)出為xml格式的文件。也可以在腳本中添加斷言來(lái)給自動(dòng)化腳本添加一些業(yè)務(wù)邏輯的判斷和控制。目前我們使用Abbot更多是用來(lái)做組件的功能測(cè)試,也可以理解為是一個(gè)對(duì)于組件的單元測(cè)試框架,可以繼承到Junit或者是Fitnesse框架中。
4.2 Marathon
Marathon是一個(gè)基于Jython的開源自動(dòng)化GUI測(cè)試框架。Marathon的錄制功能比較強(qiáng)大,而且操作界面比較直觀,方便使用。Mathon錄制的腳本是基于Jython的,由于Jython是運(yùn)行在JVM上面的Python,語(yǔ)法也和Java比較接近,對(duì)于有java經(jīng)驗(yàn)的工程師而言,非常容易上手。Marathon提供的fixture和module功能,可以把自動(dòng)化腳本模塊化,提高了腳本的復(fù)用性。
4.3 Selenium(Selenium WebDriver)
Selenium是用于Web應(yīng)用程序的一個(gè)開源測(cè)試工具,直接運(yùn)行在瀏覽器中。可以在Windows、Linux和Mac上的 Internet Explorer、Mozilla和Firefox瀏覽器中運(yùn)行。主要功能包括:(1)測(cè)試應(yīng)用程序與瀏覽器的兼容性;(2)測(cè)試系統(tǒng)功能,包括創(chuàng)建衰退測(cè)試檢驗(yàn)軟件功能和用戶需求。支持自動(dòng)錄制,可以自動(dòng)生成.Net、Java、Perl等不同語(yǔ)言的測(cè)試腳本。
5 性能測(cè)試
性能測(cè)試是通過(guò)測(cè)試工具模擬各種正常、峰值以及異常負(fù)載條件來(lái)對(duì)系統(tǒng)的各項(xiàng)性能指標(biāo)進(jìn)行測(cè)試。負(fù)載測(cè)試和壓力測(cè)試都屬于性能測(cè)試。
5.1 JMeter
JMeter是Apache組織開發(fā)的基于Java的性能測(cè)試工具,可用于測(cè)試靜態(tài)和動(dòng)態(tài)資源,包括靜態(tài)文件、Java小服務(wù)程序、CGI腳本、Java對(duì)象、數(shù)據(jù)庫(kù)、FTP服務(wù)器等等。能夠模擬負(fù)載,在不同壓力下對(duì)服務(wù)器、網(wǎng)絡(luò)或?qū)ο蟮膹?qiáng)度進(jìn)行測(cè)試并對(duì)整體性能進(jìn)行分析。
5.2 DBMonster
DBMonster是一個(gè)用生成隨機(jī)數(shù)據(jù)來(lái)測(cè)試SQL數(shù)據(jù)庫(kù)的性能測(cè)試工具。DBMonster是一個(gè)Java的開源項(xiàng)目,通過(guò)JDBC方式連接數(shù)據(jù)庫(kù),可以在任何支持Java和JDBC的平臺(tái)上運(yùn)行。DBMonster開發(fā)的初衷是為數(shù)據(jù)庫(kù)開發(fā)者服務(wù),可以協(xié)助產(chǎn)生大量規(guī)則或不規(guī)則數(shù)據(jù),便于數(shù)據(jù)庫(kù)開發(fā)者基于這些數(shù)據(jù)進(jìn)行數(shù)據(jù)庫(kù)的調(diào)優(yōu)。DBMonster通過(guò)兩個(gè)XML文件(配置文件和 schema文件)控制數(shù)據(jù)產(chǎn)生的行為,配置文件指明需要連接的數(shù)據(jù)庫(kù)、連接使用的用戶名和口令、需要操作的scheme、重試次數(shù)等全局設(shè)置,而 scheme文件則指明針對(duì)每張數(shù)據(jù)表的每個(gè)字段產(chǎn)生數(shù)據(jù)的規(guī)則。
6 結(jié)語(yǔ)
本文總結(jié)了部分常用的開源測(cè)試工具,將這些工具整合起來(lái),可以有效地在國(guó)產(chǎn)操作系統(tǒng)基礎(chǔ)上對(duì)Java、C、C++的軟件產(chǎn)品進(jìn)行各種類型的軟件測(cè)試。在開源世界中,還有大量各具特色的開源測(cè)試工具,在使用過(guò)程中應(yīng)根據(jù)項(xiàng)目的特點(diǎn)有針對(duì)性地進(jìn)行選擇。