• HttpRunner3.X


    一、前言

      前面讲了怎么搭建框架环境,怎么运行,以及直接就讲到了怎么生成allure测试报告,说白了就是阐述了一个大的框架,但具体运用到工作中时,测试用例怎么编写呢?且看下面的唠叨,哈哈哈。

    二、用例分层

      在一个pytest格式的Python文件的testcase里可以有一个或者多个测试步骤,就是teststeps[]列表里的Step()。
      每一个Step()就可以类比成pytest框架下的def test_xxx()的用例函数,在每一个Step里描述请求API的基本信息,用到是是RunRequest()类,当然也可以调用其他测试用例RunTestCase()
      官方想表达的就是测试用例分层的一个思想:
    • 测试用例(testcase)应该是完整且独立的,每条测试用例应该是都可以独立运行的
    • 测试用例是测试步骤(teststep)的有序集合
    • 测试用例集(testsuite)是测试用例的无序集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的;如果确实存在先后依赖关系,那就需要在测试用例中完成依赖的处理
    为了自动化测试的稳定性和可维护性,每个测试用例之间相互独立是非常有必要的。

    三、测试用例结构

    每个测试用例都是 的子类HttpRunner,并且必须具有两个类属性:configteststeps

    • config:配置测试用例级别的设置,包括base_urlverifyvariablesexport
    • teststeps:teststep( List[Step])列表,每一步对应一个API请求或者另一个testcase引用调用。此外,variablesextractvalidate/hooks机制支持,可制作十分复杂的测试方案。
    # NOTE: Generated By HttpRunner v3.1.5
    # FROM: harlogin.har
    
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    
    
    class TestCaseLogin(HttpRunner):
    
        config = Config("登录")
            .verify(False)
            .base_url("https://XXX.com")
            .variables(
                **{"username":"李白","psw":"123456"}
            )
            .export(*["userId","userNo","userName"])
    
    
        teststeps = [
            Step(
                RunRequest("登录接口")
                .post("/auth/login_by_password")
                .with_headers(
                    **{
                        "accept": "application/json, text/plain, */*",
                        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
                        "current-user-id": "",
                        "content-type": "application/json;charset=UTF-8",
                        "accept-language": "zh-CN,zh;q=0.9",
                    }
                )
                .with_json(
                    {
                        "employeeName": "$username",
                        "loginType": "PASSWORD",
                        "password": "$psw",
                        "currentUserId": "",
                        "workerId": "",
                        "currentUserName": "",
                        "currentUserCode": "",
                    }
                )
                .extract()
                .with_jmespath("body.data.userId","userId")
                .with_jmespath("body.data.userNo","userNo")
                .with_jmespath("body.data.userName","userName")
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal("body.successful", True)
                .assert_equal("body.code", "200")
                .assert_equal("body.message", "请求成功")
            ),
        ]
    
    
    if __name__ == "__main__":
        TestCaseLogin().test_start()
    

    1、config

    每个测试用例应该有一个config部分,您可以在其中配置测试用例级别设置。

    • 姓名(必填):指定测试用例名称。这将显示在执行日志和测试报告中。
    • base_url(可选):指定 SUT 的通用架构和主机部分,例如https://postman-echo.com. 如果base_url指定,则 teststep 中的 url 只能设置相对路径部分。如果您想在不同的 SUT 环境之间切换,这尤其有用。
    • 变量(可选):指定测试用例的公共变量。每个测试步骤都可以引用未在步骤变量中设置的配置变量。换句话说,步骤变量比配置变量具有更高的优先级。
    • 验证(可选):指定是否验证服务器的 TLS 证书。如果我们想记录测试用例执行的 HTTP 流量,这尤其有用,因为如果 verify 未设置或设置为 True,则会发生 SSLError。SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:证书链中的自签名证书 (_ssl.c:1076)'))
    • 导出(可选):指定测试用例的导出会话变量。将每个测试用例视为一个黑盒,configvariables是输入部分,configexport是输出部分。特别是,当一个测试用例在另一个测试用例的步骤中被引用,并且会提取一些会话变量以供后续测试步骤使用时,则应在配置export部分配置提取的会话变量。

    2、teststeps

    每个测试用例应该有一个或多个有序的测试步骤 ( List[Step]),每个步骤对应一个 API 请求或另一个测试用例引用调用。

    RunRequest(name)

    RunRequest 用于向 API 发出请求并对响应进行一些提取或验证的步骤。

    nameRunRequest的参数用于指定测试步骤名称,该名称将显示在执行日志和测试报告中。

    .with_variables

    指定测试步骤变量。每个步骤的变量都是独立的,因此如果要在多个步骤中共享变量,则应在配置变量中定义变量。此外,步骤变量将覆盖配置变量中具有相同名称的变量。

    .method(url)

    指定 HTTP 方法和 SUT 的 url。这些对应于method和 的url参数requests.request

    如果base_url在config中设置,url只能设置相对路径部分。

    .with_params

    为请求 url 指定查询字符串。这对应于 的params参数requests.request

    .with_headers

    为请求指定 HTTP 标头。这对应于 的headers参数requests.request

    .with_cookies

    指定 HTTP 请求 cookie。这对应于 的cookies参数requests.request

    .with_data

    指定 HTTP 请求正文。这对应于 的data参数requests.request

    .with_json

    在 json 中指定 HTTP 请求正文。这对应于 的json参数requests.request

    extract

    .WITH_JMESPATH

    使用jmespath提取 JSON 响应正文

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

    • jmes_path:jmespath 表达式,更多细节参考JMESPath 教程
    • var_name:存储提取值的变量名,可供后续测试步骤引用

    validate

    .ASSERT_XXX

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

    assert_XXX(jmes_path: Text, expected_value: Any, message: Text = "")

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

    RunTestCase(name)

    RunTestCase 在一个步骤中用于引用另一个测试用例调用。

    nameRunTestCase的参数用于指定测试步骤名称,该名称将显示在执行日志和测试报告中。

    .with_variables

    与 RunRequest 的.with_variables.

    .call

    指定引用的测试用例类。

    .export

    指定要从引用的测试用例导出的会话变量名称。导出的变量可以被后续的测试步骤引用

      

  • 相关阅读:
    单线制DS18B20温度传感器LED数码管显示当前的温度值
    AD转换器的主要指标
    关于swiper动态更改,无法更新的悖论
    在360的兼容模式下关于innerHTML=“”,引发的问题
    比较两个字符串的相似度
    WebSocket使用
    事件绑定addEventListener
    插件开发优缺点
    插件开发宗旨
    学会用博客
  • 原文地址:https://www.cnblogs.com/Chilam007/p/15023362.html
Copyright © 2020-2023  润新知