?接口測(cè)試僅僅掌握 Requests 或者其他一些功能強(qiáng)大的庫(kù)的用法,是遠(yuǎn)遠(yuǎn)不夠的,還需要具備能根據(jù)公司的業(yè)務(wù)流程以及需求去定制化一個(gè)接口自動(dòng)化測(cè)試框架的能力。所以,接下來(lái),我們主要介紹下接口測(cè)試用例分析以及通用的流程封裝是如何完成的。
接口測(cè)試用例分析
首先在做用例分析之前,可以通過(guò)追查公司一年來(lái)所有的故障原因,定位問(wèn)題起因,或者通過(guò)與 CTO、產(chǎn)品經(jīng)理、研發(fā)、運(yùn)維、測(cè)試調(diào)查,得到質(zhì)量痛點(diǎn),還可以分析業(yè)務(wù)架構(gòu)、流程調(diào)用,以及監(jiān)控系統(tǒng)了解到業(yè)務(wù)的使用數(shù)據(jù),從而得到質(zhì)量需求。
得到質(zhì)量需求之后,通過(guò)與產(chǎn)品經(jīng)理、項(xiàng)目經(jīng)理、研發(fā)總監(jiān)等對(duì)接后得知待測(cè)業(yè)務(wù)范圍、業(yè)務(wù)場(chǎng)景用例、業(yè)務(wù)接口分析,從而確定公司的測(cè)試計(jì)劃。將測(cè)試計(jì)劃與質(zhì)量需求結(jié)合進(jìn)行分析,就可以開(kāi)始進(jìn)行業(yè)務(wù)用例的設(shè)計(jì),而接口測(cè)試用例分析,也在其內(nèi)。
質(zhì)量需求 | 樣例 |
---|---|
測(cè)試痛點(diǎn) | 公司的接口一直不穩(wěn)定影響用戶的使用 |
質(zhì)量反饋 | 最近半年來(lái)出現(xiàn)了幾次大的故障 |
回歸測(cè)試 | 每次升級(jí)都會(huì)影響老的功能 |
測(cè)試策略 | 目前公司沒(méi)有可靠的測(cè)試體系 |
重構(gòu)測(cè)試 | 微服務(wù)話改造需要有良好的測(cè)試體系保證 |
接口測(cè)試封裝思想
接口封裝思想主要分為 3 個(gè)大維度:配置、接口封裝、業(yè)務(wù)流程。其中:
- 配置主要用作根據(jù)配置文件獲取初始配置和依賴;
- 接口封裝遵循 APIObject 設(shè)計(jì)模式,對(duì)接口的調(diào)用進(jìn)行抽象封裝;
- 業(yè)務(wù)流程則負(fù)責(zé)數(shù)據(jù)初始化、業(yè)務(wù)用例設(shè)計(jì),包含有多個(gè) API 形成的流程定義,不要再包含任何接口實(shí)現(xiàn)細(xì)節(jié)、以及斷言。
下面將會(huì)與實(shí)戰(zhàn)案例結(jié)合,進(jìn)行詳細(xì)的介紹。
基于加密接口的測(cè)試用例設(shè)計(jì)
由于信息安全原因,許多接口在傳輸?shù)臅r(shí)候會(huì)對(duì)請(qǐng)求與響應(yīng)進(jìn)行加密處理,如果直接對(duì)這部分?jǐn)?shù)據(jù)做斷言顯然是行不通的。還需要對(duì)這部分接口額外進(jìn)行解密的處理之后,才可以對(duì)已解密的接口進(jìn)行斷言。
環(huán)境準(zhǔn)備
在進(jìn)行實(shí)戰(zhàn)之前,需要先準(zhǔn)備一個(gè)對(duì)響應(yīng)加密的接口。對(duì)它發(fā)起一個(gè) get 請(qǐng)求后,得到一個(gè)加密過(guò)后的響應(yīng)信息。
先準(zhǔn)備一個(gè) JSON 格式 demo:
{"topics":
{
"orange":"movie",
"shool":"testing-studio",
"president":"seveniruby"
}
}
使用 base64 對(duì)其做加密,得到一個(gè)加密后的文件 demo64.txt
base64 demo.json >demo64.txt
使用 Python 命令在 “demo64.txt” 所在目錄啟動(dòng)一個(gè)服務(wù)
python -m http.server 10000
啟動(dòng)后的樣子如圖:
?使用curl命令對(duì)這個(gè)服務(wù)進(jìn)行g(shù)et請(qǐng)求:
curl http://127.0.0.1:10000/demo64.txt
如果請(qǐng)求成功的話就代表環(huán)境已經(jīng)準(zhǔn)備成功
實(shí)戰(zhàn)練習(xí)
調(diào)用 base64,直接對(duì)返回的請(qǐng)求做解密,即可得到解密后的響應(yīng),將解密后的響應(yīng)轉(zhuǎn)為 JSON 格式,此時(shí)就可以對(duì)這個(gè)返回值做斷言且不會(huì)報(bào)錯(cuò)了。
import base64
import json
import requests
class TestEncode:
url = "http://127.0.0.1:10000/demo64.txt"
def test_encode(self):
r = requests.get(self.url)
encode = json.loads(base64.b64decode(r.content))
assert encode["topics"]["president"] == "seveniruby"
這樣的寫法顯然不夠優(yōu)雅,如果被測(cè)接口的協(xié)議發(fā)生變化,Requests 庫(kù)無(wú)法支持改變后的協(xié)議,需要調(diào)用別的第三庫(kù)發(fā)送請(qǐng)求信息,則還是需要修改底層的源碼。碰到這種情況,可以增加一層封裝,構(gòu)造一層更加通用的發(fā)送方法。
首先需要通過(guò)一個(gè)字典的結(jié)構(gòu)體,保存所有的請(qǐng)求信息,包括發(fā)送的協(xié)議、解碼方式、請(qǐng)求 method 等等,而這種字典形式的結(jié)構(gòu)體也為后面的數(shù)據(jù)驅(qū)動(dòng)改造做好了一個(gè)重要的鋪墊。
req_data={
"schema": "http",
"method": "get",
"url": "http://127.0.0.1:10000/demo64.txt",
"headers": None
}
通過(guò)請(qǐng)求信息的結(jié)構(gòu)體中的schema
,添加判斷條件,去選擇不同的請(qǐng)求協(xié)議。舉個(gè)例子,如果 schema
為“http”的話,就選擇調(diào)用被封裝的 requests 庫(kù)。
class ApiRequest:
#構(gòu)造send方法,通過(guò)
def send(self, data: dict):
if "http" == data["schema"] :
res = requests.request(data["method"],data["url"],header=data["headers"])
return json.loads(base64.decode(res.content))
elif "dubbo" == data["schema"]:
pass
elif "websocket" == data["schema"]:
pass
else:
pass
調(diào)用在ApiRequest
類中的send方法發(fā)送請(qǐng)求并進(jìn)行斷言
class TestEncode:
def test_api(self):
req_data={
"schema": "http",
"encoding": "base64",
"method": "get",
"url": "http://127.0.0.1:10000/demo64.txt",
"headers": None
}
re = ApiRequest()
data = re.send(req_data)
assert data["topics"]["president"] == "seveniruby"
如果面對(duì)不同的算法,還需要修改底層的源碼,所以需要把算法封裝。需要使用哪個(gè)算法,就使用哪個(gè)。封裝的思想與上面相同。首先在字典結(jié)構(gòu)體中添加一個(gè) encoding
字段,用來(lái)判斷選擇的不同的加密條件。
req_data={
"schema": "http",
"method": "get",
"url": "http://127.0.0.1:10000/demo64.txt",
"headers": None,
"encoding": "base64"
}
還是通過(guò)請(qǐng)求信息的結(jié)構(gòu)體中的 encoding
,添加判斷條件,去選擇不同的解密方式。
class ApiRequest:
def send(self, data: dict):
if "http" == data["schema"] :
res = requests.request(data["method"],data["url"],headers=data["headers"])
return json.loads(base64.b64decode(res.content))
#通過(guò)請(qǐng)求信息的結(jié)構(gòu)體中的`encoding`,去選擇不同的解密方式。
if data["encoding"] == "base64":
return json.loads(base64.b64decode(res.content))
elif data["encoding"] == "private":
return json.loads(requests.post("url", data=res.content).content)
else:
return json.loads(res.content)
總結(jié)
首先需要明確在面對(duì)一個(gè)加密的響應(yīng)結(jié)果,可以使用什么樣的處理方式:
- 如果知道使用的是哪個(gè)通用加密算法的話,可以自行解決。
- 如果不了解對(duì)應(yīng)的加密算法的話,可以讓研發(fā)提供加解密的 lib。
- 如果既不是通用加密算法、研發(fā)也無(wú)法提供加解密的 lib 的話,可以讓加密方提供遠(yuǎn)程解析服務(wù),這樣算法仍然是保密的。
本文主要講的是在了解使用加密算法的情況下,如何處理這樣的解密算法。但是封裝的思路都是相通的,不管是面對(duì)哪種情況,都可以通過(guò)格式化的數(shù)據(jù),指明數(shù)據(jù)的內(nèi)容,并通過(guò)一層邏輯的封裝,將加解密或者選擇的協(xié)議封裝進(jìn)去。
最后如果你想學(xué)習(xí)自動(dòng)化測(cè)試和需要軟件測(cè)試資料,歡迎加入筆者的交流群:320231853,里面會(huì)有很多測(cè)試資源和大佬答疑解惑,我們一起交流一起學(xué)習(xí)!
搜索文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-711141.html
復(fù)制文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-711141.html
到了這里,關(guān)于接口自動(dòng)化框架篇:流程封裝與基于加密接口的測(cè)試用例設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!