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