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” 长度小于或等于
contains check_value 包含 expect_value
contained_by expect_value 包含check_value
type_match type类型匹配
regex_match 正则匹配re.match(expect_value, check_value)
startswith 字符串以xx开头
endswith 字符串以xx结尾

你可能感兴趣的:(playwright,python)