有這么一種情況,后臺(tái)管理系統(tǒng)帶有一個(gè)開關(guān)狮暑,可以控制APP某項(xiàng)功能的展示鸡挠。這種情況下,我們想要實(shí)現(xiàn)自動(dòng)化搬男,就要先請(qǐng)求后臺(tái)接口更改狀態(tài)拣展,再請(qǐng)求APP的接口進(jìn)行測(cè)試和驗(yàn)證。同時(shí)為了保證開關(guān)兩種狀態(tài)的切換缔逛,我們還需要從數(shù)據(jù)庫(kù)中獲取開關(guān)的狀態(tài)备埃,以此為根據(jù)更改后臺(tái)管理系統(tǒng)的開關(guān)狀態(tài)。那么這種情況下我們?nèi)绾螌?shí)現(xiàn)自動(dòng)化呢褐奴?接下來(lái)一起研究一下詳細(xì)的實(shí)現(xiàn)步驟吧按脚!
第一部分:確認(rèn)環(huán)境和接口信息
(1)mysql 下 server_control表(用于儲(chǔ)存開關(guān)狀態(tài)的表)數(shù)據(jù)如下:keyId代表開關(guān)的名稱;status代表開關(guān)當(dāng)前的狀態(tài)敦冬,1位為開啟辅搬,0為關(guān)閉。
(2)后臺(tái)管理系統(tǒng)中開關(guān)控制位置修改開關(guān)狀態(tài)的接口信息:
接口地址:api/server_control/save (post請(qǐng)求)
傳參:(1)keyid 開關(guān)的ID (2)status 開關(guān)的狀態(tài)
返回值:status 是否設(shè)置成功匪补,0為失敗 1為成功
(3)APP用于接收開關(guān)狀態(tài)的接口信息:
接口地址:api/getServerControls(post請(qǐng)求)
傳參:這里本來(lái)是有用戶id伞辛,但是并沒(méi)有什么影響所以假定此處沒(méi)有傳參即可。
返回值:one : 0/1 開關(guān)一 夯缺,0為關(guān)閉 1為開啟
two : 0/1 開關(guān)二蚤氏,0為關(guān)閉 1為開啟
好了,這樣基本的數(shù)據(jù)環(huán)境就準(zhǔn)備好了踊兜。
第二部分:一邊設(shè)計(jì)流程一邊寫自動(dòng)化
(1)我們這里使用xmysql連接數(shù)據(jù)庫(kù)竿滨,至于基本的安裝使用這里不再詳細(xì)介紹。
通過(guò)命令行直接輸入命令
mysql -h 數(shù)據(jù)庫(kù)地址 -u 用戶名 -p 密碼 -d 數(shù)據(jù)庫(kù)名 -r 指定訪問(wèn)IP地址
連接成功之后在postman新建一個(gè)GET請(qǐng)求:{{sqlUrl}}/api/server_control
通過(guò)get請(qǐng)求即可獲取當(dāng)前數(shù)據(jù)庫(kù)server_control表中的數(shù)據(jù)捏境,在tests中編寫如下方法即可獲取當(dāng)前的數(shù)據(jù)于游。
var rpData = JSON.parse(responseBody);
效果如下圖:
通過(guò)請(qǐng)求取出數(shù)據(jù)庫(kù)數(shù)據(jù)判斷當(dāng)前keyId的值,數(shù)據(jù)格式為"keyId":status
例如 keyId為1的status為1 垫言;keyId為2的status為1(這個(gè)我自己寫了個(gè)接口返回的并非真實(shí)數(shù)據(jù)庫(kù)返回的格式贰剥,僅用參考)
(2)因?yàn)閮蓚€(gè)status的值都為0,那么我們就設(shè)置相反狀態(tài)環(huán)境變量筷频,keyone 和 keytwo都為1蚌成,分別代表keyid為1的status值和keyid為2的status值前痘。這兩個(gè)值主要用戶后臺(tái)管理系統(tǒng)更改狀態(tài)和APP接口的預(yù)期結(jié)果。
為啥我們要設(shè)置相反的值呢担忧?
數(shù)據(jù)庫(kù)查詢出來(lái)的狀態(tài)一定是當(dāng)前APP和后臺(tái)的狀態(tài)芹缔,例如status都為0,那么我們根據(jù)這個(gè)值為環(huán)境變量設(shè)置為1瓶盛,開關(guān)的狀態(tài)肯定會(huì)從一種狀態(tài)變成另一種狀態(tài)最欠,這樣就實(shí)現(xiàn)了我們對(duì)接口功能使用的效果。
最終Mmysql接口tests中代碼如下:
(3)根據(jù)測(cè)試的流程邏輯惩猫,下一個(gè)請(qǐng)求的接口應(yīng)該是后臺(tái)管理系統(tǒng)的接口芝硬,為了保證接口請(qǐng)求順序準(zhǔn)確性,我們?cè)趍ysql的接口最后一行增加一個(gè)順序控制帆锋,如下代碼加入mysql接口的tests中:
postman.setNextRequest("這個(gè)是postman設(shè)置的接口名") //下一個(gè)請(qǐng)求的接口時(shí)后臺(tái)管理系統(tǒng)的接口
(4)接下來(lái)我們搞一下后臺(tái)管理系統(tǒng)的代碼吵取,首先當(dāng)前接口是api/server_control/save /keyId=1&status=0禽额,傳值中帶有keyId锯厢,也就說(shuō)每次請(qǐng)求接口只能更改其中一個(gè)開關(guān)的狀態(tài),但是我們有兩個(gè)開關(guān)脯倒,所以我們需要請(qǐng)求兩次实辑;另外status的值也不是固定的,所以這兩位置都設(shè)置成變量 :分別為keyid(開關(guān)id)和status(開關(guān)狀態(tài)值)藻丢,即
api/server_control/save /keyId={{keyid}}&status={{status}}
(5)因?yàn)樽兞吭谡?qǐng)求上剪撬,所以我們要在請(qǐng)求之前進(jìn)行賦值,這個(gè)時(shí)候就用到了postman的Pre-requestScript功能悠反,位置如圖所示(接口請(qǐng)求之前會(huì)先執(zhí)行此處)
首先我們先實(shí)現(xiàn)一次接口的賦值和斷言残黑,在Pre-requestScript中新建變量并接收keyone的值用于本接口的status,因?yàn)閗eyone的值為keyId為1的對(duì)應(yīng)的值斋否,所以他的keyid就等于1梨水,實(shí)際代碼如下:
(6)這樣就實(shí)現(xiàn)了在接口請(qǐng)求前給接口的變量附上最新值的下過(guò),然后我們就需要在tests中斷言接口返回的status為1即可:
(7)完成以上操作茵臭,我們只實(shí)現(xiàn)了一個(gè)開關(guān)的修改疫诽,那么完成兩個(gè)開關(guān)的修改咋辦呢?難道再請(qǐng)求一次旦委?哈哈奇徒,如果那樣的話就顯得有點(diǎn)low了,接下來(lái)讓我們一起修改代碼實(shí)現(xiàn)請(qǐng)求兩次的效果吧缨硝。
首先我們修改一下mysql的接口中tests中的代碼摩钙,新建一個(gè)環(huán)境變量在如圖所示的位置,用于重置循環(huán)次數(shù)查辩。
然后在后臺(tái)管理系統(tǒng)接口的pre-resquestScript模塊修改代碼胖笛,通過(guò)判斷循環(huán)次數(shù)為接口傳參(keyid和status)賦值:
接下來(lái)在tests中判斷當(dāng)前的循環(huán)次數(shù)奕短,也就是loopC字段,如果loopC=1(代表只循環(huán)了一次)匀钧,那么設(shè)置再次請(qǐng)求當(dāng)前接口:
通過(guò)上面的判斷翎碑,代碼運(yùn)行會(huì)再次請(qǐng)求后臺(tái)管理系統(tǒng)的接口,然后我們?cè)赑re-requestScript中進(jìn)行判斷當(dāng)前的loopC的值之斯,如果為1日杈,代表已經(jīng)請(qǐng)求過(guò)一次,也就是說(shuō)keyid為1的情況已經(jīng)更改佑刷,我們還需要更改keyid為2的情況莉擒,那么我們就將2賦值給keyid,staus的值就是對(duì)應(yīng)的keytwo的值:
最后我們?cè)趖ests中判斷l(xiāng)oopC=2瘫絮,兩個(gè)開關(guān)都已經(jīng)做了更改涨冀,這樣我們就不需要再請(qǐng)求后臺(tái)管理系統(tǒng)的接口,而是設(shè)置去請(qǐng)求APP的接口:
(8)最后一步麦萤,我們就要請(qǐng)求APP的接口進(jìn)行最后的斷言(成敗在此一舉)鹿鳖。
APP的接口api/getServerControls,返回值為one:1 壮莹;two:1翅帜,我們直接在APP接口的tests中斷言one和two的值是否與keyone和keytwo的相等即可:
完成上面的步驟,就實(shí)現(xiàn)了數(shù)據(jù)庫(kù)命满、后臺(tái)管理系統(tǒng)和APP(用戶操作系統(tǒng))三端聯(lián)動(dòng)的接口自動(dòng)化測(cè)試涝滴,整體內(nèi)容不一定適合每一個(gè)人并且沒(méi)有基礎(chǔ)知識(shí)的介紹,屬于純實(shí)戰(zhàn)項(xiàng)目胶台,適合剛剛接觸接口自動(dòng)化歼疮,沒(méi)有實(shí)際經(jīng)驗(yàn)的小伙伴≌┗#基礎(chǔ)知識(shí)只能滿足你60%的學(xué)習(xí)需求韩脏,剩下的40%就要在實(shí)戰(zhàn)中補(bǔ)足,我要做的就是補(bǔ)充你剩下的40%讯榕。OK骤素,這次分享就到這里了,有什么疑問(wèn)可以隨時(shí)留言溝通愚屁,互相學(xué)習(xí)進(jìn)步济竹!
歡迎加入QQ群:547349021
小提示:群名雖然叫selenium+unittest,但是我們不限任何測(cè)試領(lǐng)域的溝通交流和學(xué)習(xí)霎槐,讓我們一起補(bǔ)足缺失的40%吧送浊!