• 【HttpRunner v3.x】笔记—6. 测试用例-teststeps-RunRequest


    之前我们了解了config里的各项参数,今天来了解另一个重要部分——teststeps,在这之前,先看看测试用例的分层模型。

    一、测试用例分层模型

    一个testcase里(就是一个pytest格式的Python文件)可以有一个或者多个测试步骤,就是teststeps[]列表里的Step。

    我的理解每一个Step就可以类比成pytest框架下的def test_xxx()的用例函数,在Step里通常都会要请求API完成测试,也可以调用其他测试用例来完成更多的需求。

    可以来看下官方的测试用例逻辑图(2.x版本不同,3.x弃用了2.x的API概念):

    可以看到,testsuite包含了testcase,testcase1需要依赖testcase2才可以完成,那么就可以在teststep12对其进行引用;而testcase2又依赖于testcase3,那么也可以在teststep22进行引用。

    但是在整个testsuite下,这3个testcase都是相互独立的,可以独自运行。如果需要相互调用,则是在testcase内部去完成处理。

    可能看起来有点绕,其实官方想表达的就是测试用例分层的一个思想:

    • 测试用例(testcase)应该是完整且独立的,每条测试用例应该是都可以独立运行的
    • 测试用例是测试步骤(teststep)的有序集合
    • 测试用例集(testsuite)是测试用例的无序集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的;如果确实存在先后依赖关系,那就需要在测试用例中完成依赖的处理

    其实这一点,在我们自己使用pytest框架编写测试用例的时候同样贯彻到了。为了自动化测试的稳定性和可维护性,每个测试用例之间相互独立是非常有必要的。

    二、teststeps-RunRequest

    先上一段Step的代码,结合下面的点对照着看:

        teststeps = [
            Step(
                RunRequest("get with params")
                .with_variables(
                    **{"foo1": "bar11", "foo2": "bar21", "sum_v": "${sum_two(1, 2)}"}
                )
                .get("/get")
                .with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"})
                .with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"})
                .extract()
                .with_jmespath("body.args.foo2", "foo3")
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal("body.args.foo1", "bar11")
                .assert_equal("body.args.sum_v", "3")
                .assert_equal("body.args.foo2", "bar21")
            ),
    

    从上面的代码可以看出,RunRequest的作用就是在测试步骤中请求API,并且可以对于API的响应结果进行提取、断言。

    1.RunRequest(name)

    RunRequest的参数名用于指定teststep名称,它将显示在执行日志和测试报告中。

    2. .with_variables

    用于存放变量,但是这里的是Step步骤里的变量,不同的Step的变量是相互独立的。所以对于多个Step都要使用的变量,我们可以放到config的变量里去。

    另外,如果config和Step里有重名的变量,那么当你引用这个变量的时候,Step变量会覆盖config变量。

    3. .method(url)

    这里就是指定请求API的方法了,常用的get、post等等。如图所示,就是用的get方法,括号里的url就是要请求的地址了。

    这里要注意的是,如果在config里设置了基础url,那么步骤里的url就只能设置相对路径了。

    4. .with_params

    这个就简单了,测接口不都得要传参么,对于params类型的传参,就放这就行了,key-value键值对的形式。对于body形式的传参,看后面。

    5. .with_headers

    同样,有header要带上的就放这里。

    6. .with_cookies

    需要带cookie的,可以用.with_cookies方法。

    7. .with_data

    对于body类型的传参,可以用.with_data。

    8. .with_json

    如果是json类型的body请求体,可以用.with_json。

    9. .extract

    这里就是要做提取操作了,使用.with_jmespath(jmes_path: Text, var_name: Text)。

    这里是采用了JMESPath语言,JMESPath是JSON的查询语言,可以便捷的提取json中你需要的元素。

    第一个参数是你的目标元素的jmespath表达式,第二个元素则是用来存放这个元素的变量,供有需要的引用。

    这里不展开,后面单讲。

    10. .validate

    断言,我们测试最终就是要验证接口返回是否符合预期。

    那在httprunner框架中,可以使用assert_XXX(jmes_path: Text, expected_value: Any)来进行提取和验证。

    第一个参数还是jmespath表达式,第二个参数则是预期值。

    assert_XXX这种方式相信用过自动化测试框架的都不会陌生,所以也非常容易上手。目前httprunner还是封装了非常丰富的断言方法的,相信可以满足绝大多数的需求了。

    到这里,一个接口的请求和验证就完成了,我打算用flask快速写几个demo用的接口,可以对必要的方法更进一步的演示。

  • 相关阅读:
    js 学习的地址;
    HTML onmousedown 事件属性 关于鼠标按键的问题;
    contextmenu="supermenu" 属性的应用 右键菜单打开和保存功能
    gulp自动化ES6转ES5
    angularjs获取元素以及angular.element()用法
    gulp学习总结
    Git 代码管理常用命令
    SpringMVC基于代码的配置方式(零配置,无web.xml)
    [Android Studio 权威教程]AS 中配置强大的版本号管理系统(Git、SVN、等)
    SVM支持向量机
  • 原文地址:https://www.cnblogs.com/pingguo-softwaretesting/p/13214443.html
Copyright © 2020-2023  润新知