接口测试工具之httpapi(类似 gor,抓流量,回放,diff,fuzz)
本帖已被设为精华帖!,
接口测试一工具,好不好用,用了就知道
优势
- 无需写测试用例!
- 所做即所得,真实记录流量,多次测试复用!
- 结构化diff,简化结果校验!
- 中间化插件,解决动态参数!
- 自动fuzz测试各种容错!
- 无缝对接持续集成
原理
- 如何实现了记录和回放?
二次开发fiddlerscript实现自己的OnBeforeResponse,开启fiddler实时记录抓取指定数据包的请求和回应
static function OnBeforeResponse(oSession: Session) {
if (isautocap && oSession.HostnameIs(filterUrl)) {
if (oSession.responseCode != 200 || oSession.GetResponseBodyAsString().IndexOf("\"errno\":0") != 1){
record(oSession,filePath + "refuse.gor",8);
static function record(oSession:Session,fpath:String,op:int){
oSession.utilDecodeResponse();
var sBuilder = new StringBuilder();
sBuilder.Append("\n"+"Request id: 1 " + getmd5(oSession.url) +" "+ oSession.Timers.ClientBeginRequest.Ticks+" "+getmd5(oSession.PathAndQuery.split('?')[0])+"\n");
sBuilder.Append("Request protocol: " + oSession.isHTTPS+"\n");
sBuilder.Append("Request url: " + oSession.url+"\n");
sBuilder.Append("Request api: " + oSession.PathAndQuery.split('?')[0]+"\n");
从记录的文件中读取数据包原始的请求结构,经中间件处理后,调requests库发包
def send(url,method,payload,headers,**attrs):
if method == 'POST':
r = requests.post(url, data=payload, headers=headers,**attrs)
if method == 'GET':
r = requests.get(url, data=payload, headers=headers,**attrs)
return (r.status_code,r.json(),r.headers)
- 如何解决动态token?
运行时获取包的response再经中间件middleware修正后续包的request
def fifoprocess(queue,n):
while True:
try:
n-=1
j=n
str = queue.popleft()
(code,body, header)=process(str)
while(j>0):
queue.append(middleware.rule(str,body,header,queue.popleft()))
j-=1
fifoprocess(queue,n)
利用一个双向队列弹栈发包,修正后再入栈。该方法效率有待改善
middleware具体算法需根据项目情况自己实现逻辑
def rule(str,body,header,pstr):
"""
url=str.split('Request ')[3].split("?")[0].split(" ")[1].replace("\n","")
if url=='www.3663.com/api/msg/send':
body=eval(body)
token=urllib.parse.quote(body["data"])
pstr,_=re.subn("content=(.*)&","content="+token+"&",pstr)
"""
return pstr
- 如何diff?
首次运行测试时会根据包返回与记录文件中原包返回做结构化对比,生成差异white.txt,认为是一次diff baseline
white.txt
www.xxxx.com/api/index/banner header.Transfer-Encoding
www.xxxx.com/api/room/get header.Content-Length
www.xxxx.com/api/room/init body.data.room_info.stream_status
www.xxxx.com/api/room/init body.data.anchor_info.uid
www.xxxx.com/api/room/init body.data.chat_info.url
www.xxxx.com/api/room/get header.Date
后续测试会根据本次包返回与上次包返回做对比,差异屏蔽掉白名单之后的diff作为测试结果供人工校验
也可手动删除white.txt,连续2次测试来生成baseline
实际测试人员只需确认记录的原包,生成的white.txt,以及后需的diff。无需用例无需手工重复执行,简化了其测试成本
- 关于fuzz
同样利用记录文件,读取原包request结构自动遍历一些基本的fuzz测试 ,如缺参数,空值,无值,字符串裁减、扩展、异常值,超长,特殊值等。
也可自行添加fuzzcase 如xss等
适用场景
- fuzz测试–新接口
- 回放测试–接口线上监控,回归测试,环境切换
开源地址
https://github.com/zhangzhao4444/httpapi
如有bug和好想法可及时联系我
* 注:本文来自网络投稿,不代表本站立场,如若侵犯版权,请及时知会删除