一、数据准备
此处准备了一个简单的Excel数据文档。
存放项目目录为:
二、具体步骤及代码
1、关键字封装
将get、post等常用行为进行二次封装。
代码(api_key.py)如下:
import allure
import json
import jsonpath
import requests
# 定义一个关键字类
class ApiKey:
# 将get请求行为进行封装
@allure.step("发送get请求")
def get(self, url, params=None, **kwargs):
return requests.get(url=url, params=params, **kwargs)
# 将post请求行为进行封装
@allure.step("发送post请求")
def post(self, url, data=None, **kwargs):
return requests.post(url=url, data=data, **kwargs)
# 由于接口之间可能相互关联,因此下一个接口需要上一个接口的某个返回值,此处采用jsonpath对上一个接口返回的值进行定位并取值
@allure.step("获取返回结果字典值")
def get_text(self, data, key):
# json数据转换为字典
json_data = json.loads(data)
# jsonpath取值
value = jsonpath.jsonpath(json_data, '$..{0}'.format(key))
return value[0]
- 其中引用allure.step()装饰器进行步骤详细描述,使测试报告更加详细。
- 使用jsonpath对接口的返回值进行取值。
2、Excel数据驱动
读取文档内容,判断文档内容是否有值进行调用传参。
代码(test_excel_read02.py)如下:
import os
import allure
import openpyxl
import pytest
from api_keyword.api_key import ApiKey
# excel用例的读取与执行
def test01():
# 读取表格
excel = openpyxl.load_workbook('../case/api_cases.xlsx')
# 读取sheet页
sheet = excel['Sheet1']
# 初始化工具类
ak = ApiKey()
# 读取excel内容,实现文件驱动自动化执行
for value in sheet.values:
# 判断当前行第一列的值是否是数字编号
if type(value[0]) is int:
# 用例标题
title = value[10]
# 请求参数
data = value[5]
# 校验字段
assert_value = value[7]
# 预期结果
expect_value = value[8]
'''判断是否存在请求头'''
# 存在请求头
if value[4]:
'''判断是否存在请求参数'''
# 存在请求参数
if value[5]:
dict_data = {
'url': value[1] + value[2],
# eval:将字符串str当做有效的表达式来求值并返回计算结果,此处直接给headers一个字典
'headers': eval(value[4]),
# 参数类型
value[6]: eval(data)
}
# 不存在请求参数
else:
dict_data = {
'url': value[1] + value[2],
# eval:将字符串str当做有效的表达式来求值并返回计算结果,此处直接给headers一个字典
'headers': eval(value[4]),
}
# 不存在请求头
else:
'''判断是否存在请求参数'''
# 存在请求参数
if value[5]:
dict_data = {
'url': value[1] + value[2],
# 参数类型
value[6]: eval(data)
}
# 不存在请求参数
else:
dict_data = {
'url': value[1] + value[2]
}
with allure.step(title):
# 进行请求
# getattr(对象,属性,赋值)在属性不存在时可以直接赋值
res = getattr(ak, value[3])(**dict_data)
"""
常规的参数传递:
requests.get(url="",:params="",headers="")
如果接口封装时,参数做了**kwargs,可以直接通过字典传递
"""
try:
result = ak.get_text(res.text, assert_value)
print(result == expect_value)
except:
print("==========实际结果==========")
print("请求参数有误,请检查")
if __name__ == '__main__':
pytest.main(['-v',
'--alluredir', './result', '--clean-alluredir'])
os.system('allure serve result')
3、报告结果
三、代码下载地址
链接:https://pan.baidu.com/s/1YZnsyJqRENY05ImtOGxr0w
提取码:q21d
–来自百度网盘超级会员V2的分享