基於Pytest + Yaml + Allure 實現Http協議介面自動化
阿新 • • 發佈:2021-11-26
背景
公司原本有自己的自動化測試框架,涵蓋了四個專案,採用excel儲存用例,每個專案用的單元測試框架還不一樣,介面和UI都寫在了一起~~~
靈感來源
GitHub上的pytestDemo和 HttpRunner
目錄結構
base ==>> requests請求,返回結果類,測試資料物件化封裝
config ==>> 域名,固定變數,資料庫連結
public ==>> 測試資料處理,全域性變數替換,log,自定義異常類等公共方法
testcase ==>> 測試用例
data.yml ==>> 測試資料
parametrize_query.csv ==>> 引數化資料
用例設計
1.**侷限於pytest引數化形式 `@pytest.mark.parametrize` ,每個測試用例只能對應一個引數化檔案**
2.保證測試用例py檔案的簡潔,每個用例格式基本固定,程式碼量少
3.統一的YAML檔案格式
有依賴的引數化介面
有依賴的非引數化介面
4.引數化引用csv檔案
用例格式
import pytest from public.send_request import SendRequest from public.log import logger from public.sql_to_data import SqlToData from public.help importget_data_path, os, fun_name, report_setting, report_step_setting, allure data_path = get_data_path(os.path.dirname(__file__)) test_params = SqlToData().yaml_db_query(data_path) @allure.severity(allure.severity_level.TRIVIAL) @allure.epic(test_params.get("epic")) @allure.feature(test_params.get("feature")) class TestContinentInfo: def setup_class(self): self.extract = {} @pytest.mark.run(order=2) @pytest.mark.parametrize("data", test_params["test_page_query_case"].parametrize) def test_page_query_case(self, data): logger.info("*************** 開始執行用例 ***************") # 獲取執行用例函式名 name = fun_name() # 報告展示的測試步驟 report_step_setting(test_params[name]) test_params[name].parametrize = data result, self.extract, validate = SendRequest(test_params[name], self.extract).send_request() # 報告上展示的測試標題等 report_setting(test_params[name]) logger.info("*************** 結束執行用例 ***************\n")
有依賴的引數化介面 YAML格式
test_page_query_case:
case_step_1: # 依賴介面名稱<可隨意命名>,和引數化介面資料同級,可依賴多個,非必填
path: /login
method: POST
headers:
Content-Type: application/json
parametrize:
body:
username: wintest4
password: "123456"
extract:
token: $.login_info.token
username: $.login_info.username
validate:
- [ comparator: equal, check: msg, expect: 恭喜,登入成功!, jsonpath: "$.msg"]
story: 用例--登入介面測試
title: 登入介面測試-預期成功
step: 登入介面測試
description: 該用例是針對 登入介面 的測試
path: /get/user
method: get
headers:
Content-Type: application/json
token: $token
username: $username
parametrize: ${parametrize.csv} # csv檔案引數化
body:
extract:
id: $.data[0].id
validate:
story: 用例--查詢某個使用者資訊介面測試-流程
title: 查詢某個使用者資訊介面測試-預期成功-流程
step: 查詢某個使用者資訊介面測試-流程
description: 該用例是針對 查詢某個使用者資訊介面 的測試-流程
sql:
sql_country_page: SELECT COUNT(*) AS num FROM BAS_COUNTRY bc
epic: 測試demo
feature: 測試demo
有依賴的非引數化介面 YAML格式
test_demo_info_case:
login:
path: /login
method: POST
headers:
Content-Type: application/json
parametrize:
- [ ]
body:
username: wintest4
password: "123456"
extract:
token: $.login_info.token
username: $.login_info.username
validate:
- [ comparator: equal, check: msg, expect: 恭喜,登入成功!, jsonpath: "$.msg"]
story: 用例--登入介面測試
title: 登入介面測試-預期成功
step: 登入介面測試
description: 該用例是針對 登入介面 的測試
query:
path: /users/$username
method: get
headers:
Content-Type: application/json
token: $token
username: $username
parametrize:
body:
extract:
validate:
- [ comparator: equal, check: msg, expect: 查詢成功, jsonpath: "$.msg"]
story: 用例--查詢某個使用者資訊介面測試
title: 查詢某個使用者資訊介面測試-預期成功
step: 查詢某個使用者資訊介面測試
description: 該用例是針對 查詢某個使用者資訊介面 的測試
引數化csv檔案格式
引數欄位和斷言欄位之間空一格
allure報告
願你走出半生,歸來仍是少年!