• httprunner 3.x学习3


    前言

    httprunner 3.x支持 jmespath 提取器提取返回的结果内容,可以在 extract 提取变量的时候使用,也可以在 validate 校验结果的时候使用。

    extract 提取变量

    with_jmespath(jmes_path:文字,var_name:文字)

    • mes_path:jmespath表达式,有关更多详细信息,请参考JMESPath教程https://jmespath.org/tutorial.html
    • var_name:存储提取值的变量名,可以在后续测试步骤中引用它

    如果请求接口结果返回格式如下

    {
        "code": 0,
        "msg": "login success!",
        "token": "234af73571da46ade79ea6a74961b1d23d609b79",
        "username": "test"
    }
    

    需要提取token和username,于是可以这样写,extract 提取的时候,先调用.extract()方法

        .extract()
        .with_jmespath("body.token", "token")
        .with_jmespath("body.username", "user")
    

    with_jmespath 方法提取body对象,后面接着jmespath的提取语法

    validate 校验结果

    使用jmespath提取 JSON 响应正文并使用预期值进行验证。

    • jmes_path:jmespath 表达式,更多细节参考JMESPath 教程
    • 预期值:这里也可以使用指定的预期值、变量或函数引用
    • 消息(可选):用于指示断言错误原因
    assert_XXX(jmes_path: Text, expected_value: Any, message: Text = "")
    

    校验结果先调用.validate()方法

                .validate()
                .assert_equal("status_code", 200)
                .assert_equal("body.code", 0)
                .assert_equal("body.msg", "login success!")
                .assert_length_equal("body.token", 40)
    

    jmespath 提取示例

    访问/api/test/demo接口,接口返回如下

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    {
        "code":0,
        "msg":"成功success!",
        "data":[
            {
                "age":20,
                "create_time":"2019-09-15",
                "id":1,
                "mail":"283340479@qq.com",
                "name":"yoyo",
                "sex":"M"
            },
            {
                "age":21,
                "create_time":"2019-09-16",
                "id":2,
                "mail":"123445@qq.com",
                "name":"yoyo111",
                "sex":"M"
            }
        ]
    }
    

    需求:

    • 1.提取code值,校验结果为:0
    • 2.msg值,校验结果:成功success!
    • 3.提取data数据,校验结果长度是:2
    • 4.提取data数据中第一条数据,校验name的值:yoyo
    • 5.提取data数据中name的值为yoyo的邮箱,并校验结果是:283340479@qq.com
    • 6.提取data数据组中,年龄大于20的结果,并校验结果的数量是:1

    httprunner3.x 对应的 py 代码

    # NOTE: Generated By HttpRunner v3.1.4
    # FROM: test_demo.yml
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    
    
    class TestCaseTestDemo(HttpRunner):
    
        config = Config("test demo").base_url("http://127.0.0.1:8000")
    
        teststeps = [
            Step(
                RunRequest("step login")
                .get("/api/test/demo")
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal("body.code", 0)
                .assert_equal("body.msg", "成功success!")
                .assert_equal("body.length(data)", 2)
                .assert_equal("body.data[0].name", "yoyo")
                .assert_equal("body.data[?name=='yoyo'].mail", ["283340479@qq.com"])
                .assert_equal("body.data[?name=='yoyo'].mail|[0]", "283340479@qq.com")
                .assert_equal("body.length(data[?age>`20`])", 1)
            ),
        ]
    
    
    if __name__ == "__main__":
        TestCaseTestDemo().test_start()
    
    

    pytest 运行部分日志

    2021-06-15 23:36:24.233 | INFO     | httprunner.client:request:218 - status_code: 200, response_time(ms): 32.95 ms, response_length: 0 bytes
    2021-06-15 23:36:24.234 | INFO     | httprunner.response:validate:246 - assert status_code equal 200(int)       ==> pass
    2021-06-15 23:36:24.235 | INFO     | httprunner.response:validate:246 - assert body.code equal 0(int)   ==> pass
    2021-06-15 23:36:24.236 | INFO     | httprunner.response:validate:246 - assert body.msg equal 成成功功success!(str) ==> pass
    2021-06-15 23:36:24.236 | INFO     | httprunner.response:validate:246 - assert body.length(data) equal 2(int)   ==> pass
    2021-06-15 23:36:24.237 | INFO     | httprunner.response:validate:246 - assert body.data[0].name equal yoyo(str)        ==> pass
    2021-06-15 23:36:24.238 | INFO     | httprunner.response:validate:246 - assert body.data[?name=='yoyo'].mail equal ['283340479@qq.com'](list)   ==> pass
    2021-06-15 23:36:24.239 | INFO     | httprunner.response:validate:246 - assert body.data[?name=='yoyo'].mail|[0] equal 283340479@qq.com(str)    ==> pass
    2021-06-15 23:36:24.240 | INFO     | httprunner.response:validate:246 - assert body.length(data[?age>`20`]) equal 1(int)        ==> pass
    2021-06-15 23:36:24.241 | INFO     | httprunner.runner:__run_step:304 - run step end: step login <<<<<<
    

    JMESPath 简介

    JMESPath 是 JSON的查询语言,您可以从JSON文档中提取和转换元素,类似于 jsonpath 的另外一个库。
    关于 JMESPath 官方文档介绍https://jmespath.org/tutorial.html#basic-expressions
    使用pip安装jmespath,github地址https://github.com/jmespath/jmespath.py

    pip install jmespath

    使用示例1,可以使用search jmespat h表达式并为其提供数据

    import jmespath
    path = jmespath.search('foo.bar', {'foo': {'bar': 'baz'}})
    print(path)    # baz
    

    使用示例2, 与re模块类似,您可以使用该 compile 函数来编译 jmespath 表达式,并使用此解析的表达式来执行重复搜索

    import jmespath
    expression = jmespath.compile('foo.bar')
    a = expression.search({'foo': {'bar': 'baz'}})
    b = expression.search({'foo': {'bar': 'other'}})
    print(a)    # baz
    print(b)    # other
    

    基本表达式

    字典取值,根据key名称取到对应的值

    嵌套的字典,可以一层一层取值

    list可以根据下标取值

    dict嵌套list可以一层一层的取值

    切片

    如果您曾经在python中使用过切片,那么您已经知道如何使用JMESPath slice。
    您可以以最简单的形式指定开始索引和结束索引。结束索引是您不希望包含在切片中的第一个索引。
    让我们看一些例子。首先,给定一个从0到9的整数数组,让我们选择该数组的前半部分:

    该切片结果包含元素0、1、2、3和4。不包括索引5的元素。如果要选择数组的后半部分,可以使用以下表达式:

    上面的两个示例可以简化。如果开始或步骤被省略值它被假定为开始或数组的末尾。例如:

    切片的一般形式是[start:stop:step]。到目前为止,我们已经研究了[start:stop]表单。缺省情况下,步骤值是1,这是指包括在由所指定的范围中的每个元素开始和 停止值。但是,我们可以使用step值跳过元素。例如,仅从数组中选择偶数元素。

    还要注意在这个例子中,我们省略开始还有停止 值,使用该装置0的启动值,10为 停止值。在此示例中,表达式[:: 2]等效于 [0:10:2]。
    关于切片的最后一件事是,就像索引单个值一样,所有值都可以是负数。如果步长值为负,则以相反顺序创建切片。例如:

    上面的表达式创建一个切片,但顺序相反。

    列表取值使用 * 通配符

    1.取出列表中所有的 first 对应的名称 people[*].first

    2.取出列表中前 2 个 first 对应的名称 people[:2].first

    对象取值使用 * 通配符

    1.取出 ops 对象的任意属性对应的numArgs ops.*.numArgs

    子查询使用 * 通配符

    在查询的结果中继续使用 * 通配符,查询的结果是列表的列表

    如果我们只想要一个实例所有状态的列表怎么办?理想情况下,我们希望结果为[“ running”, “ stopped”, “ terminated”, “ running”]
    在这种情况下,我们不在乎实例属于哪个保留,我们只需要一个状态列表。可以使用 [] 而不是 [*]

    过滤器使用

    过滤器表达式是为数组定义的,其一般形式为 [? <表达式> <比较器> <表达式>]
    常用的比较表达式可以使用 ==!=<<=>> =

    假设我们有一个机器列表,每个机器都有一个名称和一个 state。我们想要所有正在运行的计算机的名称

    管道表达式

    前面在匹配list里面的多个值时候,查询的结果是一个list,如果我想取出结果里面的第一个可以使用管道符 |
    取出people下所有对象的 first 属性,从结果里面取第一个值: people[*].first | [0]

    多选

    到目前为止,我们已经研究了JMESPath表达式,这些表达式有助于将JSON文档缩减为您感兴趣的元素。下一个概念, 多选列表和 多选哈希允许您创建JSON元素。这使您可以创建JSON文档中不存在的元素。多选列表创建一个列表,多选哈希创建一个JSON对象。

    这是一个多选列表的示例:people[].[name, state.name]

    在上面的表达式中,[name, state.name]部分是一个多选列表。它说要创建一个由两个元素组成的列表,第一个元素是针对list元素评估名称表达式的结果,第二个元素是对state.name评估的结果。因此,每个列表元素将创建一个两个元素列表,并且整个表达式的最终结果是两个元素列表的列表。

    与投影不同,即使结果为null,也始终包含表达式的结果。如果将以上表达式更改为people []。[foo, bar],则每个两个元素列表将为[null, null]。

    多重选择具有与多重选择列表相同的基本概念,不同之处在于它会创建哈希而不是数组。使用上面的相同示例,如果我们想创建一个具有两个键Name和 State的两个元素哈希,则可以使用以下代码:

    函数的使用

    JMESPath支持函数表达式,例如:length(people)

    函数可用于以强大的方式转换和过滤数据。可以在此处找到函数的完整列表,并且 函数表达式规范具有完整的详细信息。

    以下是一些功能示例。

    本示例在people数组中打印最老的人的名字:

    函数也可以与过滤器表达式组合。在下面的示例中,JMESPath表达式在myarray中查找包含字符串foo的所有元素。

    上面示例中的@字符表示在myarray中正在评估的当前元素。如果myarray数组中的当前元素包含字符串 foo , 则包含(@,'foo')的表达式将返回 true。

    尽管函数表达式规范包含所有详细信息,但在使用函数时,需要牢记以下几点:

    函数参数具有类型。如果函数的参数类型错误,则会发生无效类型错误。有一些函数可以进行类型转换(to_string,to_number),以帮助将参数转换为正确的类型。
    如果以错误的参数数量调用函数, 则将发生无效arity。

  • 相关阅读:
    [CF846E]Chemistry in Berland题解
    [CF846D]Monitor题解
    [CF846B]Math Show题解
    [CF846A]Curriculum Vitae题解
    斜率优化 学习笔记
    【CF115E】Linear Kingdom Races 题解(线段树优化DP)
    【洛谷P3802】小魔女帕琪 题解(概率期望)
    7月13日考试 题解(DFS序+期望+线段树优化建图)
    【BZOJ1426】收集邮票 题解 (期望)
    【HNOI2010】弹飞绵羊 题解(分块)
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14887668.html
Copyright © 2020-2023  润新知