一、概述
介面自動化測試是軟體開發過程中的重要環節,旨在驗證不同模組之間或者系統與外部系統之間的資料交換是否符合預期。編寫高效、穩定且易於維護的介面自動化指令碼對於提升測試效率和產品質量具有重要意義。以下為一套通用的介面自動化指令碼設計規範:
二、設計原則
- 模組化設計:將指令碼按照業務功能進行模組劃分,每個模組對應一組相關的介面測試用例,便於程式碼複用和管理。
- 結構清晰:使用良好的程式設計習慣,保證指令碼結構清晰,註釋詳盡,以便於其他團隊成員理解和維護。
- 獨立性:指令碼應具備較好的獨立執行能力,儘量減少對環境和其他指令碼的依賴。
- 可配置性:介面地址、請求引數等資訊應透過配置檔案或變數來獲取,以適應不同的測試環境和場景。
- 異常處理:充分考慮各種可能的異常情況並做好錯誤處理,確保指令碼在遇到問題時能夠給出明確的錯誤資訊,而不是直接中斷執行。
三、具體規範 - 結構組織
● common: 存放一些公共方法
● conf: 配置檔案
● report: 測試報告資料夾
● testcase: 測試用例資料夾
● run.py: 執行指令碼 - 測試框架選擇
● Python 的 requests + unittest - 請求構造
● 明確定義並記錄每個介面的請求方法(GET, POST, PUT, DELETE 等)、URL 及其引數。
● 使用引數化方式傳入請求體和 URL 引數,避免硬編碼。
● 對於複雜的請求頭和認證資訊,同樣需要妥善管理和封裝。
4.命名規範
● testcase命名採用test_+"介面名稱"的方式命名,介面名稱展示為駝峰式。如:test_getAllProject.py - 響應驗證
● 設計詳細的斷言來驗證響應狀態碼、返回結果的關鍵欄位及格式。
● 針對可能出現的多種響應結果,都要有相應的驗證邏輯。 - 日誌記錄
● 指令碼執行過程中應詳細記錄日誌,包括請求資訊、響應資訊、斷言結果等。
● 在出錯時能輸出足夠的除錯資訊,方便定位問題。 - 版本控制與持續整合
● 將指令碼納入版本控制系統,具體版本控制見程式碼倉庫中的README.md檔案。
四、樣例程式碼
"""
@File : test_GetAllProject1.py
@Project : CodeFit
@Time : 22/3/2024 17:20
@Author : *********
@Software : PyCharm Community Edition
"""
import unittest, os
from common.read_excel_over import Read
from common.handler_path import DATA_DIR
from common import myddt
from common.handler_log import log
from common.handler_cof import cfg
from usertools.request_main import RunMain
from testcase import fixture
@myddt.ddt
class TestGetAllProject(unittest.TestCase):
excel = Read(os.path.join(DATA_DIR, "testapi.xlsx"), "project")
data = excel.read_excel()
@classmethod
def setUpClass(cls):
"""登入獲取token"""
fixture.login_admin()
@myddt.data(*data)
def test_getallproject(self, case):
# 從表格讀出來的資料為str,用eval去掉
params = eval(case["data"])
url = cfg.get("env", "base_url") + case["url"]
headers = eval(cfg.get("env", "headers"))
# headers["Authorization"] = self.admin_token
# headers["X-Token"] = self.admin_token
expected = eval(case["expected"])
method = case["method"]
res = RunMain().run_main(url, method, headers, params)
print("預期結果:{}".format(expected))
print("實際結果:{}".format(res))
try:
self.assertEqual(expected['code'], res['code'])
self.assertEqual(eval(expected['success']), res['success'])
except AssertionError as e:
log.error("用例 {} 執行失敗,已寫入日誌".format(case['title']))
self.excel.write_data(row=case["case_id"] + 1, column=8, value="失敗")
raise e
else:
log.info("用例 {} 執行成功,已寫入日誌".format(case["title"]))
self.excel.write_data(row=case["case_id"] + 1, column=8, value="成功")