tep集成HttpRunner與Flask實現開箱即用

大家好,我是剛哥。

趁着元旦假期最後一天,有着大把時間,奔着把tep做大做強的目標,好好學習了一波。在開始正文之前,先回答可能會問到的兩個問題。第一個問題是爲什麼要集成HttpRunner?因爲我最近在思考如何給tep做分層設計,參考了我司現有的接口自動化平臺,它的設計是每個用例有很多測試步驟,可以針對用例設置預設變量,然後在測試步驟中引用。正當我準備自己開發類似功能時,想到了HttpRunner,我記得HttpRunner第3版是建議直接編寫pytest代碼而非以前的ymal或json文件了。大有所獲,HttpRunner正是以這種方式編寫的代碼,而且和pytest有很好的結合,很符合tep要集成的第三方包的希望。第二個問題是爲什麼要集成Flask?剛開始只是我用來調試代碼的,等到把Mock寫完以後,想到可能大家也需要調試代碼,就把它做到tep裏面了,並且附帶了測試用例的示例代碼,安裝完以後就能一鍵運行,開箱即用,美滋滋。歸根結底,都是爲了把tep做大做強

tep0.9.3正式發佈

要體驗HttpRunner和Flask,需要先安裝或升級到tep0.9.3。

安裝:

pip install tep 

升級:

pip install -U tep

或者指定版本:

pip install tep==0.9.3

安裝tep時會順帶安裝HttpRunner和Flask,安裝完以後就可以執行命令初始化項目:

tep startproject demo093

輸出:

D:\PycharmProjects>tep startproject demo093
2022-01-03 16:07:31.929 | INFO     | tep.scaffold:create_scaffold:53 - Create new project: demo093
Project root dir: D:\PycharmProjects\demo093

Created folder: demo093
Created folder: demo093\fixtures
Created folder: demo093\tests
Created folder: demo093\files
Created folder: demo093\reports
Created folder: demo093\utils
Created file: demo093\.gitignore
Created file: demo093\conf.yaml
Created file: demo093\conftest.py
Created file: demo093\pytest.ini
Created file: demo093\fixtures\__init__.py
Created file: demo093\fixtures\fixture_admin.py
Created file: demo093\fixtures\fixture_env_vars.py
Created file: demo093\fixtures\fixture_login.py
Created file: demo093\fixtures\fixture_your_name.py
Created file: demo093\tests\__init__.py
Created file: demo093\tests\test_login.py
Created file: demo093\tests\test_post.py
Created file: demo093\tests\test_mysql.py
Created file: demo093\tests\test_request.py
Created file: demo093\tests\test_login_pay.py
Created file: demo093\tests\test_login_pay_httprunner.py
Created file: demo093\utils\__init__.py
Created file: demo093\utils\flask_mock_api.py
  • 修改了fixture_env_vars.py裏面的domain爲http://127.0.0.1:5000,這是Flask啓動後的默認地址。
  • 修改了fixture_login.py裏面的登錄url和username,跟Flask的Mock對應。
  • 新增了utils\flask_mock_api.py,直接啓動Mock服務。
  • 新增了tests\test_login_pay.py,用例數據一體開發模式,登錄到下單流程的示例代碼,可以一鍵運行成功
  • 新增了tests\test_login_pay_httprunner.py,HttpRunner開發模式,登錄到下單流程的示例代碼,可以一鍵運行成功

新版README.md

之前tep的README是全英文的,這次我也決定不裝了,改成中文 ,豐富了內容,大家可以對tep有個全新和全面的瞭解啦。以下是全文:

tep

tepTry Easy Pytest的首字母縮寫,是一款基於pytest測試框架的測試工具,集成了各種實用的第三方包和優秀的自動化測試設計思想,幫你快速實現自動化項目落地。

安裝

支持Python3.6以上,推薦Python3.8以上。

標準安裝:

$ pip install tep

國內鏡像:

$ pip --default-timeout=600 install -i https://pypi.tuna.tsinghua.edu.cn/simple tep

檢查安裝成功:

$ tep -V  # 或者 tep --version
0.2.3

快速創建項目

tep提供了腳手架,預置了項目結構和代碼,打開cmd,使用startproject命令快速創建項目:

tep startproject project_name

並且提供了-venv參數,在項目初始化時,可以同時創建一個虛擬環境(推薦):

tep startproject project_name -venv

輸出測試報告

tep提供了--tep-reports參數來生成allure測試報告:

pytest  --tep-reports

報告文件存放在根目錄的reports/中。

Mock服務

tep自帶了一個Flask應用(utils/flask_mock_api.py),提供了登錄到下單流程的5個接口,啓動後即可一鍵運行示例中的測試用例。

三種開發模式

tep兼容三種開發模式:用例數據一體(適合新手)、用例數據分離(適合老手)、HttpRunner(新老皆宜)。

①用例數據一體,示例代碼如下所示:

import jmespath
from tep.client import request


def test(env_vars, login):
    # 搜索商品
    response = request(
        "get",
        url=env_vars.domain + "/searchSku",
        headers={"token": login.token},
        params={"skuName": "電子書"}
    )
    sku_id = jmespath.search("skuId", response.json())
    sku_price = jmespath.search("price", response.json())
    assert response.status_code < 400

    # 添加購物車
    sku_num = 3
    response = request(
        "post",
        url=env_vars.domain + "/addCart",
        headers={"token": login.token},
        json={"skuId": sku_id, "skuNum": sku_num}
    )
    total_price = jmespath.search("totalPrice", response.json())
    assert response.status_code < 400

    # 下單
    response = request(
        "post",
        url=env_vars.domain + "/order",
        headers={"token": login.token},
        json={"skuId": sku_id, "price": sku_price, "skuNum": sku_num, "totalPrice": total_price}
    )
    order_id = jmespath.search("orderId", response.json())
    assert response.status_code < 400

    # 支付
    response = request(
        "post",
        url=env_vars.domain + "/pay",
        headers={"token": login.token},
        json={"orderId": order_id, "payAmount": "6.9"}
    )
    assert response.status_code < 400
    assert response.json()["success"] == "true"

更多內容請參考《如何使用teprunner測試平臺編寫從登錄到下單的大流程接口自動化用例》

②用例數據分離

開發中,敬請期待...
③HttpRunner,示例代碼如下所示:

from httprunner import HttpRunner, Config, Step, RunRequest


class TestLoginPay(HttpRunner):
    config = (
        Config("登錄到下單流程")
            .variables(
            **{
                "skuNum": "3"
            }
        )
            .base_url("http://127.0.0.1:5000")
    )

    teststeps = [
        Step(
            RunRequest("登錄")
                .post("/login")
                .with_headers(**{"Content-Type": "application/json"})
                .with_json({"username": "dongfanger", "password": "123456"})
                .extract()
                .with_jmespath("body.token", "token")
                .validate()
                .assert_equal("status_code", 200)
        ),
        Step(
            RunRequest("搜索商品")
                .get("searchSku?skuName=電子書")
                .with_headers(**{"token": "$token"})
                .extract()
                .with_jmespath("body.skuId", "skuId")
                .with_jmespath("body.price", "skuPrice")
                .validate()
                .assert_equal("status_code", 200)
        ),
        Step(
            RunRequest("添加購物車")
                .post("/addCart")
                .with_headers(**{"Content-Type": "application/json",
                                 "token": "$token"})
                .with_json({"skuId": "$skuId", "skuNum": "$skuNum"})
                .extract()
                .with_jmespath("body.totalPrice", "totalPrice")
                .validate()
                .assert_equal("status_code", 200)
        ),
        Step(
            RunRequest("下單")
                .post("/order")
                .with_headers(**{"Content-Type": "application/json",
                                 "token": "$token"})
                .with_json({"skuId": "$skuId", "price": "$skuPrice", "skuNum": "$skuNum", "totalPrice": "$totalPrice"})
                .extract()
                .with_jmespath("body.orderId", "orderId")
                .validate()
                .assert_equal("status_code", 200)
        ),
        Step(
            RunRequest("支付")
                .post("/pay")
                .with_headers(**{"Content-Type": "application/json",
                                 "token": "$token"})
                .with_json({"orderId": "$orderId", "payAmount": "6.9"})
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal("body.success", "true")
        ),
    ]

用戶手冊

https://dongfanger.gitee.io/blog/chapters/tep.html

聯繫我

https://dongfanger.gitee.io/blog/more.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章