馮亞玲 徐鶯
摘要:針對傳統(tǒng)API接口測試用例數(shù)據(jù)量大、用例和腳本管理繁瑣以及國產(chǎn)化環(huán)境下缺乏通用測試工具的問題,本文通過對API接口自動化測試技術特點和國產(chǎn)化應用技術特點的分析,設計了基于Excel用例模板的API接口通用自動化測試工具,采用Python語言開發(fā)代碼,將測試用例、測試數(shù)據(jù)和測試執(zhí)行的代碼分層開發(fā),實現(xiàn)了用例數(shù)據(jù)驅動API接口自動化測試在國產(chǎn)化環(huán)境下的應用。
關鍵詞:API接口;用例數(shù)據(jù)驅動;自動化測試;國產(chǎn)化環(huán)境;Python語言
中圖分類號:TP312 文獻標識碼:A 文章編號:1007-9416(2018)11-0097-05
0 引言
API接口測試是軟件測試中非常普遍而重要的測試類型,能夠覆蓋業(yè)務規(guī)則,體現(xiàn)系統(tǒng)行為[1],測試可信度高、效果好。API接口測試要求測試工程師了解軟件的設計及接口的定義,針對功能、性能和穩(wěn)定性等方面要求,編寫相應的測試代碼、構造各種測試用例進行測試。
每一個API接口都有其自身特點,組成的業(yè)務邏輯復雜,在測試過程中,需要針對每個API接口設計一套測試腳本,模擬各種正常、異常的測試參數(shù)[2],比對實際結果與期望結果的一致性,測試工作量大,腳本和用例的維護工作繁瑣,要求測試人員始終保持高度謹慎;同時,軟件API接口使用環(huán)境種類繁多,包括X86平臺,國產(chǎn)化平臺,Windows系統(tǒng),國產(chǎn)化操作系統(tǒng)等,要求API接口測試工具能滿足國產(chǎn)化需求,兼容各種主流平臺環(huán)境。如果能實現(xiàn)用例驅動API接口自動化測試在國產(chǎn)化環(huán)境下的應用,既可以減輕手工測試的強度,又可以滿足國產(chǎn)化環(huán)境測試需求,提高接口測試的自動化水平和軟件質量[3]。
1 Python與自動化和國產(chǎn)化
Python可定義為面向對象的腳本語言,開發(fā)和迭代的效率極高[4];它內置了眾多支持一系列應用級編程任務的標準庫,可通過自行開發(fā)的庫或眾多第三方的擴展庫進行擴展。Python腳本可通過靈活的集成機制輕松地與應用程序的其他部分進行通信,Python可以使用C和C++的庫,可以被C和C++的程序調用,可以與Java組件集成。Python所具有的質量和效率優(yōu)點,以其付出更少的精力完成更多的任務而成為自動化測試開發(fā)的首選語言。
Python的標準實現(xiàn)是由可移植的ANSIC編寫,除了語言解釋器本身以外,Python自帶的標準庫和模塊在實現(xiàn)上也盡可能地考慮了跨平臺的可移植性[5]。Python程序自動編譯成可移植的字節(jié)碼,這些字節(jié)碼在已安裝兼容版本Python的平臺上運行的結果都是相同的。這意味著Python程序的核心語言和標準庫可以在Linux、Windows和其他帶有Python解釋器的平臺上無差別運行,能很好的滿足兼容各種平臺環(huán)境的測試需求。
2 API自動化測試應用工具的特性分析
API自動化測試應用工具是為了實現(xiàn)適用于各種主流平臺的軟件接口自動化測試需求,它應該包括用例驅動性、API接口通用性、平臺兼容性等需求特性。
2.1 用例驅動性
用例驅動性指的是用例數(shù)據(jù)驅動API接口自動化測試。API接口除了實現(xiàn)其本身的功能之外,還與其他接口存在上下文關系,多變的接口關系組成各種業(yè)務測試邏輯。本質上測試執(zhí)行的每一步都只是一個接口,可以抽象出執(zhí)行邏輯[6],使測試的執(zhí)行邏輯與業(yè)務邏輯無關,達到測試執(zhí)行腳本與接口業(yè)務邏輯關系解耦合的目的。因此,測試人員根據(jù)用例模板進行測試用例數(shù)據(jù)設計,體現(xiàn)接口調用順序和參數(shù)關系,無需關心測試腳本的調用和執(zhí)行,由測試工具根據(jù)用例數(shù)據(jù)進行接口函數(shù)識別、接口參數(shù)識別和封裝,通用化透明化地進行測試業(yè)務流程執(zhí)行。
2.2 API接口通用性
API接口通用性指的是API自動化測試應用工具適用于所有API接口類型的DLL庫和.SO庫的接口測試,滿足功能、性能和穩(wěn)定性測試需求。軟件API接口雖然繁多,但接口的輸入輸出測試、接口的異常參數(shù)處理重復性較強[7],接口測試的結果易于形式化處理,測試用例間存在較大的共性,可對這些用例進行模板定制,形成模板化可通用的測試工具。
2.3 平臺兼容性
平臺兼容性指的是API自動化測試應用工具可以在Linux、Windows和其他帶有Python解釋器的平臺上無差別運行,且能方便地在測試環(huán)境中進行快捷部署。
3 API自動化測試應用工具的框架研究與設計
在實際系統(tǒng)中,針對API接口測試形成模板化可重用的測試架構,可以解決測試自動化問題,降低自動化測試腳本設計的復雜度,提高測試工具的通用性和可擴展性,真正帶來提高效率的價值。
3.1 框架設計
API自動化測試應用工具的主要目標是接收測試用例,轉換成測試數(shù)據(jù)進行測試執(zhí)行,最終輸出測試結果。
根據(jù)API自動化測試應用工具的特性分析,測試框架采用分層結構[8],由測試輸入層、測試數(shù)據(jù)層、測試執(zhí)行層、測試輸出層組成,每一層通過各功能模塊實現(xiàn)自己特定的任務,各層之間根據(jù)需要去進行調用。各功能模塊之間的交互關系及其對應于框架的分層關系如圖1所示。
3.2 測試輸入層
包含數(shù)據(jù)讀取模塊,用于接收測試用例文件、頭文件和測試參數(shù)等數(shù)據(jù)輸入。
3.3 測試數(shù)據(jù)層
包含數(shù)據(jù)識別模塊、數(shù)據(jù)處理模塊、參數(shù)封裝模塊、測試場景構建模塊,是整個測試程序的入口,它實現(xiàn)測試輸入數(shù)據(jù)解析,完成測試數(shù)據(jù)轉換和測試場景構建,調用測試執(zhí)行腳本,輸出日志記錄。
3.4 測試執(zhí)行層
包含功能測試模塊、性能測試模塊、穩(wěn)定性測試模塊,用于執(zhí)行測試數(shù)據(jù),對接口的調用進行封裝,根據(jù)測試場景完成測試執(zhí)行,并輸出測試結果。
3.5 測試輸出層
包含測試結果處理模塊、測試日志記錄模塊,用于收集測試結果和測試日志記錄,以文件的形式輸出給測試人員。
4 API自動化測試應用工具的實現(xiàn)與應用
在具體的測試代碼開發(fā)過程中,主要采用分層的思想編寫代碼,每一層完成的任務由其包含的功能模塊實現(xiàn),下面詳細介紹每層代碼的開發(fā)實現(xiàn)。
4.1 測試輸入層
測試輸入層主要完成數(shù)據(jù)讀取模塊的功能。用于讀取測試用例文件、頭文件和測試參數(shù)數(shù)據(jù)。
4.1.1 用例文件數(shù)據(jù)
測試人員根據(jù)Excel用例模板設計測試用例。用例模板如圖2所示。
在用例模塊中將調用接口的函數(shù)名、參數(shù)類型、參數(shù)值、參數(shù)輸入輸出關系和調用順序按定義進行描述:
(1)函數(shù)說明列表。用例集中需要調用的接口函數(shù)列表;(2)測試用例。測試人員針對被測接口函數(shù)對象設計的用例,包括函數(shù)調用順序、參數(shù)值、參數(shù)輸入輸出關系等;(3)標志區(qū)域。區(qū)分被測接口和關聯(lián)接口,明確測試用例標號;(4)函數(shù)名。接口的函數(shù)名;(5)函數(shù)參數(shù)說明。接口函數(shù)的參數(shù)個數(shù)和參數(shù)類型,以及在該用例集中不變化的參數(shù)值。
4.1.2 頭文件和測試參數(shù)數(shù)據(jù)
頭文件數(shù)據(jù)包括接口庫包含的基本數(shù)據(jù)類型和結構體嵌套數(shù)據(jù)類型等參數(shù)信息。
測試參數(shù)是構建測試場景需要的配置信息,包括用例文件路徑、被測接口庫路徑等相對固定的參數(shù),還包括測試分支選擇、并發(fā)用戶數(shù)、多進程/多線程啟動、測試運行時間、測試退出條件等參數(shù)信息,其中,變化的參數(shù)可通過配置文件或命令行參數(shù)的方式輸入。例如:
casename=c:\\example.xls#用例表路徑
testcase=0#功能測試0,性能測試1,穩(wěn)定性測試2
methodflag=0#線程(0)/進程(1)執(zhí)行
usernum=20#并發(fā)用戶數(shù)
4.2 測試數(shù)據(jù)層
測試數(shù)據(jù)層主要完成數(shù)據(jù)識別模塊、數(shù)據(jù)處理模塊、參數(shù)封裝模塊和測試場景構建模塊的功能。將讀取的用例文件數(shù)據(jù)和配置參數(shù)數(shù)據(jù)進行識別,處理為相應的測試數(shù)據(jù)。
4.2.1 數(shù)據(jù)識別模塊和數(shù)據(jù)處理模塊
數(shù)據(jù)識別模塊的功能是將讀取的數(shù)據(jù)按照事先制定的規(guī)則識別為有特定意義的用例數(shù)據(jù),將輸入數(shù)據(jù)和信息字段建立對應關系。數(shù)據(jù)處理模塊將識別出來的用例數(shù)據(jù)處理為可執(zhí)行的測試數(shù)據(jù)。
(1)識別用例文件中接口函數(shù)描述說明,建立接口函數(shù)與參數(shù)個數(shù)、參數(shù)類型、參數(shù)值之間的關聯(lián)關系;如表1所示。
ConnectDev函數(shù)是pre準備階段執(zhí)行的函數(shù),有三個參數(shù),參數(shù)類型依次是UINT32、pHDEV、UINT8,參數(shù)值在該測試集中不變化,分別是0、out1、0;其中,out1表示該參數(shù)是輸出參數(shù),輸出值需保存供其它函數(shù)調用。OpenApp函數(shù)類似。
GenerateKey函數(shù)是act被測階段函數(shù),有三個參數(shù),參數(shù)類型依次是pHPIPE、WORKKEYATTR、pHANDLE,參數(shù)值在該測試集中變化,變化在測試用例中體現(xiàn);
(2)識別接口函數(shù)執(zhí)行次數(shù)、預期結果,不同接口函數(shù)之間的參數(shù)輸入輸出關系、調用順序等。如表2所示。
測試用例1,GenerateKey函數(shù)執(zhí)行完后執(zhí)行DestroyKey函數(shù),GenerateKey函數(shù)的參數(shù)值依次為ref_out2、(2,1,0,16)、out3,執(zhí)行次數(shù)為1次,預期結果默認為0;DestroyKey函數(shù)的參數(shù)值依次為ref_out2、ref_out3,執(zhí)行次數(shù)為1次,預期結果默認為0。GenerateKey函數(shù)的ref_out2參數(shù)表示該參數(shù)的輸入值需調用out2參數(shù)的輸出值,out3輸出值供DestroyKey函數(shù)的ref_out3參數(shù)調用。
(3)識別基本數(shù)據(jù)類型和結構體嵌套數(shù)據(jù)類型等,使接口函數(shù)的參數(shù)類型和參數(shù)值建立關聯(lián)關系。如:
GenerateKey函數(shù)三個參數(shù)類型依次是pHPIPE、WORKKEYATTR、pHANDLE,對應的數(shù)據(jù)類型為指針c_void_p、結構體class WORKKEYATTR、指針c_void_p,對應的參數(shù)值是ref_out2、(2,1,0,16)、out3。在處理過程中,參數(shù)1按指針類型引用out2的輸出值,參數(shù)2按結構體WORKKEYATTR的各字段類型對(2,1,0,16)的每個值進行賦值,參數(shù)3按指針類型將輸出值保存在out3中。
(4)識別測試參數(shù)信息,明確測試場景構建數(shù)據(jù)。將讀入的配置參數(shù)數(shù)據(jù)與測試分支選擇testcase、并發(fā)用戶數(shù)usernum、多進程/多線程啟動methodflag、測試運行時間runtime、測試退出條件exitflag等測試場景構建信息字段建立對應關系。
API自動化測試應用工具提供了通用化的用例數(shù)據(jù)識別和處理模型,對接口函數(shù)的每個參數(shù)都根據(jù)參數(shù)類型和參數(shù)值進行賦值,對接口函數(shù)之間的調用順序和參數(shù)引用建立邏輯關系。
4.2.2 參數(shù)封裝模塊
將經(jīng)處理后的測試數(shù)據(jù)封裝為接口函數(shù)調用可執(zhí)行的參數(shù)。
傳統(tǒng)的API接口測試工具中,每一個API接口對應一套測試腳本,原因在于接口之間存在調用關系、參數(shù)之間存在引用關系,接口函數(shù)的形參和實參需一一對應,不同的接口含有不同個數(shù)和類型的形參,這就導致了針對每個接口函數(shù)都需要測試腳本去做形參和實參的匹配,不同接口之間測試腳本不能復用。
本文實現(xiàn)的API自動化測試應用工具提供了可復用的參數(shù)封裝模塊,經(jīng)過用例數(shù)據(jù)識別和處理后,接口函數(shù)的每個形參都處理為對應的實參,對接口函數(shù)實參的封裝采用Python提供的*args可變位置參數(shù)實現(xiàn)。即多個實參按照位置傳值,放到一個元組里面,以*開頭,可以傳遞多個參數(shù)。如:
libc=windll.LoadLibrary(dllpath)#加載被測dll庫
def dealparam:#處理函數(shù)參數(shù)并封裝
#識別函數(shù)funcname
#識別函數(shù)參數(shù)個數(shù)和參數(shù)類型
for i in range(paramlen):#根據(jù)參數(shù)類型和參數(shù)值賦值
param[i] = value[i]
execparam.append(param[i]) #封裝參數(shù)
ret=getattr(libc,funcname)(*execparam)#接口封裝調用
通用化的接口參數(shù)封裝模塊使不同的接口函數(shù)可以使用同一模板實現(xiàn)參數(shù)封裝,不再需要定制化的測試腳本。
4.2.3 測試場景構建模塊
測試場景構建模塊根據(jù)測試參數(shù)構建測試場景。選擇功能、性能或穩(wěn)定性測試分支,采用多進程/多線程的方式啟動并發(fā)測試,線程/進程數(shù)由并發(fā)用戶數(shù)決定,到達運行時間后或者測試人員選擇退出測試。
testcase=1#功能測試0,性能測試1,穩(wěn)定性測試2
import MyProcess,MyThread#導入多進程/多線程庫
methodflag=0#選擇執(zhí)行方式,多進程方式=0,多線程方式=1
for i in range(usernum):#根據(jù)并發(fā)用戶數(shù)啟動線程/進程數(shù)
#將運行時間和測試退出方式通過參數(shù)傳遞給執(zhí)行函數(shù)
p = MyProcess(test1,(execlist,exit_flag,run_time,row,timeflag,j,tmpparam,))
processes.append(p)
4.3 測試執(zhí)行層
測試執(zhí)行層主要完成功能測試模塊、性能測試模塊和穩(wěn)定性測試模塊的功能。功能、性能和穩(wěn)定性測試的用例文件可復用,根據(jù)不同的測試場景進行不同測試分支的執(zhí)行。
4.3.1 功能測試模塊
功能測試模塊通過調用接口庫驗證函數(shù)的功能是否與描述一致,測試執(zhí)行的實際返回值與期望返回值是否一致,并返回測試結果。測試用例如表3所示。
該用例集的測試對象為對稱加密函數(shù)Encrypt,不僅需要驗證加密函數(shù)Encrypt的執(zhí)行結果,也需要驗證加密結果的正確性。用例1設計的測試內容為產(chǎn)生密鑰GenerateKey->加密Encrypt->解密Decrypt->銷毀密鑰DestroyKey->驗證加解密正確性,即GenerateKey輸出結果為密鑰句柄out3,Encrypt利用密鑰out3對96字節(jié)的數(shù)據(jù)(96,1)進行加密,輸出密文out4,Decrypt利用密鑰out3對密文out4進行解密,輸出明文out5,加解密完成后銷毀密鑰out3,為了驗證加解密過程的正確性,將解密輸出的明文out5與原始數(shù)據(jù)(96,1)進行比較。
libc=windll.LoadLibrary(dllpath)#加載被測dll庫
#識別函數(shù)列表funclist
for i in range(funclist):
dealparam(func[i])#處理列表中每個函數(shù)的參數(shù)并封裝
ret=getattr(libc,func[i])(*execparam)#接口封裝調用
if ret != respectexec:
break#如果函數(shù)執(zhí)行結果不符合預期,退出測試
#函數(shù)執(zhí)行結果符合預期,進行輸出結果有效性檢查
#如:判斷ref_out5 是否等于96字節(jié)的原始數(shù)據(jù)(96,1)
#返回測試結果
4.3.2 性能測試模塊
性能測試模塊驗證接口在各測試場景下的性能指標以及性能指標是否與要求一致。測試用例如表4所示。
該用例集的測試對象為對稱加密函數(shù)Encrypt在不同測試場景下的性能指標,性能測試過程中Encrypt是被測接口對象,GenerateKey、Decrypt、DestroyKey是關聯(lián)接口,測試執(zhí)行時關聯(lián)接口執(zhí)行一次,輸出和Encrypt有引用關系的參數(shù)值,重點關心被測接口在測試場景下的成功執(zhí)行次數(shù)(執(zhí)行失敗時整個測試指標無參考意義)。如:
測試配置參數(shù)為testcase=1、usernum=20、methodflag=1、runtime=5、exitflag=0,即Encrypt函數(shù)在多進程啟動條件下,20個并發(fā)用戶數(shù)運行5min的性能指標,達到運行時間后退出測試。測試配置參數(shù)支持自定義。
libc=windll.LoadLibrary(dllpath)#加載被測dll庫
for i in range(funclist):
dealparam(func[i])#處理列表中每個函數(shù)的參數(shù)并封裝
#構建性能測試場景
#執(zhí)行關聯(lián)接口,保存輸出參數(shù)
if time<runtime:#執(zhí)行被測接口
ret=getattr(libc,tarfunc)(*execparam)#被測接口封裝調用
if ret != respectexec:
writelog(‘loginfo.txt,loginfo)#記錄錯誤日志
break#如果函數(shù)執(zhí)行結果不符合預期,記錄日志后退出測試
totalnum+=1#統(tǒng)計執(zhí)行成功次數(shù)
#返回性能測試結果
4.3.3 穩(wěn)定性測試模塊
穩(wěn)定性測試模塊驗證在各測試場景下接口本身的穩(wěn)定性以及在業(yè)務邏輯下接口組合關系的穩(wěn)定性。測試用例如表5所示。
(1)接口本身的穩(wěn)定性。當該用例集的測式對象為對稱加密函數(shù)Encrypt在不同測試場景下的穩(wěn)定性時,代碼實現(xiàn)與性能測試模塊相似,關心Encrypt接口在測試場景下的穩(wěn)定性,與性能測試的區(qū)別在于穩(wěn)定性測試執(zhí)行過程中記錄執(zhí)行失敗的錯誤信息,不強制退出測試。(2)業(yè)務邏輯的穩(wěn)定性。當該用例集的測式對象為加解密業(yè)務在不同測試場景下的穩(wěn)定性時,代碼流程相似,在測試運行時間內反復執(zhí)行整個加解密業(yè)務流程,不再只針對某一個測試接口對象。
4.4 測試輸出層
測試輸出層主要完成測試結果處理模塊和測試日志記錄模塊的功能。
4.4.1 測試結果處理模塊
測試結果處理模塊負責測試結果的收集、處理和展示。
(1)功能測試結果。功能測試結果包括接口執(zhí)行結果、接口功能有效性結果以及綜合前兩項指標所得的用例通過結果,三項結果回寫至Excel用例文件。如表6所示。(2)性能測試結果。性能測試結果返回被測接口對象在測試場景下的執(zhí)行總次數(shù),結果回寫至Excel用例文件。如表7所示。(3)穩(wěn)定性測試結果。穩(wěn)定性測試結果包括被測接口對象或業(yè)務對象在測試場景下的執(zhí)行總次數(shù)、失敗次數(shù),測試結果以txt文件展示。如表8所示。
tarfunc2(業(yè)務1)的總次數(shù)為447796,錯誤次數(shù)為0,執(zhí)行時間3600min
業(yè)務2的總次數(shù)為125202,錯誤次數(shù)為0,執(zhí)行時間3600min
業(yè)務3的總次數(shù)為572596,錯誤次數(shù)為0,執(zhí)行時間3600min
(其中,一行用例代表一個業(yè)務邏輯。)
4.4.2 測試日志記錄模塊
測試日志記錄模塊負責測試日志記錄和工具運行日志記錄。記錄內容包括用例執(zhí)行詳細信息、測試執(zhí)行失敗的錯誤信息等。
用例執(zhí)行詳細信息包括執(zhí)行的用例文件信息、測試集(用例表)信息、測試函數(shù)信息(用例行)等;錯誤信息包括出錯函數(shù)名信息、錯誤碼信息、執(zhí)行失敗時間信息等。
5 結語
本文研究了API接口自動化測試方法,分析了用例數(shù)據(jù)通用化解析、用例驅動自動化測試和國產(chǎn)化環(huán)境應用等技術,提出了一種API接口自動化測試框架,解決了用例數(shù)據(jù)轉換、接口參數(shù)封裝和接口映射調用的難題,最后采用Python語言實現(xiàn)了用例驅動API接口自動化測試在國產(chǎn)化環(huán)境下的應用工具。該工具在實際項目中進行了應用,可滿足X86平臺和飛騰、龍芯、兆芯等國產(chǎn)化平臺下的API接口功能測試、性能測試和穩(wěn)定性測試需求,在測試效率的提高和測試成本的降低方面取得了良好的效果[9]。
參考文獻
[1]林萍.數(shù)據(jù)分層的接口自動化測試框架設計與應用[J].信息技術,2016(5):37-40.
[2]吳振宇,顧曉明,李翔.協(xié)議可擴展的軟件接口測試工具的研究與實現(xiàn)[J].數(shù)字技術與應用,2017(12):58-60.
[3]蘇春梅,何劍偉,奚宏明,et al. 基于XML的通用數(shù)據(jù)接口測試工具[J].兵工自動化,2012,31(8):72-77.
[4]Wesley Chun.Python核心編程[M].人民郵電出版社,2016.
[5]楊清玉,李金麗,陳吉蘭,et al.HTTP接口自動化測試方法研究[J].微型機與應用,2016,35(18):22-25.
[6]余永忠,張哲軍,陳華軍.IEC61970與IEC61968標準接口自動化測試系統(tǒng)研發(fā)[J].南方電網(wǎng)技術,2013,7(5):61-64.
[7]范典華,潘芳蕊.自動化測試在業(yè)務支撐系統(tǒng)接口測試中的應用設計[J].電信工程技術與標準化,2012,25(4):63-67.
[8]郝曉曉,張衛(wèi)豐.基于XML的SDK自動化測試框架的設計與實現(xiàn)[J].計算機技術與發(fā)展, 2010,20(4):101-104.
[9]蔡春梅.基于pyUnit的OTS REST接口自動化測試設計與實現(xiàn)[J].信息技術與標準化,2017(4).
Application of Case-Driven Automated Testing in Localized Environment
FENG Ya-ling, XU Ying
(No.30 Institute of CETC, Chengdu Sichuan? 610041)
Abstract:Traditional API interface testing has the following disadvantages: a large number of test cases, management of test cases and scripts is cumbersome, and lack of common test tools in the localized environment. In view of the above shortcomings, this paper analyzes the characteristics of the API interface automation test technology and the characteristics of the localized application technology. The paper designed an API automation universal test tool based on Excel test case template,? layered the development of test cases, test data, and test execution and code by using Python language. This paper realized the technology that the test case data driven API interface automatic test, successfully applied to the domestic environment.
Key words:API; case data-driven; automated testing; localized environment; Python