httprunner 3.x學習2 - 測試用例結構(testcase)


前言

httprunner 3.x 支持3種格式的用例:YAML/JSON/pytest 代碼,3.x版本主推的是pytest測試用例。

測試用例結構

httprunner 3.x 版本弱化了api層的概念,直接在 testcase 中寫request 請求,如果是單個請求,也可以直接寫成一個 testcase 。
每個 testcase 必須具有兩個類屬性:config 和 teststeps。

每個測試用例都應該有一個config部分,您可以在其中配置測試用例級別的設置,有以下屬性

屬性名稱 是否必填 作用
name 必填 指定測試用例名稱。這將顯示在執行日志和測試報告中。
base_url 可選 如果base_url指定,則 teststep 中的 url 可以設置相對路徑部分
verify 可選 https請求時,是否校驗證書,默認True,忽略證書校驗可以設置為False
variables 可選 指定測試用例的公共變量。每個測試步驟都可以引用未在步驟變量中設置的配置變量。換句話說,步驟變量比配置變量具有更高的優先級。
export 可選 (早期版本用的output)指定導出的測試用例會話變量,把變量暴露出來,設置為全局變量

yaml 中 teststeps 步驟參數

屬性名稱 是否必填 作用
name 必填 指定測試步驟名稱
request 必填 指定測試步驟變量,參數引用變量"$變量名"
variables 可選 指定測試步驟變量,參數引用變量"$變量名"
extract 可選 提取返回結果
export 可選 導出的測試用例會話變量,設為全局變量
validate 可選 校驗返回結果

pytest 用例中teststeps 可以有多個步驟,每個步驟對應一個接口的請求,也就是 RunRequest (測試步驟)

屬性名稱 是否必填 作用
name 必填 指定測試步驟名稱
method(url) 必填 。如果在Config中設置了baseurl,method中只能設置相對路徑,可選參數為get/post/put/delete/等
with_params 可選 對應於的params參數requests.request
with_headers 可選 對應於的headers參數requests.request
with_cookies 可選 cookies參數requests.request
with_data 可選 對應於的data參數requests.request
with_json 可選 對應於的json參數requests.request
with_variables 可選 指定測試步驟變量。每個步驟的變量都是獨立的,參數引用使用"$變量名",如果是函數引用使用"${函數名()}"

extract 數據提取

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

  • mes_path:jmespath表達式,有關更多詳細信息,請參考JMESPath教程https://jmespath.org/tutorial.html
  • var_name:存儲提取值的變量名,可以在后續測試步驟中引用它

validate 校驗結果

使用jmespath提取 JSON 響應正文並使用預期值進行驗證。

assert_XXX(jmes_path: Text, expected_value: Any, message: Text = "")
  • jmes_path:jmespath 表達式,更多細節參考JMESPath 教程
  • 預期值:這里也可以使用指定的預期值、變量或函數引用
  • 消息(可選):用於指示斷言錯誤原因

下圖顯示了 HttpRunner 內置驗證器。

yaml 結構 testcase

yaml 結構 testcase 和之前2.x版本沒什么區別,以登錄接口為例test_login.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: test1
        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]

hrun 運行結果

pytest 腳本

hrun 運行后在當前目錄會自動生成對應的 pytest 腳本test_login_test.py

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


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


class TestCaseTestLogin(HttpRunner):

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

    teststeps = [
        Step(
            RunRequest("steplogin")
            .with_variables(**{"user": "test1", "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__":
    TestCaseTestLogin().test_start()

命令行使用pytest -s運行結果

D:\demo\hrun3x\testcases>pytest test_login_test.py -s
===================== test session starts ================================
platform win32 -- Python 3.6.6, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
rootdir: D:\demo\hrun3x\testcases
plugins: allure-pytest-2.8.6, Faker-8.6.0, assume-2.3.3, base-url-1.4.2
collected 1 item                                                                                                                                                                   

test_login_test.py 2021-06-15 20:43:49.328 | INFO     | httprunner.runner:test_start:451 - Start to run testcase: logincase, TestCase ID: ec9695e0-6e05-4bbf-8276-216b4b09a380
2021-06-15 20:43:49.330 | INFO     | httprunner.runner:__run_step:292 - run step begin: steplogin >>>>>>
2021-06-15 20:43:49.476 | DEBUG    | httprunner.client:request:186 - client IP: 192.168.1.125, Port: 20657
2021-06-15 20:43:49.477 | DEBUG    | httprunner.client:request:194 - server IP: 49.235.92.12, Port: 8201
2021-06-15 20:43:49.478 | DEBUG    | httprunner.client:log_print:40 -
================== request details ==================
method   : POST
url      : http://127.0.0.1:8000/api/v1/login
headers  : {
    "User-Agent": "python-requests/2.22.0",
    "Accept-Encoding": "gzip, deflate",
    "Accept": "*/*",
    "Connection": "keep-alive",
    "HRUN-Request-ID": "HRUN-ec9695e0-6e05-4bbf-8276-216b4b09a380-029331",
    "Content-Length": "43",
    "Content-Type": "application/json"
}
cookies  : {}
body     : {
    "username": "test1",
    "password": "123456"
}

2021-06-15 20:43:49.480 | DEBUG    | httprunner.client:log_print:40 -
================== response details ==================
status_code : 200
headers  : {
    "Date": "Tue, 15 Jun 2021 12:43:49 GMT",
    "Server": "WSGIServer/0.2 CPython/3.6.8",
    "Content-Type": "application/json",
    "Vary": "Accept, Cookie",
    "Allow": "POST, OPTIONS",
    "X-Frame-Options": "SAMEORIGIN",
    "Content-Length": "110"
}
cookies  : {}
encoding : None
content_type : application/json
body     : {
    "code": 0,
    "msg": "login success!",
    "username": "test1",
    "token": "99c06543e23d90f26b3d02e2474120fa6dbb7cc3"
}

2021-06-15 20:43:49.483 | INFO     | httprunner.client:request:218 - status_code: 200, response_time(ms): 144.13 ms, response_length: 0 bytes
2021-06-15 20:43:49.484 | INFO     | httprunner.response:extract:176 - extract mapping: {'token': '99c06543e23d90f26b3d02e2474120fa6dbb7cc3'}
2021-06-15 20:43:49.485 | INFO     | httprunner.response:validate:246 - assert status_code equal 200(int)       ==> pass
2021-06-15 20:43:49.486 | INFO     | httprunner.response:validate:246 - assert body.code equal 0(int)   ==> pass
2021-06-15 20:43:49.487 | INFO     | httprunner.response:validate:246 - assert body.msg equal login success!(str)       ==> pass
2021-06-15 20:43:49.488 | INFO     | httprunner.response:validate:246 - assert body.token length_equal 40(int)  ==> pass
2021-06-15 20:43:49.489 | INFO     | httprunner.runner:__run_step:304 - run step end: steplogin <<<<<<

2021-06-15 20:43:49.489 | INFO     | httprunner.runner:test_start:460 - generate testcase log: D:\demo\hrun3x\testcases\logs\ec9695e0-6e05-4bbf-8276-216b4b09a380.run.log
.

============================== 1 passed in 0.96s ===================================

jmespath相關語法可以查看這篇https://www.cnblogs.com/yoyoketang/p/14310898.html


免責聲明!

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



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