httprunner 4.x学习 - 4.提取返回结果与校验(extract, validate)

发布时间 2023-05-05 21:59:05作者: 上海-悠悠

前言

HttpRunner4.x 支持 2 种响应结果字段提取方式:jmespath 表达式和 正则表达式(regex)

  • 响应结果为 JSON 结构,支持采用 jmespath 表达式进行参数提取。jmespath表达式,有关更多详细信息,请参考JMESPath教程https://jmespath.org/tutorial.html
  • 返回的非json格式,可以用正则表达式(regex) 提取

extract 提取返回结果

extract 的对象仅有 5 种类型:

  • status_code:提取响应状态码,例如 200、404
  • proto:提取协议类型,例如 “HTTP/2.0”、“HTTP/1.1”
  • headers:从响应 headers 中提取字段,例如 headers.name
  • cookies:从响应 cookies 中提取字段,例如 cookies.Token
  • body:从响应 body 中提取字段,例如 body.args.foo1

如果表达式中存在 - 的情况,那么需要加引号处理。

headers."Content-Type"

使用示例

config:
  name: 引用变量
  variables:
    username: test123

teststeps:
-
  name: post
  variables:
    username: test456
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: ${username}
      password: "123456"
  extract:
    url: body.url
    origin: body.origin
    agent: headers."Content-Type"
  validate:
    - eq: [status_code, 200]

使用hrp run 命令行运行

hrp run xuexi/test_extract.yml --gen-html-report

运行日志可以看到提取的结果

3:53PM INF run step end exportVars={"agent":"application/json","origin":"183.193.27.78","url":"http://httpbin.org/post"} step=post succ
ess=true type=request
3:53PM INF run testcase end testcase="引用变量"
3:53PM INF create folder path="results\\20230505155322"
3:53PM INF generate HTML report path="results\\20230505155322\\report.html"

正则表达式(regex)

响应结果为 JSON 结构,支持采用 jmespath 表达式进行参数提取。返回的非json格式,可以用正则表达式(regex) 提取.

如下示例响应结果为 text/html 格式

config:
  name: 引用变量
  variables:
    username: test123

teststeps:
-
  name: blog
  request:
    method: GET
    url: https://www.cnblogs.com/yoyoketang/
  extract:
    title: "<title>(.*)</title>"
  validate:
    - eq: [status_code, 200]
    - eq: ["${title}", 200]

(相对于httprunner3.x 版本,新增了正则表达式提取结果,这点弥补了3.x 版本取值上的缺陷)

validate 校验结果

使用jmespath提取 JSON 响应正文(text/html 格式用正则表达式提取)并使用预期值进行验证。

  • 提取结果:jmespath 表达式或正则表达式提取,更多细节参考JMESPath 教程
  • 预期值:这里也可以使用指定的预期值、变量或函数引用

校验示例

config:
  name: 校验结果

teststeps:
-
  name: post
  variables:
    username: test456
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: ${username}
      password: "123456"
  validate:
    - eq: [status_code, 200]
    - eq: [body.url, "http://httpbin.org/post"]
    - eq: [body.origin, "183.193.27.78"]
    - eq: [headers."Content-Type", "application/json"]

validate 也可以支持引用提取的结果

config:
  name: 校验结果

teststeps:
-
  name: post
  variables:
    username: test456
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: ${username}
      password: "123456"
  extract:
    url: body.url
    origin: body.origin
    type: headers."Content-Type"
  validate:
    - eq: [status_code, 200]
    - eq: ["${url}", "http://httpbin.org/post"]
    - eq: ["${origin}", "183.193.27.78"]
    - eq: ["${type}", "application/json"]