圖4 接口二輸出 輸出中的ResHeader也是SOAP包的header,是所有接口的公共輸出。getAccountInfoResponse和getChangedIdResponse是SOAP包的body,各自的字段是真正要準(zhǔn)備的預(yù)期結(jié)果數(shù)據(jù)。 3.分析 從上面給出的例子可以看出,基于SOAP層面的數(shù)據(jù)組織,需要準(zhǔn)備的數(shù)據(jù)就是本地類的輸入和輸出字段值,因而數(shù)據(jù)構(gòu)造無需考慮SOAP包的格式,比較直觀和簡單。但是不同接口的字段個(gè)數(shù)不同,字段名稱和類型也不同,所以數(shù)據(jù)的讀取比較麻煩,要針對(duì)不同的接口有不同的數(shù)據(jù)讀取程序。 測(cè)試程序 測(cè)試程序包含本地代理類和調(diào)用代理類的程序。本地類的生成通常借助于工具(比如java的Axis2)。調(diào)用本地代理類的程序?qū)τ诿總€(gè)接口都不同,因?yàn)槊總€(gè)接口需要調(diào)用不同的函數(shù),在接口比較多的情況下比較麻煩,并且接口有變動(dòng)都需要修改本地類和測(cè)試程序。 結(jié)果對(duì)比 這里的結(jié)果就是本地函數(shù)的返回值。在輸入和期望輸出都讀入內(nèi)存的情況下,結(jié)果對(duì)比很簡單,就是逐個(gè)字段比較期望輸出和實(shí)際輸出。 HTTP層面的Web Service自動(dòng)化測(cè)試 HTTP層面的Web Service測(cè)試步驟比較簡單:準(zhǔn)備數(shù)據(jù),使用HTTP發(fā)送請(qǐng)求數(shù)據(jù)包,使用HTTP方式接受響應(yīng),解析響應(yīng)并驗(yàn)證結(jié)果。 數(shù)據(jù)組織 HTTP層面的數(shù)據(jù)是完整的SOAP包(由于大多數(shù)SOAP協(xié)議基于XML,所以實(shí)際上是一個(gè)XML包)。 1.輸入數(shù)據(jù) 比如之前的兩個(gè)接口,對(duì)應(yīng)的輸入XML包分別是: 圖5 接口一輸入XML包 圖6 接口二輸入XML包 2.期望輸出 期望輸出同樣是兩個(gè)XML包,只是內(nèi)容不同,這里就不再舉例。 3.分析 通過上面的例子可以看出,HTTP層面的數(shù)據(jù)就是一個(gè)個(gè)XML包。對(duì)比SOAP層面的數(shù)據(jù)構(gòu)造,只知道幾個(gè)字段值并不能得到一個(gè)XML包,需要自己考慮這個(gè)XML包的格式。優(yōu)點(diǎn)就是數(shù)據(jù)的讀取很簡單,只需要將整個(gè)XML文件的內(nèi)容讀入內(nèi)存即可。并且很方便構(gòu)造錯(cuò)誤格式的輸入。 測(cè)試程序 基于HTTP層面的測(cè)試程序很簡單:以輸入的SOAP包為body構(gòu)造HTTP請(qǐng)求,發(fā)送給Web Service Server;接收響應(yīng),讀取響應(yīng)的HTTP包的body(就是一個(gè)SOAP包)。從這個(gè)過程可以看出,所有接口的測(cè)試程序都一樣。因而新增加接口或者原有接口發(fā)生變化都不會(huì)影響測(cè)試程序。 結(jié)果對(duì)比 在HTTP層面上,輸入和輸出都是一個(gè)XML包。因而結(jié)果對(duì)比可以將輸入和輸出XML包讀入到兩個(gè)字符串中,進(jìn)行字符串對(duì)比。 改進(jìn)思路 根據(jù)上文的分析,HTTP層面的Web Service測(cè)試的優(yōu)勢(shì)是數(shù)據(jù)格式靈活,易于讀取,測(cè)試程序擴(kuò)展性強(qiáng),可以適用于所有的接口。但是缺點(diǎn)也很明顯:數(shù)據(jù)構(gòu)造麻煩,還容易格式出錯(cuò);結(jié)果對(duì)比比較機(jī)械,無法選擇性的對(duì)比某些字段(有時(shí)候返回結(jié)果中包含有時(shí)間相關(guān)的量,這個(gè)量在每次測(cè)試的時(shí)候返回值都是不一樣的,因而在結(jié)果對(duì)比的時(shí)候需要忽略這些字段)。針對(duì)這兩個(gè)缺點(diǎn)我做了相應(yīng)的改進(jìn): 改進(jìn)數(shù)據(jù)構(gòu)造 數(shù)據(jù)構(gòu)造的難點(diǎn)在于無法從幾個(gè)字段構(gòu)造出符合格式的XML包。 首先我們分析輸入數(shù)據(jù)。再來看之前給出的兩個(gè)接口的輸入: 圖7 接口一輸入分析 圖8 接口二輸入分析 可以看出這兩個(gè)XML包有相同的部分,就是在圖中用紅色框起來的部分。這部分就是SOAP包的header。一個(gè)標(biāo)準(zhǔn)的SOAP包具有這樣的格式: 圖9 SOAP包格式分析 輸入Header部分通常包含用戶認(rèn)證的信息,不同接口的Header格式都相同;Body保存的是真正的數(shù)據(jù),各個(gè)接口不同。通常不同的接口使用的Header只有少量的幾個(gè)(通常只是用一個(gè)或者少量幾個(gè)用戶做測(cè)試),因此我們可以把Header部分的構(gòu)造提取出來。以dr-api為例,輸入的Header主要有username、password和token三個(gè)字段(還有一個(gè)target字段是選填的),那么我們只需要準(zhǔn)備幾組username/password/token即可。 輸入Body由于是接口相關(guān)的,沒有統(tǒng)一的方法構(gòu)造。但是我們可以結(jié)合SoapUI工具手動(dòng)構(gòu)造,這樣比直接寫XML包更方便。參考圖1,是SoapUI界面的“Form”標(biāo)簽內(nèi)容。在這個(gè)標(biāo)簽下輸入Body里需要填寫的字段值,然后選擇“XML”標(biāo)簽,SoapUI會(huì)顯示出對(duì)應(yīng)的發(fā)送XML包。從中拷貝出Body的內(nèi)容保存到XXX.input.xml里即可。 輸出Header通常包含接口無關(guān)的信息,比如處理時(shí)間,操作數(shù),錯(cuò)誤代碼等等(至少從百度推廣API和google adwords API來看都是如此)。那么我們也可以將輸出Header提取出來,在準(zhǔn)備數(shù)據(jù)的時(shí)候只需要給出幾個(gè)字段即可。由于不同接口的這幾個(gè)字段的名稱和類型都一樣,所以很方便程序讀取。 準(zhǔn)備輸出Body也可以借助于SoapUI。但是和輸入Body的準(zhǔn)備不同,后者只需要有wsdl文件即可構(gòu)造,輸出Body需要Web Service已經(jīng)提供,使用SoapUI發(fā)送一次請(qǐng)求得到返回,這樣才能得到輸出Body。因而實(shí)際中輸出Body的準(zhǔn)備通常直接用手動(dòng)的方式構(gòu)造,不使用SoapUI。 改進(jìn)結(jié)果對(duì)比 Web Service的測(cè)試中有相當(dāng)一部分是測(cè)試錯(cuò)誤代碼(以百度推廣API V2版本為例,現(xiàn)在一共有約300個(gè)錯(cuò)誤代碼)。這樣的測(cè)試不需要關(guān)注返回包的Body,只需要關(guān)注返回包Header中的錯(cuò)誤代碼,那么我們不需要專門構(gòu)造預(yù)期輸出的XML包,只需要提供一個(gè)錯(cuò)誤代碼即可。類似的,如果我們只關(guān)注返回包Header里的信息,那么就省去了構(gòu)造預(yù)期輸出XML包的過程,結(jié)果對(duì)比也很簡單。 如果測(cè)試關(guān)注于業(yè)務(wù)數(shù)據(jù),也就是返回包的Body部分,除了字符串對(duì)比之外暫時(shí)還沒有更好更通用的解決方法。 改進(jìn)總結(jié) 改進(jìn)的結(jié)果就是每個(gè)case的數(shù)據(jù)包含三個(gè)文件:input.xml、output.xml和一個(gè)配置文件properties。Input.xml包含了輸入包的Body,output.xml包含了輸出包的Body,配置文件則配置了輸入輸出的header,還有這個(gè)case對(duì)應(yīng)的url等信息。 整體思路 總體思路如下:讀取所有case的數(shù)據(jù),生成用例列表(包含用例數(shù)據(jù)和調(diào)用的接口);對(duì)每一個(gè)用例,使用http發(fā)送數(shù)據(jù)包,按照XML的解析方法解析返回SOAP包,進(jìn)行結(jié)果驗(yàn)證;使用ficus以用例列表為輸入進(jìn)行數(shù)據(jù)驅(qū)動(dòng)測(cè)試。如下圖所示: 圖10 測(cè)試整體思路 設(shè)計(jì)與實(shí)現(xiàn) 數(shù)據(jù)組織 數(shù)據(jù)組織的主要目的有兩點(diǎn):一是做到自描述,通過數(shù)據(jù)可以得到輸入和期望輸出,還有請(qǐng)求的url;二是減少冗余數(shù)據(jù),比如將soap的header信息提取出來。為了達(dá)到這兩個(gè)目的,我們使用了一個(gè)配置文件和一個(gè)數(shù)據(jù)文件夾。配置文件主要存放元數(shù)據(jù)和公用的數(shù)據(jù),數(shù)據(jù)文件夾存放真正的分散的數(shù)據(jù)。配置文件的內(nèi)容如下: 圖11 全局配置文件
|