如何在⽤例之间传递值_如何优雅地使⽤httprunner进⾏接⼝测
原作者:xuyiwen007
原出处:CSDN
原⽂链接: blog.csdn/xu5478235 01/article/details/85862702
版权声明:本⽂为博主原创⽂章,转载请附上博⽂链接
⼀天,你的领导X要你对某接⼝做测试,你⼀听,接⼝测试,⾼⼤上。⽤什么做好呢?postman?jmeter?loadrunner?balabala。。。优秀的你,想到了⼀⼤堆⼯具,当然也包括⽤python写。为了凸显B格,你选择了python。新建⼀个a.py⽂件,然后⼀顿猛如虎的撸代码:
import requests
url = “******”
params = "******"
re = (url, params)
你家领导,⼀看,还⾏,提醒你少了断⾔,于是你加进去了
assertEqual (content.msg, "***")
你家领导可能是⽐较关⼼你,于是⼜丢了⼏个接⼝给你,你开始依葫芦画瓢,流⽔账代码搞起。完事后,你仔细想想总觉得不对,于是你将每个请求都封装起来,⼤概长这样:
def qingqiu_a():
url = "***"
...
def fangwen_b():
url = "***"
...
def shenmegui_c():
url = "***"
...
显然,你的领导是爱你的,某天他⼜丢给你⼏⼗个接⼝,然后希望你输出报告。你:“exm?”,改改改。于是你引⼊了unittest单元测试框架、HTMLTestRunner等等。
正打算将各个测试⽤例分类重新规整,你领导⼜来了。如果世界上有真爱这种东西存在的话,那你领导对你的爱便是了。
“我⼜从开发那⾥帮你要了100个接⼝过来测,开不开⼼?”
“你的脚本给我看下,这个是啥意思?可以在我那边运⾏吗?”
“你的脚本怎么这么多啊,好乱啊”
“这个接⼝我要做性能测试,还有这个、这个。。。”
“这⼏个接⼝是串联起来的,你处理下”
你⼏近崩溃,为什么,为什么不能简单点。
(脑补《演员》)
幸好,你并没有放弃,你在某个机缘巧合下发现了⼀个叫httprunner的测试框架,这个框架使⽤的是yaml格式的⽂本来描述脚本,只需⼀⾏命令即可进⾏接⼝测试。在连夜研究完这个框架后,你发出慨然长叹:“原来接⼝测试可以这么优雅的写啊!”
于是你将⼏百个接⼝丢进⼀个yaml⽂本⾥,执⾏了下⾯这条命令:
hrun api.yaml
刷刷刷,搞定,X吃惊的看着你,似乎在看⼀头变帅的猪
“这次咋这么快?平时光调试都得⼀两天。”
“测试报告不错!”
“数据也都校验了。”
“咦,这脚本简单,我都看得懂,可以可以,很强势!”
so,你是怎么使⽤httprunner的呢?
0,安装
安装好python3,直接pip install httprunner即可
hrun -V 查看版本,能看到版本信息,就代表安装成功
hrun -h 查看帮助信息
1,⽤例格式
通常⼀个脚本⽂件⾥⾯有如下模块:
config
test
test
即:全局配置、⽤例、⽤例
config模块⾥⾯定义的是整个⽂本测试集的变量,即全局变量
test模块⾥⾯定义的是具体接⼝请求,下⾯看个具体例⼦
2,举个例⼦
以某快递查询接⼝为例,新建⼀个yaml⽂件,命名为test_post_api.yaml
- config:
name: test kuaidi100 api
request:
base_url: www. kuaidi100
- test:
name: test kuaidi100 one
request:
url: /query
method: GET
params:
type: huitongkuaidi
postid: 350757858666
yaml格式类似于json,可以看成是优雅的json。yaml中,跟python⼀样,也是空格缩进表⽰同⼀层级,不过没有python那么严格,只要缩进空格数⼀样就是同⼀级,“-”python读取出来是list,“#”⽤来注释,更多语法可以去官⽹学习。
config模块python怎么读取json文件
name 本⽤例及名称
request 请求全局变量,包括base_url(公共host)、headers等
base_url 全局公共host,也可以不定义,⽤例中写全url即可
以上全局配置,除了name,其他都是⾮必要的,根据需要添加。
test模块
name 本条测试⽤例的名字
request 请求体
url 请求的路径,由于全局变量已经定义好host,这⾥就直接填写后⾯的路由即可
method 请求⽅式
params 请求参数
⽰例是某快递查询接⼝,脚本初步写好,接下来开始测试吧,怎么测试脚本?
打开cmd,进⼊到该⽂件⽬录,执⾏命令hrun test_post_api.yaml回车即可。
成功,cool,可以看到⼀条⽤例测试通过,⽽且还在脚本所在⽬录⽣成了report⽂件夹,⽣成的测试报告就放在⾥⾯,报告名字为测试时间戳。报告长这样,还是蛮清爽的。
点击log,可以查看详细⽇志
3,断⾔
虽然运⾏成功,但我们⽆法判断请求的结果与我们的预期是否⼀致。这个时候就需要断⾔。httprunner中断⾔很简单,通过在⽤例⾥⾯增加validate参数实现,如下:
那么怎么知道如何定义被断⾔的数据呢?即上图中的ssage等。
浏览器执⾏该接⼝,其返回值是字典(如下,这些字典数据存在content变量⾥⾯),可以直接通过content后⾯接“.key”获取value值,再判断与我们给出的值是否相等,以此判断⽤例是否通过。如:ssage断⾔值设置为“ok”,如果其对应的value等
于“ok”,就表⽰通过。
{"message":"ok","nu":"350757858666","ischeck":"1","condition":"F00","com":"huitongkuaidi","status":"200"......
加好想要的断⾔后,再次执⾏⽤例,打开报告查看⽇志,可以看到,⽇志⾥⾯清楚的记录了所有的断⾔结果。
4,参数传递
在做接⼝测试时,经常需要将上⼀个接⼝返回的结果,传⼊到下⼀个接⼝中当着参数,httprunner中使⽤extration参数来进⾏参数的传递。由于演⽰接⼝只有⼀个,且接⼝返回值⾥⾯有运单号,就直接拷贝了上⾯的⽤例作为接受参数的⽤例。故可以将第⼀个⽤例返回值中的运单号提取出来,传⼊第⼆个⽤例当做参数,只需在前⾯加$就可以引⽤该参数,look
- config:
name: test kuaidi100 api
# parameters:
# - user_id: [1001, 1002, 1003, 1004]
request:
base_url: www. kuaidi100
- test:
name: test kuaidi100 one
request:
url: /query
method: GET
params:
type: huitongkuaidi
postid: 350757858666
validate:
- eq: [status_code, 200]
- eq: [ssage, "ok"]
- eq: [content, "huitongkuaidi"]
- eq: [content.nu, "350757858666"]
extract:
- postid: content.nu
- test:
name: test kuaidi100 two
request:
url: /query
method: GET
params:
type: huitongkuaidi
postid: $postid
validate:
- eq: [status_code, 200]
- eq: [ssage, "ok"]
- eq: [content, "huitongkuaidi"]
- eq: [content.nu, "350757858666"]
执⾏测试,通过,cool:
5,脚本运⾏⽅式
上⾯也提到了,单个脚本可以使⽤:hrun ***.yaml
当要同时运⾏多个脚本⽂件的时候,后⾯接多个⽂件:hrun a.yaml b.yaml c.yaml 当然,也可以直接指定⽂件夹,运⾏⽂件下所有脚本:hrun ***test
6,参数化

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。