大家都知道接口測(cè)試框架有很多,到底哪個(gè)最好用呢?他們都有哪些優(yōu)缺點(diǎn)?今天我們就來(lái)評(píng)測(cè)一下這些框架。
Java Rest-assured:是使用代碼來(lái)實(shí)現(xiàn)接口的請(qǐng)求,封裝業(yè)務(wù)流程,對(duì)于公司的業(yè)務(wù)支持比較高,靈活度很強(qiáng),可以通過(guò)代碼的方式打造自己公司的接口自動(dòng)化框架,上手有點(diǎn)難度,需要有Java 編程基礎(chǔ),才可以使用。
Python?+ Request 框架:是使用代碼來(lái)實(shí)現(xiàn)接口的請(qǐng)求,封裝業(yè)務(wù)流程,對(duì)于公司的業(yè)務(wù)支持比較高,可以根據(jù)業(yè)務(wù)的靈活度來(lái)定制化開(kāi)發(fā)接口框架,再加上Jenkins 就可以持續(xù)化集成。上手有點(diǎn)難度,需要有Python 編碼的基礎(chǔ),才可以使用。
Robot Framework
機(jī)器人框架是一個(gè)通用的開(kāi)放源碼自動(dòng)化框架,用于驗(yàn)收測(cè)試、驗(yàn)收測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(ATDD)和機(jī)器人過(guò)程自動(dòng)化(RPA)。它具有易于使用的表格測(cè)試數(shù)據(jù)語(yǔ)法,并利用關(guān)鍵字驅(qū)動(dòng)的測(cè)試方法.它的測(cè)試功能可以通過(guò)用Python或Java實(shí)現(xiàn)的測(cè)試庫(kù)來(lái)擴(kuò)展,用戶(hù)可以使用與創(chuàng)建測(cè)試用例相同的語(yǔ)法從現(xiàn)有的測(cè)試庫(kù)中創(chuàng)建新的更高級(jí)別的關(guān)鍵字? 。
HttpRunner 是一款面向 HTTP(S) 協(xié)議的通用測(cè)試框架,只需編寫(xiě)維護(hù)一份 YAML/JSON 腳本,即可實(shí)現(xiàn)自動(dòng)化測(cè)試、性能測(cè)試、線上監(jiān)控、持續(xù)集成等多種測(cè)試需求,中文地址? https://cn.httprunner.org/ 官網(wǎng)已經(jīng)有很詳細(xì)的介紹。
robot framework
優(yōu)點(diǎn)
關(guān)鍵字驅(qū)動(dòng),自定義用戶(hù)關(guān)鍵字。
支持測(cè)試日志和報(bào)告生成。
支持系統(tǒng)關(guān)鍵字開(kāi)發(fā),可擴(kuò)展性好。
支持?jǐn)?shù)據(jù)庫(kù)操作。
缺點(diǎn)
接口測(cè)試用例寫(xiě)起來(lái)不簡(jiǎn)潔。
需要掌握特定語(yǔ)法。
*** Settings ***
Library? ? RequestsLibrary
Library? ? Collections
*** Test Cases ***
test_get_event_list? ? # 查詢(xún)發(fā)布會(huì)(GET請(qǐng)求)
${payload}=? ? Create Dictionary? ? eid=1
Create Session? ? event? ? http://127.0.0.1:8000/api
${r}=? ? Get Request? ? event? ? /get_event_list/? ? params=${payload}
Should Be Equal As Strings? ? ${r.status_code}? ? 200
log? ? ${r.json()}
${dict}? ? Set variable? ? ${r.json()}
#斷言結(jié)果
${msg}? ? Get From Dictionary? ? ${dict}? ?message
Should Be Equal? ? ${msg}? ? success
${sta}? ? Get From Dictionary? ? ${dict}? ? status
${status}? ? Evaluate? ? int(200)
Should Be Equal? ? ${sta}? ? ${status}
結(jié)果:不考慮,沒(méi)人愿意這么寫(xiě)接口用例。
postman + Newman? + Jenkins?
postman + Newman? + Jenkins 實(shí)現(xiàn)接口自動(dòng)化框架,postman 方便日常的調(diào)試,非常的方便,測(cè)試的斷言,設(shè)置前置條件,環(huán)境變量,response 參數(shù)提取 非常方便,我在日常工作中經(jīng)常使用 postman進(jìn)行接口的調(diào)試。postman高級(jí)的功能可以付費(fèi)進(jìn)行定制化(我還沒(méi)有試驗(yàn)過(guò)付費(fèi)的功能,在日常工作中 免費(fèi)版本就已經(jīng)夠使用的了)。官網(wǎng)文檔 https://learning.getpostman.com/docs/
JMeter
Jmeter?可以做于接口自動(dòng)化工具,也可以用于性能測(cè)試,在性能測(cè)方面很強(qiáng)大,我在工作中用的不多,Vue+Flask 搭建自己公司的接口測(cè)試平臺(tái),可以自由定制化自己公司的業(yè)務(wù),實(shí)現(xiàn)公司特殊的需求,接口測(cè)試平臺(tái),對(duì)于測(cè)試的開(kāi)發(fā)能力有要求,前端 Vue ,后端 Flask & Django 框架,代碼能力要求高,前后端的技術(shù)都需要懂。
????JMeter
優(yōu)點(diǎn)
支持參數(shù)化
不需要寫(xiě)代碼
缺點(diǎn)
創(chuàng)建接口用例效率不高。
不能生成查看每一個(gè)接口執(zhí)行情況的測(cè)試報(bào)告。
總結(jié):不考慮,接口編寫(xiě)不方便,最主要是不能生成測(cè)試報(bào)告,如果做接口性能的話(huà)可以考慮。
HttpRunner
優(yōu)點(diǎn):
基于YAML/JSON格式,專(zhuān)注于接口本身的編寫(xiě)。
接口編寫(xiě)簡(jiǎn)單
生成測(cè)試報(bào)告
接口錄制功能。
缺點(diǎn):
沒(méi)有編輯器插件對(duì)語(yǔ)法校驗(yàn),容易出錯(cuò)。
官方文檔沒(méi)有詳細(xì)的說(shuō)明。
擴(kuò)展不方便。
[
{
"config": {
"name": "testcase description",
"variables": [],
"request": {
"base_url": "http://127.0.0.1:5000",
"headers": {
"User-Agent": "python-requests/2.18.4"
}
}
}
},
{
"test": {
"name": "test case name",
"request": {
"url": "/api/get-token",
"headers": {
"device_sn": "FwgRiO7CNA50DSU",
"user_agent": "iOS/10.3",
"os_platform": "ios",
"app_version": "2.8.6",
"Content-Type": "application/json"
},
"method": "POST",
"date": {"sign": "958a05393efef0ac7c0fb80a7eac45e24fd40c27"}
},
"validate": [
{"eq": ["status_code", 200]},
{"eq": ["headers.Content-Type", "application/json"]},
{"eq": ["content.success", true]},
{"eq": ["content.token", "baNLX1zhFYP11Seb"]}
]
}
}]
總結(jié):可以考慮,至于接口數(shù)據(jù)的初始化可能需要單獨(dú)處理。
gauge
BDD行為驅(qū)動(dòng)測(cè)試框架——gauge
優(yōu)點(diǎn):
行為文件與腳本文件分離,本質(zhì)上實(shí)現(xiàn)了數(shù)據(jù)驅(qū)動(dòng)。
功能強(qiáng)大靈活,本質(zhì)上還用Python寫(xiě)接口用例。
自動(dòng)生成測(cè)試報(bào)告。
VS Code有支持插件
缺點(diǎn)
門(mén)檻略高,需要了解BDD的用法。
需要會(huì)markdworn語(yǔ)法
行為描述文件:
## test post request
* post "http://httpbin.org/post" interface
|key? | status_code|
|------|-----------|
|value1|200? ? ? ? |
|value2|200? ? ? ? |
|value3|200? ? ? ? |
測(cè)試腳本:
……
@step("post <url> interface <table>")
def test_get_request(url, table):
values = []
status_codes = []
for word in table.get_column_values_with_name("key"):
values.append(word)
for word in table.get_column_values_with_name("status_code"):
status_codes.append(word)
for i in range(len(values)):
r = requests.post(url, data={"key": values[i]})
result = r.json()
assert r.status_code == int(status_codes[i])
總結(jié):推薦使用,BDD有一定門(mén)檻,看測(cè)試人員的學(xué)些能力和接受速度。
?Unittest+Request+HTMLRunner
利用現(xiàn)有的框架和庫(kù)自己定制:Unittest+Request+HTMLRunner
優(yōu)點(diǎn):
足夠靈活強(qiáng)大: 分層測(cè)試、數(shù)據(jù)驅(qū)動(dòng)、測(cè)試報(bào)告,集成CI...
缺點(diǎn):
有一定的學(xué)習(xí)成本
數(shù)據(jù)文件:
{
"test_case1": {
"key": "value1",
"status_code": 200
},
"test_case2": {
"key": "value2",
"status_code": 200
},
"test_case3": {
"key": "value3",
"status_code": 200
},
"test_case4": {
"key": "value4",
"status_code": 200
}}
測(cè)試用例:
import requests
import unittest
from ddt import ddt, file_data
@ddtclass InterfaceTest(unittest.TestCase):
def setUp(self):
self.url = "http://httpbin.org/post"
def tearDown(self):
print(self.result)
@file_data("./data/test_data_dict.json")
def test_post_request(self, key, status_code):
r = requests.post(self.url, data={"key": key})
self.result = r.json()
self.assertEqual(r.status_code, status_code)
總結(jié):推薦使用,代碼相對(duì)簡(jiǎn)單,功能足夠靈活。
我花了兩天時(shí)間整理這些框架,其實(shí)重點(diǎn)就是了解HttpRunner 和 gauge 。
HttpRunner 沒(méi)有編輯器插件,本身就是一個(gè)YAML/JSON配置文件,所以配置寫(xiě)錯(cuò)了,但只要是合法的YAML/JSON格式,也看不出來(lái),只有運(yùn)行的過(guò)后才知道。就像你用記事本寫(xiě)代碼一樣,只有運(yùn)行了才知道代碼有沒(méi)有寫(xiě)錯(cuò)。
另外,擴(kuò)展起來(lái)也不是特別方便,單獨(dú)用python實(shí)現(xiàn)一些函數(shù):在json文件中
{"device_sn": "${gen_random_string(15)}"}
以這樣的方式引用gen_random_string() 函數(shù)。
gauge我已經(jīng)分享過(guò)兩篇基礎(chǔ)文章了,雖然用BDD拿來(lái)做接口理念不搭,但并不是不可以,唯一的缺點(diǎn)是用BDD來(lái)描述接口行為不合適,其他的都沒(méi)毛病,可以參數(shù)化,斷言寫(xiě)起來(lái)也簡(jiǎn)單,測(cè)試報(bào)告也漂亮,本質(zhì)上還是用Python實(shí)現(xiàn)一些功能,所以非常靈活。
unittest + requests + HTMLTestRunner是我最熟悉的方案,幾乎沒(méi)什么短板。以前通過(guò)這種方案寫(xiě)過(guò)很多測(cè)試用例,這次把ddt加上似乎更完美了。
總結(jié)
對(duì)于單接口,變化不多的可以使用? Postman、 Jmeter、HttpRunner框架就可以滿(mǎn)足了,需要多個(gè)接口組合滿(mǎn)足于一些場(chǎng)景的,需要自己編寫(xiě)代碼來(lái)實(shí)現(xiàn)了 比如:
登錄,提取token,查詢(xún)商品ID 訂單ID 進(jìn)行購(gòu)買(mǎi)商品,支付,以及查詢(xún)用戶(hù)購(gòu)買(mǎi)訂單狀態(tài)
對(duì)于一些業(yè)務(wù)場(chǎng)景涉及多個(gè)接口的,需要使用代碼的方式來(lái)查詢(xún)接口需要的前置信息,如 token, 商品ID,訂單ID,訂單狀態(tài),以實(shí)現(xiàn)業(yè)務(wù)場(chǎng)景的接口功能測(cè)試。