楊麗麗
摘? 要: API是軟件工程中的一個(gè)重要組成部分,需要設(shè)計(jì)大量的測(cè)試用例來(lái)進(jìn)行充分測(cè)試。借助PICT工具利用組合測(cè)試原理可產(chǎn)生比手動(dòng)生成更高效的測(cè)試用例。本文介紹了PICT的工作原理及使用方法,分析了API測(cè)試用例的設(shè)計(jì)思路,并通過(guò)一個(gè)API測(cè)試用例設(shè)計(jì)實(shí)例詳細(xì)說(shuō)明了如何通過(guò)PICT工具對(duì)API進(jìn)行測(cè)試用例進(jìn)行設(shè)計(jì)。
關(guān)鍵詞: PICT;組合測(cè)試;API
【Abstract】: Application Programming Interface (API) is an import part of soft engineer, which needed be tested by a large number of test cases. The Pairwise Independent Combinatorial Testing tool (PICT) can help you generate tests that are more effective than manually generated tests. This paper describes the principle of PICT and how it works, analyses the design thinking about the API test case and shows how to design API test case with PICT by giving a detailed example.
【Key words】: PICT; Combinatorial testing; API testing
0? 引言
隨著軟件工程理論和實(shí)踐的發(fā)展,從業(yè)人員對(duì)軟件測(cè)試的重要性有了一定的認(rèn)知,希望正式版本發(fā)布前對(duì)軟件進(jìn)行充分測(cè)試,及早發(fā)現(xiàn)問(wèn)題[1-2]。然而現(xiàn)代軟件項(xiàng)目需要適應(yīng)快速變化的市場(chǎng)需求,具有周期短、體量大、穩(wěn)定性要求高的特點(diǎn),軟件測(cè)試人員在有限的項(xiàng)目周期和人力資源下,無(wú)法做到完全的測(cè)試。而不完全的測(cè)試又會(huì)導(dǎo)致軟件缺陷的遺漏,造成無(wú)法估量的損失。
因此,針對(duì)被測(cè)對(duì)象的特點(diǎn)選擇合適的測(cè)試方法,保證測(cè)試覆蓋率的同時(shí)兼顧測(cè)試成本,把數(shù)量巨大的測(cè)試減少到可實(shí)現(xiàn)范圍,減少軟件缺陷造成的風(fēng)險(xiǎn),成為測(cè)試用例設(shè)計(jì)關(guān)注的重點(diǎn)。本文針對(duì)API(Application Programming Interface,應(yīng)用程序編程接口)的特點(diǎn),結(jié)合PICT工具,對(duì)使用組合測(cè)試原理對(duì)API測(cè)試用例進(jìn)行設(shè)計(jì)的方法進(jìn)行? ?探討。
1? API測(cè)試介紹
1.1? API概念
API是一些預(yù)定義的封裝好的函數(shù),即預(yù)先把復(fù)雜的操作寫在一個(gè)函數(shù)里面,并配上說(shuō)明文檔,開發(fā)人員只需調(diào)用API而不需了解內(nèi)部工作機(jī)制的細(xì)節(jié),即可實(shí)現(xiàn)復(fù)雜的工作。其提供了應(yīng)用程序與開發(fā)人員基于某軟件得以訪問(wèn)一組例程的能力[3]。
作為模塊與模塊、系統(tǒng)與系統(tǒng)、軟件與開發(fā)人員之間連接的橋梁,API是軟件工程中的重要組成部分,在軟件項(xiàng)目中應(yīng)用廣泛[4]。API的重要性也決定了針對(duì)API的測(cè)試在軟件研發(fā)過(guò)程中也是重點(diǎn)關(guān)注的內(nèi)容。
1.2? API測(cè)試方法
API接口的測(cè)試一般在集成測(cè)試階段進(jìn)行,重點(diǎn)檢查部件之間的調(diào)用和交互是否起作用,對(duì)其的測(cè)試方法分為白盒測(cè)試和黑盒測(cè)試。
白盒測(cè)試時(shí),軟件測(cè)試人員可訪問(wèn)程序中的代碼,并通過(guò)檢查代碼的線索來(lái)協(xié)助測(cè)試;黑盒測(cè)試時(shí),代碼對(duì)測(cè)試人員不可見,測(cè)試人員需要進(jìn)行一些輸入,得到某種輸出結(jié)果,不需了解代碼如何運(yùn)行[5]。
出于代碼安全和商業(yè)機(jī)密的考慮,在實(shí)際軟件工程項(xiàng)目中,代碼的查看權(quán)限一般不向測(cè)試人員開放。因此,黑盒測(cè)試在API測(cè)試中應(yīng)用較多,本文著重探討黑盒測(cè)試的情況。
使用黑盒測(cè)試方法時(shí),測(cè)試人員根據(jù)接口文檔中API的功能描述,編寫測(cè)試程序或使用輔助測(cè)試工具模擬其它模塊調(diào)用API。通過(guò)對(duì)輸入?yún)?shù)不同的取值覆蓋,驗(yàn)證輸出的對(duì)應(yīng)關(guān)系是否符合功能描述,同時(shí)驗(yàn)證API對(duì)邊界值、異常值的處理,確保接口的可靠性。
綜上所述,API測(cè)試用例設(shè)計(jì)的核心與難點(diǎn)在于設(shè)計(jì)輸入?yún)?shù)的取值覆蓋方案。僅考慮測(cè)試覆蓋率的情況下,可使用窮舉測(cè)試法列出所有可能的輸入?yún)?shù)。此方法的測(cè)試效果雖然最為理想,但由于工作量太大,不符合實(shí)際工程情況;兼顧測(cè)試效率的情況下,常用組合測(cè)試法或正交測(cè)試法,利用參數(shù)之間的正交關(guān)系盡可能的覆蓋較多測(cè)試場(chǎng)景[6-7]。兩者相比較,組合測(cè)試設(shè)計(jì)的用例數(shù)量更為精簡(jiǎn),更能提高測(cè)試效率。
2? PICT介紹
2.1? 概念
PICT(The Pairwise Independent Combinatorial Testing tool)為一款微軟公司出品的命令行用例生成工具,生成的測(cè)試集可以覆蓋任意N個(gè)變量的取值組合?;诮M合測(cè)試的理論,該測(cè)試用例集可以發(fā)現(xiàn)N個(gè)因素共同作用引發(fā)的缺陷。
PICT接受純文本模式的文件作為輸入,輸入文件中包括參數(shù)類別、取值集與約束關(guān)系,輸出是一個(gè)用來(lái)組成組合覆蓋測(cè)試用例的矩陣,每一行表示一個(gè)測(cè)試用例,每一列代表系統(tǒng)的一個(gè)參數(shù),每一項(xiàng)代表測(cè)試用例對(duì)應(yīng)的參數(shù)取值。PICT可幫助測(cè)試人員產(chǎn)生比手動(dòng)生成更高效的測(cè)試用例。
2.2? 實(shí)現(xiàn)原理
組合測(cè)試(combinatorial testing)是一種測(cè)試用例生成方法,其對(duì)傳統(tǒng)測(cè)試用例方法進(jìn)行了綜合。組合測(cè)試?yán)碚摽捎梢粋€(gè)數(shù)學(xué)模型和一個(gè)假設(shè)表示:
數(shù)學(xué)模型:被測(cè)對(duì)象被抽象為函數(shù)f,影響被測(cè)對(duì)象變量作為函數(shù)f的輸入,其取值構(gòu)成有限的變量集合X={x1,x2,…,xn},產(chǎn)品的輸出為函數(shù)的返回值,構(gòu)成變量集合Y={y1,y2,y3,…,ym}。
假設(shè):如果測(cè)試覆蓋了任意i個(gè)(2≤i≤n)輸入變量的取值組合,那么該測(cè)試用例集理論上可以發(fā)現(xiàn)所有i個(gè)變量共同作用引發(fā)的函數(shù)f的缺陷。
組合測(cè)試方法包括多變量組合方法和兩變量組合方法[8]。多變量組合方法的覆蓋率更好,但占用的測(cè)試資源多。兩變量組合方法理論上可以暴露所有由兩個(gè)變量共同作用而引發(fā)的缺陷,占用的測(cè)試資源少。Kuhn和Reilly在2002年通過(guò)對(duì)Mozilla瀏覽器的錯(cuò)誤分析報(bào)告開展了組合測(cè)試的可用性結(jié)果研究。研究結(jié)論表明,大約70%的故障是由兩個(gè)以下參數(shù)的相互作用引起的[9]。因此,兩變量組合方法在測(cè)試覆蓋性上也基本滿足工程需求。
PICT默認(rèn)使用兩變量組合方法,生成的測(cè)試集可以覆蓋任意兩個(gè)變量的取值組合。并且由于組合測(cè)試的數(shù)學(xué)模型沒有描述變量之間的約束關(guān)系,生成的用例集存在一定的冗余,利用PICT可通過(guò)添加輸入的約束條件來(lái)進(jìn)行改進(jìn)[10]。
2.3? 使用方法
使用PICT進(jìn)行用例設(shè)計(jì)的步驟包括:
(1)參數(shù)建模。通過(guò)分析被測(cè)對(duì)象,抽象出待生成變量的類型和取值,使用等價(jià)類方法將有限的取值代替無(wú)限的取值域。然后使用文本編輯器創(chuàng)建一個(gè)模型文件,在該文件中分行詳細(xì)列出變量類型、取值、變量間的約束條件。
(2)將模型文件放入PICT安裝程序路徑,在命令行程序中運(yùn)行PICT,并設(shè)定輸出結(jié)果格式,將輸出矩陣導(dǎo)出至指定文件中。
(3)打開輸出文件,查看用例設(shè)計(jì)結(jié)果。PICT生成一組簡(jiǎn)潔的參數(shù)值選項(xiàng),用來(lái)組合覆蓋測(cè)試用例。
3? API測(cè)試用例設(shè)計(jì)
3.1? 設(shè)計(jì)思路
根據(jù)1.2節(jié)的介紹,API用例設(shè)計(jì)思路主要考慮以下三個(gè)方面:
(1)根據(jù)接口文檔中對(duì)輸入?yún)?shù)的使用規(guī)則,設(shè)計(jì)樣本驗(yàn)證輸入?yún)?shù)個(gè)數(shù)、長(zhǎng)度、類型、有效性等。
(2)根據(jù)等價(jià)類劃分方法,精簡(jiǎn)輸入?yún)?shù)的取值集,減少冗余用例。
(3)分析接口文檔中對(duì)輸出參數(shù)的業(yè)務(wù)規(guī)則描述,梳理業(yè)務(wù)邏輯,明確輸入和輸出的對(duì)應(yīng)關(guān)系以及輸入條件之間的約束條件。
3.2? 設(shè)計(jì)步驟
3.2.1? 分析接口文檔
本文以一個(gè)API接口為例,介紹使用PICT進(jìn)行API測(cè)試用例設(shè)計(jì)的過(guò)程。接口文檔描述如下所示:
(1)API名稱:自動(dòng)請(qǐng)求雙工熱備切換
(2)調(diào)用格式:int reqDupSwitch(DUPSTS *pD up Status);
(3)描述:應(yīng)用程序可調(diào)用此API請(qǐng)求改變雙工狀態(tài)。只有在自動(dòng)方式下才可以在主機(jī)上請(qǐng)求切換。如果本機(jī)為副機(jī),不允許切換;如果本機(jī)為主機(jī),它機(jī)為副機(jī),并且它機(jī)網(wǎng)絡(luò)或軟件異常,不允許切換。
(4)參數(shù):pDupStatus:指向DUPSTS類型的指針,用于存放當(dāng)前的雙工狀態(tài)。DUPSTS結(jié)構(gòu)中包括的參數(shù)內(nèi)容如下:
3.2.2? 使用PICT生成測(cè)試用例
(1)確定變量xi
xi應(yīng)包括測(cè)試的輸入和預(yù)期輸出。被測(cè)API的輸入為一個(gè)結(jié)構(gòu)體,結(jié)構(gòu)體中共包含7類數(shù)值;API的輸出為一個(gè)整數(shù)型數(shù)值。因此,測(cè)試用例的輸入變量xi共包括8類數(shù)值。
(2)確定每個(gè)變量xi的取值組合
為了更充分的發(fā)現(xiàn)缺陷,每個(gè)變量的取值要進(jìn)行充分設(shè)計(jì),尤其是“典型取值”,可以通過(guò)等價(jià)劃分、邊界值等方法進(jìn)行取值。根據(jù)本接口文件,7個(gè)輸入變量的有效取值均為離散的有限值,需要逐一列出;無(wú)效值采用等價(jià)類劃分法和邊界取值法,取–1。輸出值包括兩個(gè)固定值:0和–1。
4? 結(jié)束語(yǔ)
通過(guò)PICT工具生成測(cè)試用例集合,縮短了測(cè)試人員針對(duì)API的測(cè)試用例設(shè)計(jì)的時(shí)間,對(duì)實(shí)際工作具有指導(dǎo)意義。但PICT為追求測(cè)試效率而犧牲了部分覆蓋率的要求,可能會(huì)錯(cuò)過(guò)特定的取值組合,如上文中最終生成的用例未包含本機(jī)數(shù)據(jù)網(wǎng)狀態(tài)和關(guān)鍵軟件狀態(tài)均為故障時(shí)的切換成功場(chǎng)景測(cè)試。因此測(cè)試人員可根據(jù)實(shí)際情況,對(duì)測(cè)試集進(jìn)行優(yōu)化,如減少測(cè)試用例數(shù)量或補(bǔ)充個(gè)別測(cè)試用例,達(dá)到更佳測(cè)試覆蓋效果[11]。
參考文獻(xiàn)
[1]顏樂鳴. 基于工作流的軟件測(cè)試過(guò)程模型研究[J]. 軟件, 2018, 39(5): 160-165.
[2]張琪. 大數(shù)據(jù)背景下軟件測(cè)試的挑戰(zhàn)與展望[J]. 軟件, 2018, 39(6): 181-183.
[3]沈默, 劉強(qiáng), 童自力. API測(cè)試的二元組合測(cè)試算法研究與
實(shí)現(xiàn)[J]. 計(jì)算機(jī)工程與應(yīng)用, 2005, 26: 48-57.
[4]黃沛. 基于RESTful架構(gòu)的科技信息共享接口系統(tǒng)的設(shè)計(jì)[J]. 軟件, 2018, 39(7): 170-172.
[5]Patton, R著: 張小松, 王鈺, 曹躍等譯. 軟件測(cè)試(原書第2版)[M]. 北京: 機(jī)械工業(yè)出版社, 2006.
[6]葉常春, 尹良澤. 面向小規(guī)模程序的輕型測(cè)試方法[J]. 軟件, 2015, 36(10): 90-93.
[7]陳星, 趙佳萌, 宣軍法. 移動(dòng)應(yīng)用自動(dòng)化兼容性測(cè)試方法綜述[J]. 軟件, 2018, 39(7): 89-94.
[8]Trehan A. Algorithms for self-healing networks [D]. USA: The University of New Mexico, 2010.
[9]Kuhn DR, Reilly MJ. An investigation of the applicability of design of experiments to software testing. [R] In: Caulfield M, ed. Proc. of the Annual NASA/IEEE Software Enginee ring Workshop(SEW). Los Alamitos: IEEE Press, 2002. 91- 95.
[10]王子元, 徐寶文, 聶長(zhǎng)海. 組合測(cè)試用例生成技術(shù)[J], 計(jì)算機(jī)科學(xué)與探索, 2008, 2(6).
[11]陳皓, 王曙燕, 潘曉英. 成對(duì)組合測(cè)試數(shù)據(jù)的整體優(yōu)化和生成方法[J]. 計(jì)算機(jī)工程與應(yīng)用, 2012, 48(11): 32-36.