在这之前搞了postman+GitHub+Jenkins+email +html report接口自动化,现在换httprunner方案。
【本地环境】
工作电脑是Windows,在github上下载Windows压缩包安装即可。
下载的是这个:hrp-v4.3.0-windows-amd64.tar.gz
GitHub地址:Releases · httprunner/httprunner · GitHub
安装完成后本地可以使用hrp的相关命令。
【创建项目】
在命令行窗口中创建httprunner项目,我创建的是python项目:
hrp startproject demo --py
创建过程可以指定目录或者在指定目录下创建,名称可以自己取,demo只是举个例子。
【编写脚本】
刚开始写的时候无从下手,最好的方法是用hrp convert 将har文件转换成python脚本,代码结构一目了然,后面就知道怎么写了,har文件用Charles导出。同理,想写yaml或json格式的脚本也可以进行相应的转换。
hrp convert gz_api_auto/har/gz_login.har --to-pytest --output-dir gz_api_auto/testcases
转换完成后会同时生成py和json两个文件:
用pycharm打开生成的httprunner项目,打开刚才转换的py文件,提示没有httprunner安装包时,安装即可:
通过观察示例中的脚本发现,Config和Step提供的方法都可以用.pycharm点提示出来:
config用来配置一些基本信息,例如:
.variables(),用来声明接口调用过程中的公用参数,当切换环境时可以和base_url一同修改;
.base_url(),在切换环境或切换域名时只要修改这一处即可;
.verify(),这是requests.post中固有的参数;
.export(),用来声明结果调用过程中需要传递的参数,例如,user id、session id、token等
teststeps是具体调用接口的地方了,每个Step就是对接口的一次调用,我们写的接口测试用例和接口自动化的地方就在这了。httprunner最大的特点也在这里,一个接口的调用是通过链式调用完成的,在这个过程中只需要引用需要的方法并传递相应的参数就行了。在这里没有对数据的处理,这样就显得很清晰。数据的处理都放在debugtalk.py中,定义好之后,在Step中调用即可。如果需要复杂的断言也在debugtalk.py中定义相应的辅助函数,在Step中调用即可。
teststeps = [
Step(
RunRequest("登录接口")
.post("/v1/user/login")
.with_params(
**{"t": "${gz_timestamp()}", "uuid": "${gz_uuid()}"}
)
.with_headers(
**gz_headers()
)
.with_data(
{
"countryAbbr": "$countryAbbr",
"countryCode": "$countryCode",
"email": "$email",
"pwd": "${gz_md5($pwd)}",
"region": "$region",
"type": "$type",
}
)
.extract()
.with_jmespath("body.data.sid", "sid") # 获取sid
.with_jmespath("body.data.uid", "uid") # 获取uid
.validate()
.assert_equal("status_code", 200, "断言http状态code")
.assert_equal(
'headers."Content-Type"',
"application/json; charset=utf-8",
"断言返回头的Content-Type"
)
.assert_equal("body.errmsg", "成功", "断言errmsg")
.assert_equal("body.errno", 0, "断言errno")
),
]
.post(),请求地址的相对路径;
.with_params(),请求地址中的query部分,即?后面的部分,一般是时间戳或唯一标识等;
.with_headers(),我把header放在debugtalk.py中,作为公共头使用,如有调整,只需要修改一处即可;
.with_data(),body部分
.wctract()he .with_jmspath()成对出现,可以多次提取,但记住引用顺序
【注意点】
1、hrp中对变量的引用有两种形式,分别是$abc和${abc},看官方文档的描述,这两种引用基本没有去比,只有在特殊情况下,使用${abc}即可,但实际使用过程中这两种形式是有区别的,不是通用的,例如:gz_md5是debugtalk.py中的函数,如果写成以下的形式是不能执行的:
"pwd": "${gz_md5(${pwd})}",
会将其解析为:"pwd": "${gz_md5(xxxx)}",
正确的写法是:"pwd": "${gz_md5($pwd)}",不带{}的,
所以后续对变量的调用我统一使用$abc的形式。
2、我把header放到了debugtalk.py中做成辅助函数,在Step中调用时不能按照${gz_headers()}的方式调用,只能写成.with_headers(**gz_headers())。
【其他】
httprunner学习:
1、官方文档:🚀 快速上手 | HttpRunner。
2、使用实践:HttpRunner V3.x 从入门到精通 - 尘世风 - 博客园 (基于hrp3.x,有些地方不适用4.x,具体参考官文档,例如hrp convert)。
--------------------------------------------------------------------------------------------------------------------------------
后面持续更新,在使用过程中遇到的问题都会整理并记录下来