httprunner 3.x学习19 - 从返回头部headers取值Content-Type (报错已解决:Bad jmespath expression: Unknown token '-')

前言

httprunner 3.x 取值是用 jmespath 表达式,当从头部取值Content-Type时,有特殊字符 -,会报错
jmespath.exceptions.LexerError: Bad jmespath expression: Unknown token '-': headers.Content-Type

使用示例

从返回的headers提取Content-Type内容

from httprunner import HttpRunner, Config, Step, RunRequest
# 作者-上海悠悠 QQ交流群:717225969 
# blog地址 https://www.cnblogs.com/yoyoketang/

class TestLoginV4Case(HttpRunner):
    config = Config("登录v4用例").base_url("http://127.0.0.1:80")
    teststeps = [
        Step(RunRequest("step-login")
             .post("/api/v1/login")
             .with_json({"username": "test", "password": "123456"})
             .validate()
             .assert_equal("status_code", 200)
             .assert_equal('headers.Content-Type', 'application/json')
             )
    ]

返回的 response 内容

================== response details ==================
status_code : 200
headers  : {
    "Date": "Tue, 17 Aug 2021 10:54:10 GMT",
    "Server": "WSGIServer/0.2 CPython/3.6.8",
    "Content-Type": "application/json",
    "Vary": "Accept, Cookie",
    "Allow": "POST, OPTIONS",
    "X-Frame-Options": "SAMEORIGIN",
    "Content-Length": "109"
}
cookies  : {}
encoding : utf-8
content_type : application/json
body     : {
    "code": 0,
    "msg": "login success!",
    "username": "test",
    "token": "607d2bea6a652b05f3e3d201e7328e2bb4026173"
}

运行的时候会报错

expression: headers.Content-Type
data: {'status_code': 200, 
'headers': {'Date': 'Tue, 17 Aug 2021 10:54:10 GMT', 'Server': 'WSGIServer/0.2 CPython/3.6.8', 'Content-Type': 'application/json', 'Vary': 'Accept, Cookie', 'Allow': 'POST, OPTIONS', 'X-Frame-Options': 'SAMEORIGIN', 'Content-Length': '109'}, 
'cookies': {}, 
'body': {'code': 0, 'msg': 'login success!', 'username': 'test', 'token': '607d2bea6a652b05f3e3d201e7328e2bb4026173'}}
exception: Bad jmespath expression: Unknown token '-':
headers.Content-Type

解决办法

因为headers.Content-Type有特殊字符-,jmespath处理特殊字符可以用引号包起来headers.\"Content-Type\"

             .validate()
             .assert_equal("status_code", 200)
             .assert_equal('headers.\"Content-Type\"', 'application/json')

参考文档:http://frayedmind.com/

posted @ 2021-08-17 19:00  上海-悠悠  阅读(481)  评论(0编辑  收藏  举报