Jmeter之JSON提取器应用
在测试接口的时候,有时会碰到这样的业务,一个业务的接口测试必须要先登录。
换句话说,业务的实现需要先登录,怎么实现呢?
还有很多别的业务
1,接口关联
也称为关联参数。在应用业务接口中,完成一个业务功能时,有时候一个接口可能不满足业务的整个流程逻辑,需要多个接口配合使用。
简单的案例如:B接口的成功调用依赖于A接口,需要在A接口的响应数据(response)中拿到需要的字段,传递给B接口作为B接口请求参数,拿到后续响应的响应数据。
2,数据验证
- 这里的数据验证指的是对响应结果进行数据的校验
- 接口自动化测试中,对于简单的响应结果(json),可以直接和期望结果进行比对,判断是否完全相等即可。如
json {"status":1,"msg":"登录成功"}
- 对于格式较复杂,尤其部分数据存在不确定性、会根据实际情况变化的响应结果,简单的判断是否完全相等(断言)通常会失败。如:
json {"status":1,"code":"10001","data":[{"id":1,"investId":"1","createTime":"2018-04-27 12:24:01","terms":"1","unfinishedInterest":"1.0","unfinishedPrincipal":"0","repaymentDate":"2018-05-27 12:24:01","actualRepaymentDate":null,"status":"0"},{"id":2,"investId":"1","createTime":"2018-04-27 12:24:01","terms":"2","unfinishedInterest":"1.0","unfinishedPrincipal":"0","repaymentDate":"2018-06-27 12:24:01","actualRepaymentDate":null,"status":"0"},{"id":3,"investId":"1","createTime":"2018-04-27 12:24:01","terms":"3","unfinishedInterest":"1.0","unfinishedPrincipal":"100.00","repaymentDate":"2018-07-27 12:24:01","actualRepaymentDate":null,"status":"0"}],"msg":"获取信息成功"}
上面的json结构嵌套了很多信息,完整的匹配几乎不可能成功。比如其中的createTime信息,根据执行接口测试用例的时间每次都不一样。同时这个时间是响应结果中较为次要的信息,在进行接口自动化测试时,是可以选择被忽略的。 - 我们需要某种简单的方法,能够从json中提取出我们真正关注的信息(通常也被称为关键信息)。如提取出status的值为1,data数组中每个对象的investId都为1,data中第三个对象的unfinishedPrincipal值为100.00,只要这三个关键信息校验通过,我们就认为响应结果没有问题。
解决方案
JsonPath可以完美解决上面的痛点。通过JsonPath可以从多层嵌套的Json中解析出所需要的值。
废话不多说了,直接上案例,帮助大家理解如何操作。
先简单列出登录的接口文档信息和学生金币充值的接口文档信息。
1,登录
登录接口
简要描述:
- 登录接口
请求URL:
http://api.nnzhp.cn/api/user/login
请求方式:
- post
参数:
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
username | 是 | string | 用户名 |
passwd | 是 | string | 密码 |
登陆用户名:niuhanyang
密码:aA123456
返回示例
{
"error_code": 0,
"login_info": {
"userId": 1,
"sign": "d58e3582afa99040e27b92b13c8f2280",
"login_time": "20171207113501"
}
}
返回参数说明
参数名 | 类型 | 说明 |
---|---|---|
error_code | int | 错误编码,0为操作成功 |
login_info | object | 登录对象信息 |
userId | int | 用户id |
sign | string | 签名 |
login_time | string | 登录时间 |
2,学生金币充值
学生金币充值
学生金币充值
简要描述:
- 学生金币充值接口,这个接口是为了讲添加cookie以及身份验证的
请求URL:
http://api.nnzhp.cn/api/user/gold_add
请求方式:
- post
参数:
该接口有权限验证,需要admin用户才可以做操作,需要添加cookie
cookie中key为登录的用户名,value从登录接口中获取,登陆成功之后会返回sign
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
stu_id | 是 | int | 学生id |
gold | 是 | int | 金币数量 |
返回示例
{
"error_code": 0,
"msg":"充值成功!"
}
返回参数说明
参数名 | 类型 | 说明 |
---|---|---|
error_code | int | 错误编码,0为操作成功 |
msg | string | 提示信息 |
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
二:业务场景分析:
现在的业务需求是给学生充值金币,但是需要先登录。
登录的用户名已经给出了,但是其中的sign需要登录成功后才会返回。
这个返回值sign作为第二个接口的入参数据。所以我们的任务就很明确了。
先登录成功,再获取到sign,
1
2
3
4
5
6
以上操作步骤就是我的思路,如有不足,欢迎大家指正。
推荐学习链接:
http://www.lemfix.com/topics/63
https://www.cnblogs.com/tudou-22/p/12579575.html
这两个链接都是一个培训班的公开资料,不是推荐大家报名哈。
我主要是看到他们写的内容对自己有启发意义,觉得写的好。
其实接口测试我们自学也是可以的。