Loading [MathJax]/jax/input/TeX/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >httprunner 3.x学习8 - variables变量声明与引用

httprunner 3.x学习8 - variables变量声明与引用

作者头像
上海-悠悠
发布于 2021-06-24 14:21:36
发布于 2021-06-24 14:21:36
88700
代码可运行
举报
运行总次数:0
代码可运行

前言

在 HttpRunner 中,支持变量声明(variables)和引用($var)的机制

区别在于

  • 在 config 中定义的变量为全局的,整个测试用例(testcase)的所有地方均可以引用;
  • 在 step 中定义的变量作用域仅局限于当前测试步骤(teststep)

环境:httprunner==3.1.4

step 局部变量

在登录案例中,账号和密码是写死的,一般写用例的时候,我们最好把这种可能会变的参数单独写个变量。做到测试数据和代码的分离,以便后续维护。 如果我们在步骤(step)下声明的变量,作用域只在当前步骤(step)下有效。声明变量用 variables,变量和对应值用键值对,如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
teststeps:
-
    name: step login
    variables:
        user: test
        psw: "123456"

引用 user 和 psw 变量用 user,psw, 完整的 login_var.yml 脚本如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
config:
    name: login case
    base_url: http://127.0.0.1:8000
    export:
    - token

teststeps:
-
    name: step login
    variables:
        user: test
        psw: "123456"
    request:
        url: /api/v1/login
        method: POST
        json:
            username: $user
            password: $psw
    extract:
        token: content.token
    validate:
        - eq: [status_code, 200]
        - eq: [content.code, 0]
        - eq: [content.msg, login success!]
        - len_eq: [content.token, 40]

pytest 脚本设置变量用with_variables()方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Step(
            RunRequest("step login")
            .with_variables(**{"user": "test", "psw": "123456"})

完整的 pytest 脚本 login_var_test.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# NOTE: Generated By HttpRunner v3.1.4
# FROM: login_var.yml

from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase

class TestCaseLoginVar(HttpRunner):

    config = (
        Config("login case").base_url("http://127.0.0.1:8000").export(*["token"])
    )

    teststeps = [
        Step(
            RunRequest("step login")
            .with_variables(**{"user": "test", "psw": "123456"})
            .post("/api/v1/login")
            .with_json({"username": "$user", "password": "$psw"})
            .extract()
            .with_jmespath("body.token", "token")
            .validate()
            .assert_equal("status_code", 200)
            .assert_equal("body.code", 0)
            .assert_equal("body.msg", "login success!")
            .assert_length_equal("body.token", 40)
        ),
    ]

if __name__ == "__main__":
    TestCaseLoginVar().test_start()

config 全局变量

在config下声明变量(variables)是全局变量,这样就在整个.yml文件生效了,yml格式如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
config:
    name: logincase
    variables:
        user: test
        psw: "123456"

teststeps中,有多个 step 都需要引用账号 user, 于是可以直接引用 config 的变量$user

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
config:
    name: logincase
    variables:
        user: test
        psw: "123456"
    base_url: http://127.0.0.1:8000
    export:
    - token

teststeps:
-
    name: step1 login
    request:
        url: /api/v1/login/
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: $user
            password: $psw
    extract:
        token: content.token         # 提取token
    validate:
        - eq: [status_code, 200]
        - eq: [headers.Content-Type, application/json]
        - eq: [content.msg, login success!]
        - eq: [content.code, 0]
-
    name: step2 get user info
    request:
        url: /api/v1/userinfo/
        method: GET
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
            Authorization: Token $token          # 引用token
    validate:
        - eq: [content.code, 0]
        - eq: [content.data.0.name, $user]

pytest完整脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# NOTE: Generated By HttpRunner v3.1.4
# FROM: userinfo_var.yml

from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase

class TestCaseUserinfoVar(HttpRunner):

    config = (
        Config("logincase")
        .variables(**{"user": "test", "psw": "123456"})
        .base_url("http://127.0.0.1:8000")
        .export(*["token"])
    )

    teststeps = [
        Step(
            RunRequest("step1 login")
            .post("/api/v1/login/")
            .with_headers(
                **{
                    "Content-Type": "application/json",
                    "User-Agent": "python-requests/2.18.4",
                }
            )
            .with_json({"username": "$user", "password": "$psw"})
            .extract()
            .with_jmespath("body.token", "token")
            .validate()
            .assert_equal("status_code", 200)
            .assert_equal('headers."Content-Type"', "application/json")
            .assert_equal("body.msg", "login success!")
            .assert_equal("body.code", 0)
        ),
        Step(
            RunRequest("step2 get user info")
            .get("/api/v1/userinfo/")
            .with_headers(
                **{
                    "Content-Type": "application/json",
                    "User-Agent": "python-requests/2.18.4",
                    "Authorization": "Token $token",
                }
            )
            .validate()
            .assert_equal("body.code", 0)
            .assert_equal("body.data[0].name", "$user")
        ),
    ]

if __name__ == "__main__":
    TestCaseUserinfoVar().test_start()

变量优先级

原则上config 变量和 step 变量名称尽量不要重复, 当config和step中都用同一个变量时,step变量优先级大于config变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
config:
    name: login case
    variables:
        user: test
        psw: "123456"
    base_url: http://127.0.0.1:8000
    export:
    - token

teststeps:
-
    name: step login
    variables:
        user: test1
        psw: "123456"

pytest 对应的脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase

class TestCaseLoginVar(HttpRunner):

    config = (
        Config("login case")
        .variables(**{"user": "test", "psw": "123456"})
        .base_url("http://127.0.0.1:8000")
        .export(*["token"])
    )

    teststeps = [
        Step(
            RunRequest("step login")
            .with_variables(**{"user": "test1", "psw": "123456"})

config 和 step中都有user变量,运行时,会拿step中的变量值 ‘test1’去登录。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
httprunner 3.x学习13 - hook 机制
httprunner 3.x可以支持hook机制,在发送请求前做一些预处理或在请求完成后后置处理
上海-悠悠
2021/06/24
1.2K0
httprunner 3.x学习10 - parameters 参数化
httprunner 3.x可以在yaml文件中参数化,在 config 中使用 parameters 关键字 环境:httprunner==3.1.4
上海-悠悠
2021/06/24
1.2K2
httprunner 3.x学习5 - 测试用例引用前面一个用例(call)
当我写了一个登录的接口用例后,后面会继续写查询个人信息的接口,但是查询个人信息接口是依赖于先登录(获取token)。 像这种业务上操作有先后关系的情况,可以把登录当一个step来引用。 httprunner3.x 框架弱化了API层的概念,直接写testcase了,如果是单个接口的用例,可以当step去引用。
上海-悠悠
2021/06/24
1.5K0
httprunner 3.x学习5 - 测试用例引用前面一个用例(call)
httprunner 3.x学习2 - 测试用例结构(testcase)
httprunner 3.x 支持3种格式的用例:YAML/JSON/pytest 代码,3.x版本主推的是pytest测试用例。
上海-悠悠
2021/06/24
1.2K0
httprunner 3.x学习2 - 测试用例结构(testcase)
httprunner 3.x学习11 - 参数化(parameters)引用外部 csv 数据文件
对于已有参数列表,并且数据量比较大的情况,比较适合的方式是将参数列表值存储在 CSV 数据文件中。 对于 CSV 数据文件,需要遵循如下几项约定的规则:
上海-悠悠
2021/06/24
1.2K0
httprunner 3.x学习4 - 测试用例参数关联(export)
前言 如何将上个接口的返回token,传给下个接口当做请求参数? 这是最常见的一个问题了。 解决这个问题其实很简单,我们只需取出token值,设置为一个中间变量a,下个接口传这个变量a就可以了。那么接
上海-悠悠
2021/06/24
1.3K0
httprunner 3.x学习9 - .env环境变量设置
一般来说,在进行实际应用的开发过程中,应用会拥有不同的运行环境,通常会有以下环境:
上海-悠悠
2021/06/24
1K0
httprunner 3.x学习12 - 参数化(parameters)引用 debugtalk 函数
本篇讲解调用 debugtalk.py 中自定义的函数生成参数列表,生成的参数列表必须为 list of dict 的数据结构。
上海-悠悠
2021/06/24
1.2K0
httprunner学习4-variables变量声明与引用
在 HttpRunner 中,支持变量声明(variables)和引用($var)的机制。在 config 和 test 中均可以通过 variables 关键字定义变量,然后在测试步骤中可以通过 $ + 变量名称 的方式引用变量。 区别在于,在 config 中定义的变量为全局的,整个测试用例(testcase)的所有地方均可以引用;在 test 中定义的变量作用域仅局限于当前测试步骤(teststep)
上海-悠悠
2019/09/25
1.1K0
httprunner学习6-参数化(引用外部csv数据)
上一篇已经实现参数化,但是数据是放在.yml文件里面,当测试数据非常多的时候,我们希望把测试数据写到csv文件。 httprunner==1.5.8
上海-悠悠
2019/09/29
1.3K0
httprunner 3.x学习19 - 从返回头部headers取值
httprunner 3.x 取值是用 jmespath 表达式,当从头部取值Content-Type时,有特殊字符 -,会报错 jmespath.exceptions.LexerError: Bad jmespath expression: Unknown token ‘-‘: headers.Content-Type
上海-悠悠
2021/08/20
1K0
HTTPRunner
HTTPRunner是一种单元测试工具,由于教学的需求,我学习了它,但是我觉得它比Python的Requests类相差太远。作为一个比较流行的工具在这里进行介绍。
顾翔
2024/09/10
1310
HTTPRunner
HttpRunner3的变量是如何传递的
HttpRunner3的变量可以在测试类的用例配置中通过variables添加,也可以在测试步骤中使用extract()、with_jmespath()提取出来放到变量x,再用$x传递给下一个接口使用,比如登录到下单流程的部分测试脚本如下:
dongfanger
2022/05/09
8190
HttpRunner3的变量是如何传递的
tep集成HttpRunner与Flask实现开箱即用
趁着元旦假期最后一天,有着大把时间,奔着把tep做大做强的目标,好好学习了一波。在开始正文之前,先回答可能会问到的两个问题。第一个问题是为什么要集成HttpRunner?因为我最近在思考如何给tep做分层设计,参考了我司现有的接口自动化平台,它的设计是每个用例有很多测试步骤,可以针对用例设置预设变量,然后在测试步骤中引用。正当我准备自己开发类似功能时,想到了HttpRunner,我记得HttpRunner第3版是建议直接编写pytest代码而非以前的ymal或json文件了。大有所获,HttpRunner正是以这种方式编写的代码,而且和pytest有很好的结合,很符合tep要集成的第三方包的希望。第二个问题是为什么要集成Flask?刚开始只是我用来调试代码的,等到把Mock写完以后,想到可能大家也需要调试代码,就把它做到tep里面了,并且附带了测试用例的示例代码,安装完以后就能一键运行,开箱即用,美滋滋。归根结底,都是为了把tep做大做强。
dongfanger
2022/01/05
6280
httprunner 3.x学习3 - jmespath 提取返回结果(extract, validate)
httprunner 3.x支持 jmespath 提取器提取返回的结果内容,可以在 extract 提取变量的时候使用,也可以在 validate 校验结果的时候使用。
上海-悠悠
2021/06/24
2.1K0
httprunner 3.x学习3 - jmespath 提取返回结果(extract, validate)
httprunner 2.x学习12-在testcase中传递变量(output)
httprunner 2.x 的版本,testcase 可以引用 api, 同样的 testcase 也可以引用另外一个 testcase 文件 在2个 testcase 中传递变量可以用到 output 关键字
上海-悠悠
2021/04/26
9710
httprunner 2.x学习5-测试用例集(testsuite)
httprunner 分层主要是分三层:api、testcase、testsuites 前面讲分层的时候讲到api单独封装每个接口,testcase可以有多个测试步骤,调用api层的接口是写测试用例,用例的步骤是有序的。 testsuites 这一层是测试用例的集合,把测试用例放到一个测试套件去执行,用例执行应该是无序的,有依赖的场景在testcase这一层测试用例里面就已经按步骤写好了。
上海-悠悠
2020/06/17
1.3K1
httprunner学习5-参数化与数据驱动
参数化是自动化测试离不开的话题,httprunner里面只要把上一篇声明变量学会了,参数化也就自然会了。 不同的地方在于声明变量时对应值只有一个,参数化是多个值,存放在list里面。
上海-悠悠
2019/09/27
1.2K1
httprunner 4.x学习 - 3.variables 变量声明与引用
在 HttpRunner 中,支持变量声明(variables)和引用(var 或 {var} )的机制。在 config 和 step 中均可以通过 variables 关键字定义变量,然后在测试步骤中可以通过
上海-悠悠
2023/08/22
4890
httprunner 4.x学习 - 3.variables 变量声明与引用
httprunner 3.x学习1 - 环境安装与准备
httprunner 3.x最大的改变是执行用例用的是 python 的 pytest 框架,支持3种格式的用例:YAML/JSON/pytest 代码 对比 httprunner 2.x 以前版本,早期版本用的是 unittest 框架,只支持2种格式的用例: YAML/JSON
上海-悠悠
2021/06/24
1.2K0
httprunner 3.x学习1 - 环境安装与准备
相关推荐
httprunner 3.x学习13 - hook 机制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档