前言
校驗接口返回結果,我們習慣校驗實際結果和期望結果相等,如果只是部分相等可以用contains包含校驗
校驗包含
先看下httprunner/builtin/comparators.py 關於 contains 和 contained_by 函數定義
- check_value 是需要校驗的返回結果
- expect_value 是期望結果,可以是這幾種類型:list, tuple, dict, basestring
def contains(check_value: Any, expect_value: Any, message: Text = ""):
assert isinstance(
check_value, (list, tuple, dict, str, bytes)
), "expect_value should be list/tuple/dict/str/bytes type"
assert expect_value in check_value, message
def contained_by(check_value: Any, expect_value: Any, message: Text = ""):
assert isinstance(
check_value, (list, tuple, dict, str, bytes)
), "expect_value should be list/tuple/dict/str/bytes type"
assert check_value in expect_value, message
使用示例
登錄結果返回
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
{
"code":0,
"msg":"login success!",
"username":"test1",
"token":"2a05f8e450d590f4ea3aba66294a26ec3fe8e0cf"
}
校驗 msg 包含 success! 字符串
validate:
- eq: [status_code, 200]
- contains: [body.msg, success!]
如果code返回的結果有多種情況,可能為0,也可以為200,這2種情況但是可以的,於是可以用 contained_by 被包含在[0, 200]
validate:
- eq: [status_code, 200]
- contains: [body.msg, success!]
- contained_by: [body.code, [0, 200]]
對應pytest代碼
.validate()
.assert_equal("status_code", 200)
.assert_contains("body.msg", "success!")
.assert_contained_by("body.code", [0, 200])
但是會拋出異常:
E httprunner.exceptions.ValidationFailure: assert body.code contained_by [0, 200](list) ==> fail
E check_item: body.code
E check_value: 0(int)
E assert_method: contained_by
E expect_value: [0, 200](list)
E message: expect_value should be list/tuple/dict/str/bytes type
報錯說 expect_value 必須是 list/tuple/dict/str/bytes 類型,但確實是給的list 類型[0, 200]
這是因為httprunner3.1.4版本的一個bug,把上面源碼里面的contained_by函數check_value改成expect_value,這個bug就可以修復
def contained_by(check_value: Any, expect_value: Any, message: Text = ""):
assert isinstance(
expect_value, (list, tuple, dict, str, bytes)
), "expect_value should be list/tuple/dict/str/bytes type"
assert check_value in expect_value, message
(備注:此問題在httprunner 3.1.5版本已修復,更新時間2021年6月27號)
startswith 和 endswith
校驗字符串以什么和以什么結果
- startswith 字符串以expect_value開頭
- endswith 字符串以expect_value結尾
def startswith(check_value: Any, expect_value: Any, message: Text = ""):
assert str(check_value).startswith(str(expect_value)), message
def endswith(check_value: Text, expect_value: Any, message: Text = ""):
assert str(check_value).endswith(str(expect_value)), message
使用示例
validate:
- eq: [status_code, 200]
- startswith: [body.msg, login]
- endswith: [body.msg, success!]
pytest 示例
.validate()
.assert_equal("status_code", 200)
.assert_startswith("body.msg", "login")
.assert_endswith("body.msg", "success!")
