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

优势

  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)

运行时获取包的 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

首次运行测试时会根据包返回与记录文件中原包返回做结构化对比,生成差异 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。无需用例无需手工重复执行,简化了其测试成本

同样利用记录文件,读取原包 request 结构自动遍历一些基本的 fuzz 测试 ,如缺参数,空值,无值,字符串裁减、扩展、异常值,超长,特殊值等。

也可自行添加 fuzzcase 如 xss 等


适用场景

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

开源地址

https://github.com/zhangzhao4444/httpapi

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


↙↙↙阅读原文可查看相关链接,并与作者交流