一.继续完善测试用例
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)
执行成功