Python+Pytest+Allure+Yaml接口自動化測試框架詳解
編撰人:CesareCheung
更新時間:2024.06.20
一、技術棧
Python+Pytest+Allure+Yaml+Jenkins+GitLab
版本要求:Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0
二、環境配置
- 安裝python3.7,并配置Pycharm運行環境為python3.7
- 安裝allure并配置好環境變量
- 安裝依賴包 pip install -r requirements.txt
三、自動化思路
通過請求方法封裝及環境配置,用pytest框架運行讀取testcase文件測試用例集,將參數傳入對應test_*用例執行器匯總并執行輸出allure測試報告
1)單個用例
2)多個用例
3)多用例上下游接口串聯傳參
4)用例執行(場景跑批)
5)測試報告
6)通知(郵件、企業微信)
四、項目結構:
框架目錄詳解
–common:公共方法包
--connect_db.py: SQL操作封裝
--get_path.py:獲取文件路徑方法
--logger_util.py:輸出日志方法
--parameters_until.py:傳參方式方法封裝
--requests_util.py:請求方式方法封裝
--yaml_util.py:yaml文件讀取寫入方法
–config: 配置包
--config.yml:配置文件,主要為域名ip地址配置及日志輸出級別--extract.yml:接口上下游串聯時,用例文件做參數化截取返回值后自動輸出保存到該文件
–data: 用于存放csv傳參文件包(可用可不用,具體根據實際情況)
--get_token.csv:存放csv文件參數
–logs: 日志輸出文件,會自動生成
–reports: 測試報告文件
–testcase: 測試用例文件集
--fenmi:項目測試用例--login.yml:接口參數傳參 # 如:- name: 1、獲取UUID# base_url: https://XXXXX.combase_url: ${get_base_url(base_fenmi_url)}request:method: geturl: /fenmi/codeheaders:Authorization: '{{access_token}}'params:Accept: application/json, text/plain, */*Accept-Encoding: gzip, deflate, br, zstdAccept-Language: zh-CN,zh;q=0.9Connection: keep-aliveextract:uuid: '"uuid":"(.*?)"'validate:- equals: {code: 200}- equals: {msg: "操作成功"} # 解釋:name:為接口名稱 base_url:讀取config.yml文件的域名IP request:請求參數 method:請求方式 url:接口地址 headers:請求頭,比如token,'{{access_token}}'為取上游接口返回值做變量進行參數化,做參數化為固定寫法'{{變量名}}' params: 請求參數,具體需要看接口請求傳參方式 extract:用于存在上下游接口關聯時對返回值進行取值,固定寫法,'"uuid":"(.*?)"'為正則表達式取值,也可用json提取,固定寫法'"變量名":正則表達式' validate:斷言 --test_fenmi.py: 單用例執行器,執行式傳入對應yaml文件地址即可import allureimport pytestfrom common.requests_util import Requestutilfrom common.parameters_until import read_file@allure.epic('XX互聯')@allure.feature('登錄并查詢服務收入細項列表數據')class Testrequests:# 獲取access_token(get請求)@allure.story('獲取uuid并登錄獲取token')@allure.severity("normal")@pytest.mark.parametrize("caseinfo",read_file('/testcases/fenmi/login.yml'))def test_get_token(self,caseinfo):allure.dynamic.title(caseinfo['name'])allure.dynamic.description(caseinfo['name'])Requestutil().analysis_yaml(caseinfo)
–all.py: 主運行程序
–conftest.py: 測試配置工具,clean_extract方法為重跑時清除原文件數據
–debugtalk.py:自定義函數,用于存放公共函數和變量的文件
–environment.properties:用于生成allure測試報告時,配置展示環境數據
–pytest.ini: pytest測試運行配置文件,用于配置pytest運行時指定一些參數
[pytest]
addopts = -vs --alluredir=reports/temp --clean-alluredir 運行時清除原先的測試報告及臨時文件
; testpaths = testcases/fenmi 執行單個項目測試文件時可選一個testcase目錄
testpaths = testcases/fenmi testcases/weixin testcases/Zgen 執行多個項目測試文件時可選多個testcase目錄
python_files = test_*.py 執行的文件,及測試用例
python_classes = Test* 執行對應測試用例目錄所有Test開頭的類
python_functions = test_* 執行對應類下所有的test開頭的方法
五、用例集
1)Yaml用例文件說明:
2)用例執行文件說明:
3)CSV文件用例讀取:
data參數:
Yaml文件參數化:
4)testcase文件:為用例集可在用例集新增對應測試項目可按對應項目命名
5)yaml文件:為對應接口請求參數,可在yaml文件添加一條或者多條用例請求參數
6)test_*.py文件:通過pytest框架封裝讀取yaml文件參數并可運行的用例運行器
六、接口自動化框架規則
1.必須有的四個一級關鍵字:name,base_url,requests,validate
2.request關鍵字必須包含兩個二級關鍵字:method,url
3.傳參方式:在request一級關鍵字下,通過二級關鍵字參數傳參。
如果是get請求,通過params傳參。如:
params:grant_type: client_credentialappid: XXXXXsecret: XXXX
如果是post請求:傳json格式,通過json關鍵字傳參。如:json: {"tag": {"id": 100, "name": "XXXaaa" }}傳表單格式,通過data關鍵字傳參。如:data:{"tag": {"id": 100, "name": "XXXCaaa" }}傳文件格式,通過files關鍵字傳參。如:files:media: "E:/Tanzl.jpg"
4.如果需要做接口關聯,那么必須使用一級關鍵字:extract
提取:
如:json提取方式
extract:access_token: access_token
如:正則表達式提取方式
extract:access_token: '"access_token":"(.*?)"'取值:如:access_token={{access_token}}
5.熱加載,當yaml文件需要使用動態參數時,那么可以在debugtalk.py中寫方法調用。
注意:傳參時,需要什么類型的數據,需要做強轉。int(mix),int(max),如:# 獲取隨機數def get_random_number(self,mix,max):return random.randint(int(mix),int(max))熱加載取值:${get_random_number(100000,999999)}
6.此框架支持兩種斷言方式:分別是equals和contains斷言:
如:
validate:
- equals: {status_code: 200}
- equals: {expires_in: 7200}
- contains: access_token
7.數據驅動使用csv和一級關鍵字parameters實現:如:
yaml寫法:parameters:name-appid-secret-grant_type-assert_str: data/get_token.csv
csv寫法:name,appid,secret,grant_type,assert_str獲取access_token統一鑒權碼,wx9b755d429f6fb216,b963db0b97c8487b0cb920a240bd78e3,client_credential,access_tokenappid必填項檢查,"",b963db0b97c8487b0cb920a240bd78e3,client_credential,errcodesecret必填項檢查,wx9b755d429f6fb216,"",client_credential,errcode
8.config.yml日志監控,異常處理,以及基礎路徑的設置。
七、測試報告
1)測試報告概述
- 可進行篩選成功或失敗的用例
- 可查看該用例的詳情
- 測試套可查看對應測試模塊用例集合
- 功能模塊可查看對應場景化用例集合
2)測試報告詳情
可查看具體用例請求參數及返回報文
八、Jenkins拉取GitLab集成及運行
1)GitLab倉庫代碼
2)框架主運行程序改動點(如果沒有Jenkins沒報Allure不是內部命令可不改)
3)配置Jenkins環境變量及對應執行腳本
4)配置Allure測試報告
5)Jenkins拉取GitLab倉庫代碼及對應工作空間
6)運行構建項目