extract提取参数
基于参数提取机制实现响应结果字段提取和参数关联
在实际业务场景中,很多时候存在参数关联的情况,即当前接口请求参数来自于之前接口的响应结果。
例如,通过手机号登录的场景中,登录接口请求参数需要带上服务端预先返回的短信验证码;如果缺少这个参数关联操作,接口调用将会失败。
目前,HttpRunner 支持 2 种响应结果字段提取方式。
提取的参数变量类似于 session 参数,作用域为当前步骤及之后的步骤,引用方式与普通的变量一致。
jmespath 表达式
若响应结果为 JSON 结构,支持采用 jmespath 表达式进行参数提取。
jmespath 是一种 JSON 查询语言,可以使用非常灵活且强大的表达式查询 JSON 数据结构中的字段,并返回符合条件的数据。
针对 jmespath 官网中的示例:
{
"locations":[
{"name":"Seattle","state":"WA"},
{"name":"New York","state":"NY"},
{"name":"Bellevue","state":"WA"},
{"name":"Olympia","state":"WA"}
]
}
- 查询所有城市名称:locations[*].name
- 查询第二个城市名称:locations[1].name => “New York”
- 查询最后一个州名:locations[-1].state => “WA” == locations[3].state
HttpRunner 完全继承了 jmespath 的强大能力,只需要重点注意两点:
1、extract 的对象仅有 5 种类型:
- status_code:提取响应状态码,例如 200、404
- proto:提取协议类型,例如 “HTTP/2.0”、“HTTP/1.1”
- headers:从响应 headers 中提取字段,例如 headers.name
- cookies:从响应 cookies 中提取字段,例如 cookies.Token
- body/content/json:从响应 body 中提取字段,例如 body.args.foo1 响应体
2、如果表达式中存在 - 的情况,那么需要加引号处理。
例如 headers."Content-Type"
"teststeps":[
{"name":"",
"variables":{"name":"demo"},
"request":
{"method":"POST",
"url":"https://www.httpbin.org",
"params":{},
"headers":{"name":"$name","Content-Type":"text/plain"},
"body":""
},
"validate":[],
"extract":{"name":"body.headers.Name"}
}
]
正则表达式(regex)
若响应结果为 text/html 格式,支持采用正则表达式的方式提取目标参数。
例如响应的 body 为:
<html><title>参数提取(extract) | HttpRunner</title></html>
如果我们想提取页面的 title 字段,就可以这样做:<title>(.*)</title>
即在提取表达式中指定目标参数的左右边界,然后将目标参数替换为 (.*);这样我们就能将正则匹配到的值赋值给参数变量了。
"teststeps":[{"name":"","variables":{"name":"demo"},"request":{"method":"GET","url":"https://www.httpbin.org","params":{},"headers":{"name":"$name","Content-Type":"text/plain"}},"validate":[],"extract":{"title":"<title>(.*)</title>"}}]