接口测试工具之httpapi(类似 gor,抓流量,回放,diff,fuzz)

本帖已被设为精华帖!,

接口测试一工具,好不好用,用了就知道

优势

  1. 无需写测试用例!
  2. 所做即所得,真实记录流量,多次测试复用!
  3. 结构化diff,简化结果校验!
  4. 中间化插件,解决动态参数!
  5. 自动fuzz测试各种容错!
  6. 无缝对接持续集成

原理

  • 如何实现了记录和回放?

二次开发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等


适用场景

  1. fuzz测试–新接口
  2. 回放测试–接口线上监控,回归测试,环境切换

开源地址

https://github.com/zhangzhao4444/httpapi

如有bug和好想法可及时联系我

* 注:本文来自网络投稿,不代表本站立场,如若侵犯版权,请及时知会删除