【python】httprunner接口自动化框架
httprunner接口自动化框架
一、为什么选择httprunner?
- HttpRunner是一个开源的 API 测试工具环境搭建,相比于其它 API 测试工具,HttpRunner 最大的不同在于设计理念:
- 约定大于配置:测试用例是标准结构化的,格式统一,方便协作和维护;
- 标准开放:基于开放的标准,支持HAR/Postman/Swagger等工具对接,轻松实现用例生成和转换;
- 一次投入多维复用:一套脚本可同时支持接口自动化测试、性能测试;
- 追求不重复造轮子,追求投入产出比;
- Httprunner和其他开源框架相比,我们只需在yaml文件维护测试用例即可,不需要代码要求,但是需要严格遵循yanl格式编写,否则在后续不好排查错误,这也是httprunner的一个缺点;
- 目前市面上接口工具多,学习成本高,团队协作较困难,对语言能力有一定要求,门槛较高;
二、环境搭建(Python安装)
1、python版本:2.7/3.7及以上版本,建议3.7及以上版本
2、验证安装是否成功
- 打开cmd命令行 输入python,如果能进入python命令模式就证明成功了
3、安装httprunner第三方库
pip install httprunner==2.5.7 如果官网无法下载就加国内镜像 -i https://pypi.doubanio.com/simple
4、查看命令行指令(掌握几个常用即可)
- 创建一个项目,可以在命令行查看httprunner帮助
- httprunner -h 或者 hrun -h
5、创建脚手架
- 创建项目:hrun –startproject demo
6、安装第三方依赖()
- 可以在根目录下建个requirements.txt文件,需要安装的python依赖都在这个文件里面,进入到目录下,执行以下命令进行安装:
pip install –r requirements2.txt
三、框架结构
1、目录结构
分层思想:
- api定义层:最底下的一层是api的定义层,最底
- testcase层:测试用例层,调用定义层的内容,中间
- testsuite:测试套件层,把用例装起来,最上
api目录:存放描述api信息的yaml文件
- 特别注意:yml文件需遵循严格的缩进,缩进多少格无所谓,只要保证同一层级的key对齐即可
字段解释:
- name:对api进行描述
- variables:把参数作为变量从外部传给api,可以将变量的参数都定义在variables
- request:这个字段下放的都是api的基本信息如
- url(请求地址),
- method(请求方法),
- headers(请求头),
- data/params/json/file (请求参数)
一般接口有3种方式的请求参数
- 1.params字段传参:
- 以key,value键值对方式放在url后面的参数用params字段去定义
- 2.json字段传参:
- 放在body以json格式参数的用json字段去定义
- 3.c.data字段传参:
- 放在body非json格式的参数用data字段去定义,如headers中
content-type=application/x-www-form-urlencoded
参数引用:引用符:$
- variables:api的ymal文件下:如果我们要把参数作为变量从外部传给api,那就把作为变量的参数都定义在variables字段下,如下图中的loginPara就可以被其它任何地方引用。
- validate:校验字段,需要校验的数据都写在这个字段下
1.2 testcases目录:存放描述测试用例的yaml文件
- config:指这条用例的配置信息,用例的一些配置信息可以写在这个字段下面,比如:
- name(必须的): 这条用例的名字,
- base_url(可选择的): 接口的host地址,一般写域名
- variables(可选择的): 这条用例的一些变量,保存的变量,可以被下面引用
- verify(可选,但默认false):指定是否验证服务器的TLS证书。如果想要记录testcase中的http数据特别有用。如果不设置或者设置为true则会产生SSLError错误。
- export(可选择的,必须会):提取testcase的session变量。测试用例是为黑盒,config中的的variables视为输入,export为输出。特别是,当该testcase中的某个输出作为下一个testcase中的输入的时候特别有用。参数传递用的,
- output(可选择的):为了把变量暴露出来,打印日志时看的更清楚(比如说你提取了token,可以打印一下这个token看看自己有没有提取成功)
teststeps::指用例中的步骤,每一步就是调用一个api,test下面配置的字段就是这个步骤中涉及的字段,比如:
name:步骤描述
api: 指定调用的api路径文件。基于根目录的相对路径
testcase: 指定testcase的路径文件
extract: 提取响应中的字段(比如这个接口返回中的某个字段作为下 一个接口的参数),可以提取的内容包含以下内容:
- atus_code、cookies、elapsed(响应时间)、headers、content、 text、 json、 encoding、ok、 reason、url
variables:如果要把参数作为变量从外部传给api,那就把作为变量的 参数都定义在variables字段下,设置变量供下面用
validate:校验字段,需要校验的数据都写在这个字段下,就是断言,下面会讲断言用法
⑦ 碰到列表的时候,用list.0去提取。点0是表示提取索引下标为0的列表进行提取
- eq: [ json.data.list.0.couponName, "自动化测试兑换" ]
testsuites目录:存放用例集的yaml文件
字段解释:
- testcases:指这条用例集,要执行的用例都现在这个字段下面
- testcase:用例的路径字段
- parameters:参数化字段,外部传的参给用例,都可以写在这个字段下面,测试数据中的参数可以写在这下面
用例编写
- 参数引用:在yaml文件中用“$”符号实现对参数的引用 比如:
- 2.2函数引用:在yaml文件中通过“${}”实现对函数的引用,比如:
- 所有函数都定义在debugtalk.py文件中,
- 如果在测试中有需要写代码处理的,就可以把代码写在debugtalk.py文件中,然后用例中就可以直接引用了。
运行接口
方式一:
- 使用命令行调试:hrun .\testsuites\xx测试集.yml
- 如果要打印运行详细日志,在命令后面加上–log-level
hrun .\testsuites\xx测试集.yml –log-level debug
方式二:
- 在工程跟目录下有一个runtest.py文件,里面指定要执行的文件路径就可以运用用例了,右键——Run rentest 就可以执行,执行后会在report目录下生成测试报告
- 通过
os.system
可以调用cmd命令,方便自己调试用。 - 注意一下,cmd命令的斜杠是反斜杠,注意斜杠加t需要双斜杠,不然会编译错误
测试报告
报告保存在report目录下,每次执行完都会生成测试报告,用浏览器即可打开进行查看
一些特殊接口—图片上传接口
用抓包软件看到接口传参如图所示
注意:requests库会自动添加这个元素 {“Content-Type”:”multipart/form-data”} ;加了反而会报错,从而导致请求不成功。
在前端允许和支持上传的所有格式文件中,当选择不同格式文件时对接口发起请求时,
Form Data会自动识别文件的Content-Type【根据传入的文件格式自动解析为headers中的Content-Type】以及Content-Disposition【该字段中包括接口的传参类型(例如下图的form-data),传入文件名(例如下图的filename)等】。
所以参数我们可以如图中files字段那样定义
测试数据
data目录下就是存放测试数据文件,我们需要上传文件或图片的数据可以放在这个目录下,或api中的一些参数数据可以以csv文件格式存放在这个目录下
参数化:
对测试数据的引用
- 在用例中怎么使用测试数据文件中的数据呢,
- 框架中有个读取数据文件的函数P,
- 引用时参入数据文件地址作为参数 ${P(data/对应的csv.csv)} 对应的csv.csv 文件内容如图,
- 注意:只能在testsuite中对测试数据的引用,测试数据中的参数可以 字段名-字段名的方式进行获取。qudaologin.csv中有几条记录,这样用例就会执行几次
- 再说一遍,只能在testsuite里面引用csv参数,
- 在testcase的下面加一个字段parameters:下面再接需要被传参的字段名
- csv的参数有多少行,对应的用例就会被执行多少次
直接赋值参数
- 多个关联参数,可以按照下图中的方式对用例参数进行赋值,进行该配置后,测试用例在运行时就会对 name,result实现数据驱动,即分别运行 3次测试,并且保证参数值总是成对使用。
单个参数关联
- 单个参数可以直接就可以按照如下方式进行配置,即分别使用 [1,2,3,4,5,6,7] 7个值运行测试用例。
环境变量:
- 工程目录下有个.env文件,里面可以配置测试环境的地址,如图所示
- 框架有个获取环境文件的函数ENV, 调用时可以引用函数获取变量${ENV(TESTENV)}
9. 断言校验
框架中已实现如下校验
9.2自定义校验函数
对于自定义的校验函数,需要遵循三个规则:
- 自定义校验函数需放置到debugtalk.py中
- 参数有两个:第一个为原始数据,第二个为原始数据经过运算后得到的预期结果值
- 在校验函数中通过assert将实际运算结果与预期结果值进行比较
如图:在debugtalk.py文件中定义校验函数
然后在用例校验的时候引用这个校验函数
9.3修改框架校验函数:不建议
- 在httprunner>builtin>comparator新增自定义校验,然后在parser文件中定义校验缩写方法
9.4校验支持正则校验:
9.5数据库校验:
框架实现了对数据库的查询,操作数据库的原理是根据输入的SQL语句 过滤出要操作的tableName, 然后去配置文件中找到对应得tableName所在的地址和库进行连接和操作,操作数据库需要做如下配置,在跟目录下有个database.ini文件,在里面配置数据库相关信息