pytest + yaml 框架 -22.validate 校验返回结果的几种方式

前言

validate 校验返回结果的几种方式总结

环境要求
Python 大于等于3.8版本,(低于python3.8版本不支持)
Pytest 大于等于 7.2.0

pip 安装插件, 最新版本v1.1.9

pip install pytest-yaml-yoyo

v1.1.9 版本做了以下优化

  • 1.validate 校验加了text 关键字获取全部body文本内容
  • 2.用例分层 api和 testcase 层 validate 校验优化,解决之前遗留的bug
  • 3.validate 校验方式更灵活,支持int类型校验字符长度和包含字符
  • 4.log 日志文件优化,只保留最近的5个日志文件

validate 校验

从response 对象属性取值可以是以下对象 [status_code, url, ok, headers, cookies, json, encoding, text]

其中status_code, url, ok, encoding, text 这几个对象可以直接取出

# 作者 上海-悠悠 微信:283340479
test_yoyo:
  name: get
  request:
    method: GET
    url: http://httpbin.org/get
  validate:
    - eq: [status_code, 200]
    - eq: [url, http://httpbin.org/get]
    - eq: [ok, True]
    - str_eq: [encoding, 'None']
    - contains: [text, args]

其中 text 是获取接口返回的全部文本,也就是r.text 获取到的文本内容

运行日志


2023-03-21 21:16:09 [INFO]: validate 校验内容-> [{'eq': ['status_code', 200]}, {'eq': ['url', 'http://httpbin.org/get']},
 {'eq': ['ok', True]}, {'str_eq': ['encoding', 'None']}, {'contains': ['text', 'args']}]
2023-03-21 21:16:09 [INFO]: validate 校验结果-> eq: [200, 200]
2023-03-21 21:16:09 [INFO]: validate 校验结果-> eq: [http://httpbin.org/get, http://httpbin.org/get]
2023-03-21 21:16:09 [INFO]: validate 校验结果-> eq: [True, True]
2023-03-21 21:16:09 [INFO]: validate 校验结果-> str_eq: [None, None]
2023-03-21 21:16:09 [INFO]: validate 校验结果-> contains: [{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.18.4",
    "X-Amzn-Trace-Id": "Root=1-6419ae16-35a5895d42d28afb50ec9390"
  },
  "origin": "104.168.170.139",
  "url": "http://httpbin.org/get"
}
, args]

校验 headers 和 cookies

headers 和 cookies 的校验可以通过jmespath 取值表达式,以 headers.xxcookies.xx 的方式取值

使用示例

# 作者 上海-悠悠 微信:283340479

test_yoyo:
  name: get
  request:
    method: GET
    url: http://httpbin.org/get
  validate:
    - eq: [headers."Content-Type", application/json]
    - eq: [cookies, {}]

因为取值的"Content-Type" 有特殊字符,jmespath 表达式取值的时候会报语法问题,用双引号包起来headers."Content-Type"

校验json类型的 body

返回的body 如果是json 格式,那么有两种取值语法

  • jsonpath 取值语法, 如:$.code, $..token
  • jmespath 取值语法,如: body.code

使用示例

# 作者 上海-悠悠 微信:283340479

test_yoyo:
  name: get
  request:
    method: GET
    url: http://httpbin.org/get
  validate:
    - eq: [body.url, http://httpbin.org/get]
    - eq: [body.headers.Host, httpbin.org]
    - eq: [$..Host, httpbin.org]

运行日志

2023-03-21 21:13:25 [INFO]: validate 校验内容-> [{'eq': ['body.url', 'http://httpbin.org/get']},
 {'eq': ['body.headers.Host', 'httpbin.org']}, {'eq': ['$..Host', 'httpbin.org']}]
2023-03-21 21:13:25 [INFO]: validate 校验结果-> eq: [http://httpbin.org/get, http://httpbin.org/get]
2023-03-21 21:13:25 [INFO]: validate 校验结果-> eq: [httpbin.org, httpbin.org]
2023-03-21 21:13:25 [INFO]: validate 校验结果-> eq: [httpbin.org, httpbin.org]

body 正则提取

有些返回的body不是json格式,可以支持正则提取,也就是我们常用的正则语法: xxx(.+?)xxxxxx(.*?)xxx

使用示例

# 作者 上海-悠悠 微信:283340479
test_yoyo:
  name: get
  request:
    method: GET
    url: http://httpbin.org/get
  validate:
    - eq: ['"url": "(.+?)"', "http://httpbin.org/get"]

运行日志

2023-03-21 21:19:49 [INFO]: validate 校验内容-> [{'eq': ['"url": "(.+?)"', 'http://httpbin.org/get']}]
2023-03-21 21:19:49 [INFO]: validate 校验结果-> eq: [http://httpbin.org/get, http://httpbin.org/get]

其它断言

一些数字类型的断言方式总结:
eq: 严格校验,字符串和数字类型
str_eq: 转字符串后判断相等
constains: 包含数字,可支持数字12345 包含 123
len_eq: 判断字符串或数字长度
gt: 判断数字大于

使用示例

# 作者 上海-悠悠 微信:283340479

test_assert:
-
  name: get
  request:
    method: GET
    url: http://httpbin.org/get
  validate:
    - eq: ['123', '123']
    - str_eq: [123, '123']
    - constains: [123, '12']
    - constains: ['123', '12']
    - constains: [['hello', 'world'], 'hello']
    - len_eq: [123, 3]
    - len_eq: ['123', 3]
    - len_eq: ['abc', 3]
    - gt: [123, 100]

validate 可以支持的校验方式

validate 可以支持的校验方式

comparator缩写功能
equal“eq”, “equals”, “equal”相等
less_than“lt”, “less_than”小于
less_or_equals“le”, “less_or_equals”小于或等于
greater_than“gt”, “greater_than”大于
greater_or_equals“ge”, “greater_or_equals”大于或等于
not_equal“ne”, “not_equal”不等于
string_equals“str_eq”, “string_equals”转字符串相等
length_equal“len_eq”, “length_equal”长度相等
length_greater_than“len_gt”,“length_greater_than”长度大于
length_greater_or_equals“len_ge”,“length_greater_or_equals”长度大于或等于
length_less_than“len_lt”, “length_less_than”长度小于
length_less_or_equals"“len_le”, “length_less_or_equals”长度小于或等于
containscheck_value 包含 expect_value
contained_byexpect_value 包含check_value
type_matchtype类型匹配
regex_match正则匹配re.match(expect_value, check_value)
startswith字符串以xx开头
endswith字符串以xx结尾
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值