接口测试:一个接口串的测试框架优化

Posted 软件测试资源站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口测试:一个接口串的测试框架优化相关的知识,希望对你有一定的参考价值。


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


主要实现思路:

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


使用JsonPath解析json数据:

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

pip install jsonpath


Jsonpath语法


Json 描述

$

根节点

*

所有节点

.

取子节点({ }里面用.节点)

[]

取子节点([ ]里面用 []下标)

..

不管位置,所有符合条件的条件


举个例子:
有一个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

接口测试:一个接口串的测试框架优化



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



缺陷:

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


涉及改动的文件:

  • 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)


结束

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


整个项目代码在GitHub上了,转发截图分享获取。


-The End-


﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍

点击以下关键词有资源

 |  |  |  |  |  |  |  |  | 

 | |  |  |

以上是关于接口测试:一个接口串的测试框架优化的主要内容,如果未能解决你的问题,请参考以下文章

接口测试面试题

JMeter接口测试-模块控制器

分布式接口自动化测试平台

接口测试自动化生成框架

Python接口自动化测试框架(工具篇)-- 接口测试工具Requests

接口自动化测试实践