本文最后更新于 42 天前,其中的信息可能已经有所发展或是发生改变。
前几周参加了一个培训机构的三天训练营,在此期间接触到了关于自动化测试的部分概念。
DDT数据驱动
同一测试脚本使用不同的测试数据来反复执行,测试数据与测试脚本分离。
1.将测试数据分离,单独维护;
2.减少重复自动化用例的数量。
初级测试框架
excel文件获取数据
- 读取excel并转换为字典
#模拟接口测试用例.xls绝对路径与相对路径都可以
datas = xfile.read("模拟接口测试用例.xls").excel_to_dict(sheet=1)
读取数据的参数化
- pytest.mark.parametrize是一种实现参数化测试的方法,他需要两个参数argnames和argvalues
# case_info名字,datas是上方xfile在excel中获取的参数字典
@pytest.mark.parametrize("case_info",datas)
定义接口方法
- 定义一个方法,将接口路径、请求方式、URL参数、JSON参数、返回值 、分别设置为变量
def test_excute(case_info):
url = case_info["接口URL"]
if '$' in url:
url = Template(url).substitute(dic)
rs =requests.request(url=url,
method=case_info["请求方式"],
params=eval(case_info["URL参数"]),
data=eval(case_info["JSON参数"]))
提取参数
- 从读取的excel中判断该条接口用例的“提取参数”列是否为空,非空表示要从当前接口提取数据。
- 使用”$..提取参数“的方式,精确提取返回值里的值,并将其存储到dic数组中,以供之后的接口使用/依赖
if case_info["提取参数"]:
val = jsonpath.jsonpath(rs.json(),"$.."+case_info["提取参数"]) # $..token
dic[case_info["提取参数"]] = val[0]
异常断言
- 接口状态的断言,若不符合则直接抛出异常。
assert rs.status_code == case_info["预期状态码"]
字符串替换
- 字符串模板替换
Template :模板替换
规则 如下 : 字符串特殊字符 ${文字} 字典:{文字: xxxx}
特殊字符中 ${}内部的文字 与 字典的key 相同 , 就会自动拿value换掉 ${}
from string import Template
dic = {"name":"丢丢"}
字符串 = "你好,我是${name}"
print(字符串)
比较后的字符串 = Template(字符串).substitute(dic)
print(比较后的字符串)
执行结果:
扩展思考:
- 如何自动识别文档中有多少个用例并自动执行完毕?
@pytest 的 参数化机制 — 自动取值,data1.data2,data3 一直执行到全部用例完毕
学习阶段
(第一阶段)
根据请求的数据变化,所以,能访问不同项目,不同的接口!
把数据分离出去,txt,excel,mysql都可以,怎么读取? xfile
你要测哪个接口 测试多少个 都由excel里面的数据去决定! –DDT数据驱动测试 【传入的数据去决定你测试的覆盖范围】
(第二阶段)
DDT+pytest参数化
这个不李姐是啥意思,交给后面的我T-TT
(第三阶段)
关联接口怎么办?
我的理解是,关联接口指使用接口测试业务时,后面的接口传参需要前面接口的一个或多个返回值作为参数进行推送,比如下单接口需要登录接口的token。通过上述的知识点,将excel中的提取参数,使用代码提取后存放在“def{}”这样的公共字典里,类似于jmeter中的全局参数。如此便可实现关联接口。
简单的测试框架