美文网首页软件测试软件测试程序员
接口测试框架优化(三)---支持简单串接口

接口测试框架优化(三)---支持简单串接口

作者: 迈阿密小白 | 来源:发表于2018-05-11 17:48 被阅读263次

    前言

    之前两篇文章,第一篇介绍了主要结构,第二篇介绍了主要代码,最近做了一点小优化。
    先贴Github地址,本次主要优化一点:

    • 支持单个简单串接口的测试,即下一个接口的一个参数依赖上一个接口的返回

    主要实现思路:根据jsonpath解析 接口的返回值,并将该值存入一个列表中。同时有依赖的参数,将这个参数的value用指定格式代替,读取参数的时候,用正则匹配,匹配成功,则将该value替换为列表的最后一个值。

    使用JsonPath解析json数据

    需要掌握的一点利用JsonPath从json串中,抽取指定的数据
    首先 JsonPath 的安装同其他第三方库,使用命令

    pip install jsonpath
    

    Jsonpath语法

    Jsonpath 描述
    $ 根节点
    * 所有节点
    . 取子节点({ }里面用.节点)
    [] 取子节点([ ]里面用 []下标)
    .. 不管位置,所有符合条件的条件

    举个例子:
    有一个json如下:

    dict = { "store": {
        "book": [ 
          { "category": "reference",
            "author": "Nigel Rees",
            "title": "Sayings of the Century",
            "price": 8.95
          },
          { "category": "fiction",
            "author": "Evelyn Waugh",
            "title": "Sword of Honour",
            "price": 12.99
          }
       ],
        "bicycle": {
          "color": "red",
          "price": 19.95
        }
      }
    }
    

    分别用不同的JsonPath对其进行解析:

    print(jsonpath(dict,'$.store.bicycle'))
    -------输出[{'color': 'red', 'price': 19.95}]
    print(jsonpath(dict,'$.store.bicycle.color'))
    -------输出['red']
    print(jsonpath(dict,'$..bicycle'))
    -------输出[{'color': 'red', 'price': 19.95}]
    print(jsonpath(dict,'$..book[0].price'))
    -------输出[8.95]
    print(jsonpath(dict,'$..book[0:].price'))
    -------输出[8.95, 12.99]
    

    场景及使用方法介绍

    场景:
    接口1:查询所有客户
    接口2:删除客户
    删除客户传入的客户id,是第一个查询接口返回的response中的值。
    response如下:

    {"footer":[],
    "rows":[{"return_reason":null,"location_c":"","approval_status":"3","district_id":null,
    "location_a":"","code":"CUS000282","dept_name":null,"creator_dept_id":"总部",
    "assign_dept_name":null,"creator_id":"老板","type_id":null,
    "id":"8369801869948241950","dept_id":null,"cus_create_time":"2018-01-30 15:35",
    "dealer_id":null,"name":"11","manager_name":"老板","dealer_code":null,
    "modify_time":"2018-01-30 15:35"}]
    }
    

    在第一个查询的接口的最后一列加入jsonpath

    $.rows[0].id
    
    jsonpath.png

    在第二个接口中,接口传入依赖的参数value用指定格式替代:


    data.png

    缺陷:

    目前只支持单个参数的依赖关系,不支持多个参数的依赖

    主要代码介绍

    涉及改动的文件:

    • getexceldata.py

    主要增加了一个读取jsonpath的方法,并修改读取formdata的方法:

    def get_jsonpath(name,rows):
        '''
        读取jsonpath,供下面参数传值
        :param name: sheet名称
        :param rows: 行
        :return:
        '''
        alldata = xlrd.open_workbook(file)
        sheet = alldata.sheet_by_name(name)
    
        value = sheet.cell(rows, 15).value
        if value == '' or value is None:
            return ''
        else:
            return str(value)
    

    这个就很简答啦,不多做介绍了。同之前的读取表格的方法,没有任何变化,只是改了列这个参数值。
    修改读取formdata方法

    def get_formdata(name,rows,change):
        '''
        读取请求参数
        :param name: sheet名称
        :param rows: 行
        :return:
        '''
        alldata=xlrd.open_workbook(file)
        sheet = alldata.sheet_by_name(name)
    
        value = sheet.cell(rows,6).value
        if value == '':
            return value
        else:
            value=json.loads(value)
            for k in value.keys():
                pattern = re.search(r"^change{change}", str(value[k]))
                if pattern != None:
                    value[k] = change
                elif pattern is None:
                    pass
            return value
    

    这边增加了一个参数change,change为列表中存储的jsonpath解析的结果。
    同时增加了一个简单的正则匹配,如果value为 change{change} ,就将这个value 替换为change

    • read_jsonpath.py
      新增了一个方法:
    def get_rcontent(content,jsonpath):
        '''
        从content中读取值,供下一个接口调用
        :param content: 返回的content,为str类型需要json.loads
        :param jsonpath: 从getexceldata中get_jsonpath获取
        :return:
        '''
        value = jsonpath(content,jsonpath)
        return value[0]
    

    根据读取到的jsonpath解析接口返回的content

    • test_cm.py
      每一个用例也需要略加修改
     def test_cm(self):
            cookie = test_login.login()
            common_url=conf.ReadConfig().getloginConfigValue('url')
            jsondatas=['data']
            for i in range(int(get.get_nrows('cm'))-1):
                #读取jsonpath
                jsonpathexcel=get.get_jsonpath('cm',i+1)
    
                # 判断是否执行
                if int(get.get_data('cm',i+1,4))== 1:
                    login_url=get.get_data('cm',i+1,2)
                    url = common_url + login_url
                    data = get.get_formdata('cm',i+1,jsondatas[-1])
                    header = {"Content-Type": "application/x-www-form-urlencoded","Cookie":cookie}
                    global r
                    print url
                    if get.get_data('cm',i+1,3) == 'post':
                        r=requests.post(url=url,headers=header,data=data)
    
                        if checkall.checkall('cm',i+1,r.status_code,r.content) == 'pass':
                            set.set_result(2,i+1,'pass')
                        elif checkall.checkall('cm',i+1,r.status_code,r.content) == 'fail':
                            set.set_result(2,i+1,'fail')
    
                        if jsonpathexcel != '':
                            jsondata=getjson.get_rcontent(json.loads(r.content),jsonpathexcel)
                            jsondatas.append(jsondata)
                        set.set_statuscode(2,i+1,r.status_code)
                        set.set_content(2,i+1,r.content.decode('UTF-8'))
                        set.set_sql(2,i+1,checkdb.check('cm',i+1)[1])
    
                    elif get.get_data('cm',i+1,3) == 'get':
                        r=requests.get(url=url,headers=header,data=data)
    
                        if checkall.checkall('cm',i+1,r.status_code,r.content) == 'pass':
                            set.set_result(2,i+1,'pass')
                        elif checkall.checkall('cm',i+1,r.status_code,r.content) == 'fail':
                            set.set_result(2,i+1,'fail')
    
                        if jsonpathexcel != '':
                            jsondata=getjson.get_rcontent(json.loads(r.content),jsonpathexcel)
                            jsondatas.append(jsondata)
                        set.set_statuscode(2,i+1,r.status_code)
                        set.set_content(2,i+1,r.content.decode('UTF-8'))
                        set.set_sql(2,i+1,checkdb.check('cm',i+1)[1])
    
                elif int(get.get_data('cm',i+1,4))== 0:
                    print 'not execute'
                    set.set_result(2,i+1,'not execute')
    
    

    新增了有一个全局变量,jsondatas列表,用来存储jsonpath解析到的响应值。

    • 增加读取jsonpath的方法
    #读取jsonpath
     jsonpathexcel=get.get_jsonpath('cm',i+1)
    
    • 由于getexceldata.py中读取参数的方法,有了改动,所以这边也需要加一个参数
    data = get.get_formdata('cm',i+1,jsondatas[-1])
    
    • 解析content并存入列表中
    if jsonpathexcel != '':
       jsondata=getjson.get_rcontent(json.loads(r.content),jsonpathexcel)
       jsondatas.append(jsondata)
    

    结束

    以上所有,本次优化内容,简单支持了接口的依赖,但是针对多个参数的依赖,还是不太适用,后续工作中有需要会继续优化。
    欢迎有想法的朋友一起交流,指导学习。

    相关文章

      网友评论

      • 严北:直接写代码不是更简单吗,为啥要用表格弄测试用例
        迈阿密小白:@严北 考虑到后面的维护成本以及运行成本还有团队整体水平等等…
      • cooling2016:最近总jmeter跑接口,多个工程,性能开销太大
        迈阿密小白:@cooling2016 还没开始玩docker:cry::cry: 我是不是out 了:scream::scream:
        cooling2016:@迈阿密小白 jenkins和jmeter中一个docker中,然后用jmeter的命令行执行三个jmx,
        结果我的服务器就cpu占用高
        迈阿密小白:是在搞接口的压测嘛?
      • 灼灼2015:我最近也在对接口的json参数 进行解析,然后给参数赋值,再拼接回来。
        迈阿密小白:接口测试必须做的事啊 :joy:

      本文标题:接口测试框架优化(三)---支持简单串接口

      本文链接:https://www.haomeiwen.com/subject/zlufdftx.html