httprunner+pytest+allure+Jenkins接口自动化(一)

在这之前搞了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)。

--------------------------------------------------------------------------------------------------------------------------------

后面持续更新,在使用过程中遇到的问题都会整理并记录下来

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值