1. 程式人生 > 其它 >基於Pytest + Yaml + Allure 實現Http協議介面自動化

基於Pytest + Yaml + Allure 實現Http協議介面自動化

背景

  公司原本有自己的自動化測試框架,涵蓋了四個專案,採用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 import
get_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報告

願你走出半生,歸來仍是少年!