接口自动化测试(五)_多接口关联测试

一.继续完善测试用例

1.新建一个assert公用方法,进行断言

在Util包下面新建一个方法AssertUtil,这个公用方法的作用是对被测试接口的返回response进行断言
在这里插入图片描述

需要向其中传递两个参数,一个是由requests请求获取到的response对象
在这里插入图片描述

另一个参数是excel中写入的期望表达式
在这里插入图片描述

补全断言函数然后在main函数里测试一下
在这里插入图片描述

贴一下AssertUtil.py的代码:

import jsonpath as jsonpath


def assert_res(excel_assert,res):
    '''
    excel_assert是excel表里的期望表达式
    res是response对象,是json格式的
    :param excel_assert:
    :param res:
    :return:
    '''
    status = 'pass'
    # 如$.code=200;$.message="请求成功",以";"号分割为两部分
    # i为每个被;号分隔开的部分
    for i in excel_assert.split(';'):
        # 第一次循环时 i == '$.code=200'
        if i.strip():
            a_val = i.split('=')[0]
            # 此时的a_val的value值应该为$.code
            actual_value = jsonpath.jsonpath(res,a_val)[0]
            b_val = i.split('=')[1]
            if str(actual_value) != b_val:
                return 'fail'
    return status

if __name__ == '__main__':
    excel_assert = '$.code=200;$.message=请求成功'
    res = {"code":200,"message":"请求成功"}
    print(assert_res(excel_assert,res))


2.接着完善之前的测试用例

在测试用例里调用刚刚写的断言函数,两个失败,一个成功
在这里插入图片描述

成功的这个接口是我用postman自己创建的post接口啊,不过可能是因为我不太会用postman,这个接口一会正常一会访问报错的
在这里插入图片描述

在这里插入图片描述

3.断言成功后将结果写入excel

这个功能老生常谈了,现在ExcelUtil.py里新加个函数,然后断言后调用
在这里插入图片描述

测试一下这个功能是能用的,贴一下代码:

def write_cell(sheetname,row,column,content):
    workbook = openpyxl.load_workbook(excel_path)
    sheet = workbook[sheetname]
    sheet.cell(row = row,column=column).value = content
    workbook.save(excel_path)

将这个函数写入测试用例里面
在这里插入图片描述

但打开excel,发现失败用例并没有把结果写入,只有执行成功的测试用例才会把结果写入
在这里插入图片描述

于是我到AssertUtil.py里去进行调试,发现是接口返回结果无法用jsonpath.jsonpath来提取,会报错,具体原因可以看看jsonpath的详细用法
在这里插入图片描述

于是问题解决了
在这里插入图片描述

二.多接口关联测试

1.补全excel,以及辅助函数

之前的那个测试用例只是单接口的测试,这个接口不与其他任何接口相关联。
接下啦我们要来尝试相互关联的多接口测试。比如这个接口需要一个参数,而这个参数是从上一个接口拿到的,差不多类似这种情况吧。
还是用postman创建接口,先创建一个如下接口,像这个接口发送post请求,返回的信息中包含一个id=10
在这里插入图片描述

然后拿到这个id=10,放入json中,访问另一个接口,查询id=10的数据
在这里插入图片描述

然后在excel里把这两个接口准备好
在这里插入图片描述

接着就是在Util文件下新建一个.py文件,在这个python文件里面建立一个单态类,然后在这个类下面创建一个字典,所有从接口里提取出来的数据键值对都放在这个字典里,这也是为什么要创建一个单态类的原因。
在这里插入图片描述

然后我们访问第一个接口,就是希望拿到里面的id=10,所以在excel里预设这样一个表达式
在这里插入图片描述

然后在代码里处理id=$.id和返回报文这两个字符串,将响应报文和列名称assert_result作为参数传入函数内
在这里插入图片描述

补全这个函数,由于这是个单态类啊,直接就在下方globalVarible = Interfaces_test()定义一下这个单态类了,在其他函数中引用globalVarible即可在这里插入图片描述

    def deal(self,assert_result,res):
        # 因为除了id=$.id这一个表达式外,还可能有其他表达式,所以用;号隔开
        for part in assert_result.split(';'):
            # 此时的part为 id = $.id
            part = part.strip()
            key = part.split('=')[0].strip()
            # 此时 key的值为 id
            value = part.split('=')[1].strip()
            # 此时value的值为  $.id
            value = jsonpath.jsonpath(res,value)[0]
            # 还是跟之前一样,已经得到json表达式$.id,那么继续用jsonpath的方法在响应报文里找匹配字符串
            self.set_dict(key,value)

2.开始写测试用例

照着之前的那个用例依葫芦画瓢,先对第一个接口进行操作,成功拿到了id=10这组数据
在这里插入图片描述

既然已经拿到id=10这组数据了,我们接下来看第二个接口
首先在excel里做如下修改
在这里插入图片描述

我们接下来要做的就是在代码里拿到excel中的**{“id”😒{id}}**这个字符串,然后把这个字符串转变为{“id”:10}这样一个json数据,然后把json数据发送给第二个接口
还是在Util下新建一个公用方法,写入如下代码:
在这里插入图片描述


import re

# $.{id}
from Utils.GlobalVariableUtil import globalVarible

pattern = '\$\{(.*?)\}'

def replace_json(body):
    # 用findall来在body里查找符合正则表达式pattern规定的值
    # 然后返回一个集合,集合内可能有多个数据
    keys = re.findall(pattern,body)
    # 此时的key的值为id,只有一个值
    for key in keys:
        # 有了键,到单态类的字典里查找对应的值
        value = globalVarible.global_dict[key]
        print(str(value))
        body = body.replace('${'+key+'}',str(value))
        print(body)
    return body


if __name__ == '__main__':
    globalVarible.global_dict = {'id':10}
    replace_json('{"id":${id}}')

最后,再去调整一下测试用例:
在这里插入图片描述

first_line = get_row_values('Sheet2',1)
all_lines = get_all_rows('Sheet2')
# print(first_line)
# print(all_lines)

@pytest.mark.parametrize(first_line,all_lines)
def test_002(id,url,method,content_type,headers,parmas,body,assert_result,target_result,result):
    if assert_result:
        req = RequestUtil()
        res = req.request(url, method, headers, body, content_type)
        print(res)
        globalVarible.deal(assert_result,res)
        assert 'pass' == assert_res(target_result, res)
    else:
        body = replace_json(body)
        req = RequestUtil()
        res = req.request(url, method, headers, body, content_type)
        print(res)
        assert 'pass' == assert_res(target_result, res)

执行成功
在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSQ的测试日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值