httprunner 3.x學習8 - variables變量聲明與引用


前言

在 HttpRunner 中,支持變量聲明(variables)和引用($var)的機制。
在 config 和 step 中均可以通過 variables 關鍵字定義變量,然后在測試步驟中可以通過 $變量名稱 的方式引用變量。
區別在於

  • 在 config 中定義的變量為全局的,整個測試用例(testcase)的所有地方均可以引用;
  • 在 step 中定義的變量作用域僅局限於當前測試步驟(teststep)

環境:httprunner==3.1.4

step 局部變量

在登錄案例中,賬號和密碼是寫死的,一般寫用例的時候,我們最好把這種可能會變的參數單獨寫個變量。做到測試數據和代碼的分離,以便后續維護。
如果我們在步驟(step)下聲明的變量,作用域只在當前步驟(step)下有效。聲明變量用 variables,變量和對應值用鍵值對,如

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

引用 user 和 psw 變量用 $user, $psw, 完整的 login_var.yml 腳本如下

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

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()方法

Step(
            RunRequest("step login")
            .with_variables(**{"user": "test", "psw": "123456"})

完整的 pytest 腳本 login_var_test.py

# NOTE: Generated By HttpRunner v3.1.4
# FROM: login_var.yml
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

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格式如下

config:
    name: logincase
    variables:
        user: test
        psw: "123456"

teststeps中,有多個 step 都需要引用賬號 user, 於是可以直接引用 config 的變量$user

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

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完整腳本

# NOTE: Generated By HttpRunner v3.1.4
# FROM: userinfo_var.yml
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

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變量

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
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 對應的腳本

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

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'去登錄。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM