本發(fā)明涉及自動(dòng)化測試領(lǐng)域,尤其涉及一種用于接口自動(dòng)化測試的自動(dòng)關(guān)聯(lián)方法。
背景技術(shù):
隨著云計(jì)算、大數(shù)據(jù)的發(fā)展,很多廠商對外提供的都是基于服務(wù)的形式存在,需要通過接口測試保證服務(wù)的有效性、可靠性等,因此接口自動(dòng)化測試應(yīng)運(yùn)而生。在現(xiàn)有的接口自動(dòng)化測試方案中,大多數(shù)都是給的一套系統(tǒng)的方法,沒有針對如何實(shí)現(xiàn)接口自動(dòng)關(guān)聯(lián)給出一個(gè)解決方案,導(dǎo)致在開展接口自動(dòng)化測試中帶來困難。
在接口自動(dòng)化測試的實(shí)施中,不再是簡單的單接口測試,存在接口間需要關(guān)聯(lián),如:
1)、一個(gè)接口的輸入需要另外一個(gè)接口的返回報(bào)文的某個(gè)字段或某部分作為參數(shù),而且返回的參數(shù)是動(dòng)態(tài)變化的。
2)、隨著對軟件安全性的加強(qiáng),很多服務(wù)都是基于token認(rèn)證機(jī)制,需要先訪問獲取對應(yīng)的token后,拿著響應(yīng)的token和請求參數(shù)才能訪問對應(yīng)的api。
針對以上場景,目前大多數(shù)采取的是通過碼代碼的方式實(shí)現(xiàn),這無疑給接口測試人員增加了難度,而且花費(fèi)大量的編寫代碼、調(diào)試代碼的時(shí)間。
技術(shù)實(shí)現(xiàn)要素:
針對現(xiàn)有技術(shù)存在的不足之處,本發(fā)明的目的在于提供一種用于接口自動(dòng)化測試的自動(dòng)關(guān)聯(lián)方法,基于數(shù)據(jù)驅(qū)動(dòng)并采用數(shù)據(jù)與業(yè)務(wù)分離的模式,根據(jù)接口測試數(shù)據(jù)自動(dòng)生成關(guān)聯(lián)文件,實(shí)現(xiàn)接口的自動(dòng)關(guān)聯(lián);接口測試人員只需要準(zhǔn)備好測試數(shù)據(jù),不需要任何編碼就可實(shí)現(xiàn),極大地降低了接口測試的難度。
本發(fā)明的目的通過下述技術(shù)方案實(shí)現(xiàn):
一種用于接口自動(dòng)化測試的自動(dòng)關(guān)聯(lián)方法,包括數(shù)據(jù)模塊、關(guān)聯(lián)模塊和請求模塊,所述數(shù)據(jù)模塊用于提供每個(gè)接口的接口測試數(shù)據(jù),所述關(guān)聯(lián)模塊用于解析數(shù)據(jù)模塊傳輸過來的接口測試數(shù)據(jù)生成關(guān)聯(lián)文件、關(guān)聯(lián)判斷及關(guān)聯(lián)處理,所述請求模塊用于負(fù)責(zé)處理接口請求及響應(yīng),其自動(dòng)關(guān)聯(lián)方法如下:
a、所述數(shù)據(jù)模塊中準(zhǔn)備好每個(gè)接口的接口測試數(shù)據(jù),所述數(shù)據(jù)模塊中的每個(gè)接口包含一條接口測試數(shù)據(jù),所述接口測試數(shù)據(jù)的具體內(nèi)容包括請求數(shù)據(jù)以及關(guān)聯(lián)數(shù)據(jù),所述請求數(shù)據(jù)包括地址、參數(shù)、響應(yīng)報(bào)文、報(bào)文體;
如果該接口的請求數(shù)據(jù)需要關(guān)聯(lián)其他接口,則將該接口的請求數(shù)據(jù)的部分?jǐn)?shù)據(jù)的值設(shè)置為變量名;
如果該接口的響應(yīng)報(bào)文中的數(shù)據(jù)為其他接口提供參數(shù),則在該接口的關(guān)聯(lián)數(shù)據(jù)中設(shè)置為變量名及獲取方式;
b、所述關(guān)聯(lián)模塊解析數(shù)據(jù)模塊傳輸過來的接口測試數(shù)據(jù)生成關(guān)聯(lián)文件,關(guān)聯(lián)文件中記錄了所有需要關(guān)聯(lián)的接口;所有接口分成兩類接口,第一類接口需要關(guān)聯(lián)的每個(gè)接口關(guān)聯(lián)的變量名;第二類接口的關(guān)聯(lián)變量來自哪個(gè)接口以及該關(guān)聯(lián)變量的值從響應(yīng)中的獲取方式;
c、所述請求模塊根據(jù)當(dāng)前執(zhí)行的接口a,所述關(guān)聯(lián)模塊解析關(guān)聯(lián)文件,判斷關(guān)聯(lián)文件中是否存在該接口;
d、若關(guān)聯(lián)文件中存在該接口,則表明該接口需要關(guān)聯(lián);
e、在關(guān)聯(lián)文件中判斷該接口關(guān)聯(lián)了哪些變量;
f、在關(guān)聯(lián)文件中判斷變量來自哪個(gè)關(guān)聯(lián)接口,并獲取該變量的值的獲取方式;
g、請求模塊執(zhí)行關(guān)聯(lián)接口請求,并根據(jù)該關(guān)聯(lián)變量值的獲取方式處理響應(yīng)為該變量賦值;
h、根據(jù)關(guān)聯(lián)變量的值替換掉接口a請求數(shù)據(jù)中對應(yīng)變量的值;
i、判斷變量是否關(guān)聯(lián)完畢,若關(guān)聯(lián)完畢則執(zhí)行步驟j,否則,重復(fù)步驟f至h;
j、所述請求模塊執(zhí)行接口a請求;然后所述請求模塊處理響應(yīng)。
本發(fā)明較現(xiàn)有技術(shù)相比,具有以下優(yōu)點(diǎn)及有益效果:
本發(fā)明采用數(shù)據(jù)與業(yè)務(wù)相分離的模式,接口測試人員只需要準(zhǔn)備好接口測試數(shù)據(jù),就可以實(shí)現(xiàn)接口的自動(dòng)關(guān)聯(lián)。并且,本發(fā)明的測試數(shù)據(jù)易維護(hù),對代碼能力要求低,極大地降低了接口自動(dòng)化測試的難度,提高了工作效率。
附圖說明
圖1為本發(fā)明的流程結(jié)構(gòu)示意框圖。
具體實(shí)施方式
下面結(jié)合實(shí)施例對本發(fā)明作進(jìn)一步地詳細(xì)說明:
實(shí)施例一
如圖1所示,一種用于接口自動(dòng)化測試的自動(dòng)關(guān)聯(lián)方法,包括數(shù)據(jù)模塊、關(guān)聯(lián)模塊和請求模塊,所述數(shù)據(jù)模塊用于提供每個(gè)接口的接口測試數(shù)據(jù),所述關(guān)聯(lián)模塊用于解析數(shù)據(jù)模塊傳輸過來的接口測試數(shù)據(jù)生成關(guān)聯(lián)文件、關(guān)聯(lián)判斷及關(guān)聯(lián)處理,所述請求模塊用于負(fù)責(zé)處理接口請求及響應(yīng),其自動(dòng)關(guān)聯(lián)方法如下:
a、所述數(shù)據(jù)模塊中準(zhǔn)備好每個(gè)接口的接口測試數(shù)據(jù),所述數(shù)據(jù)模塊中的每個(gè)接口包含一條接口測試數(shù)據(jù),所述接口測試數(shù)據(jù)的具體內(nèi)容包括請求數(shù)據(jù)以及關(guān)聯(lián)數(shù)據(jù),所述請求數(shù)據(jù)包括地址、參數(shù)、響應(yīng)報(bào)文、報(bào)文體;
如果該接口的請求數(shù)據(jù)需要關(guān)聯(lián)其他接口,則將該接口的請求數(shù)據(jù)的部分?jǐn)?shù)據(jù)的值設(shè)置為變量名;
如果該接口的響應(yīng)報(bào)文中的數(shù)據(jù)為其他接口提供參數(shù),則在該接口的關(guān)聯(lián)數(shù)據(jù)中設(shè)置為變量名及獲取方式;所述獲取方式根據(jù)如何從響應(yīng)中獲取數(shù)據(jù)而定,可以為通過正則表達(dá)獲取、左右邊界獲取、jsonpath獲取等;此處以從響應(yīng)的json報(bào)文獲取某節(jié)點(diǎn)的值為例,則獲取方式傳入對應(yīng)節(jié)點(diǎn)的jsonpath即可,如”$.data.openid”;
b、所述關(guān)聯(lián)模塊解析數(shù)據(jù)模塊傳輸過來的接口測試數(shù)據(jù)生成關(guān)聯(lián)文件,關(guān)聯(lián)文件中記錄了所有需要關(guān)聯(lián)的接口;所有接口分成兩類接口,第一類接口需要關(guān)聯(lián)的每個(gè)接口關(guān)聯(lián)的變量名;第二類接口的關(guān)聯(lián)變量來自哪個(gè)接口以及該關(guān)聯(lián)變量的值從響應(yīng)中的獲取方式;
c、所述請求模塊根據(jù)當(dāng)前執(zhí)行的接口a,所述關(guān)聯(lián)模塊解析關(guān)聯(lián)文件,判斷關(guān)聯(lián)文件中是否存在該接口;
d、若關(guān)聯(lián)文件中存在該接口,則表明該接口需要關(guān)聯(lián);
e、在關(guān)聯(lián)文件中判斷該接口關(guān)聯(lián)了哪些變量;
f、在關(guān)聯(lián)文件中判斷變量來自哪個(gè)關(guān)聯(lián)接口,并獲取該變量的值的獲取方式;
g、請求模塊執(zhí)行關(guān)聯(lián)接口請求,并根據(jù)該關(guān)聯(lián)變量值的獲取方式處理響應(yīng)為該變量賦值;
h、根據(jù)關(guān)聯(lián)變量的值替換掉接口a請求數(shù)據(jù)中對應(yīng)變量的值;
i、判斷變量是否關(guān)聯(lián)完畢,若關(guān)聯(lián)完畢則執(zhí)行步驟j,否則,重復(fù)步驟f至h;
j、所述請求模塊執(zhí)行接口a請求;然后所述請求模塊處理響應(yīng)。
實(shí)施例二
如圖1所示,一種用于接口自動(dòng)化測試的自動(dòng)關(guān)聯(lián)方法,包括數(shù)據(jù)模塊、關(guān)聯(lián)模塊和請求模塊,所述數(shù)據(jù)模塊用于提供每個(gè)接口的接口測試數(shù)據(jù),所述關(guān)聯(lián)模塊用于解析數(shù)據(jù)模塊傳輸過來的接口測試數(shù)據(jù)生成關(guān)聯(lián)文件、關(guān)聯(lián)判斷及關(guān)聯(lián)處理,所述請求模塊用于負(fù)責(zé)處理接口請求及響應(yīng),其自動(dòng)關(guān)聯(lián)方法如下:
步驟1、所述數(shù)據(jù)模塊中準(zhǔn)備好接口測試數(shù)據(jù),接口數(shù)據(jù)可以為一個(gè)json格式的數(shù)據(jù),如下:
1.1、每條接口信息均包含了請求數(shù)據(jù)(headers、url、method、body)、接口名(name)以及斷言信息(tests),其中如果該接口的請求數(shù)據(jù)有需要關(guān)聯(lián)其他接口,則在請求數(shù)據(jù)中將需要關(guān)聯(lián)的數(shù)據(jù)的值設(shè)置"{{變量名}}",若該接口的響應(yīng)報(bào)文為其他接口提供關(guān)聯(lián)數(shù)據(jù),則在關(guān)聯(lián)數(shù)據(jù)中設(shè)置為"setvariable("變量名",獲取方式)";
1.2、如果json文件中包含了兩個(gè)接口的數(shù)據(jù),一個(gè)為"用戶登錄"接口,另一個(gè)為"獲取用戶所有信息"接口,"獲取用戶所有信息"接口關(guān)聯(lián)于"用戶登錄”接口,在執(zhí)行"獲取用戶所有信息"接口前需要先執(zhí)行"用戶登錄"接口獲取token后,帶上token才能訪問"獲取用戶所有信息"接口;
1.3、如"獲取用戶所有信息"接口body中的token需要關(guān)聯(lián)"用戶登錄"接口,則在body中設(shè)置token為"token\":\"{{token}}";token是"用戶登錄"接口響應(yīng)報(bào)文中通過jsonpath獲取的,則在"用戶登錄"接口的斷言信息中設(shè)置為setvariable(\"token\",jsondata.data.token);
步驟2、所述關(guān)聯(lián)模塊解析接口測試數(shù)據(jù)生成關(guān)聯(lián)文件,關(guān)聯(lián)文件中記錄了所有需要關(guān)聯(lián)的接口,所有接口包括兩部分:其中一部分為需要關(guān)聯(lián)的每個(gè)接口關(guān)聯(lián)的變量名;另一部分為關(guān)聯(lián)變量來自哪個(gè)接口以及該關(guān)聯(lián)變量的值從響應(yīng)中的獲取方式;生成的json格式的關(guān)聯(lián)文件如下:
2.1、生成的關(guān)聯(lián)文件,節(jié)點(diǎn)pre_val表示哪些接口需要關(guān)聯(lián)以及該接口關(guān)聯(lián)的變量名,并以jsonobject的形式存在;節(jié)點(diǎn)environment_val表示關(guān)聯(lián)的變量來自于哪個(gè)接口以及變量的值的獲取獲取方式;
2.2、若"獲取用戶所有信息"接口需要關(guān)聯(lián)的變量為token,token來自于"用戶登錄"接口且token是通過jsonpath從響應(yīng)報(bào)文中獲取的;
步驟3、所述請求模塊根據(jù)當(dāng)前執(zhí)行的接口a,解析關(guān)聯(lián)文件,判斷關(guān)聯(lián)文件中是否存在該接口;
3.1、如執(zhí)行"獲取用戶所有信息"接口,通過jsonpath"$.pre_val.獲取用戶所有信息"判斷關(guān)聯(lián)文件是否存在該接口;
步驟4、若關(guān)聯(lián)文件中存在該接口,則表明該接口需要關(guān)聯(lián);
步驟5、在關(guān)聯(lián)文件中判斷該接口關(guān)聯(lián)了哪些變量;
5.1、如通過jsonpath"$.pre_val.獲取用戶所有信息"獲取接口所有需要關(guān)聯(lián)的變量,獲取的需要關(guān)聯(lián)的變量為token;
步驟6、在關(guān)聯(lián)文件中判斷變量來自哪個(gè)關(guān)聯(lián)接口,并獲取該變量的值的獲取方式;
6.1、如通過jsonpath"$.environment_val.token.test_case_name"判斷token來自于"用戶登錄"接口,通過jsonpath"$.environment_val.token.val_value"判斷token是通過jsonpath"$.data.token"從json響應(yīng)報(bào)文獲取的。
步驟7、請求模塊執(zhí)行關(guān)聯(lián)接口請求,并根據(jù)該關(guān)聯(lián)變量值的獲取方式處理響應(yīng)為該變量賦值;
7.1、如執(zhí)行"用戶登陸"接口,并通過jsonpath"$.data.token"從響應(yīng)報(bào)文中內(nèi)容,并將值賦給token;
步驟8、根據(jù)關(guān)聯(lián)變量的值替換掉接口a請求數(shù)據(jù)中對應(yīng)變量的值;
8.1、判斷"{{token}}"位于"獲取用戶所有信息"接口的body中,并將body中"{{token}"替換為步驟7中token的值;
步驟9、判斷變量是否關(guān)聯(lián)完,若關(guān)聯(lián)完則執(zhí)行步驟十,否則重復(fù)步驟六至八;
步驟10、請求模塊執(zhí)行接口a請求;
10.1、執(zhí)行"獲取用戶所有信息"接口;
步驟11、請求模塊處理響應(yīng);
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。