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

前言

之前两篇文章,第一篇介绍了主要结构,第二篇介绍了主要代码,最近做了一点小优化。
先贴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)

结束

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容