1、什么是測試套件
測試套件是多個測試用例的集合。
2、搭建接口自動化框架中,你遇到最大的難點是什么,以及怎么解決的?
測試數據動態管理難點:
接口依賴動態參數(如Token、訂單ID),數據無法硬編碼.
解決方案:
使用關聯提取(如正則提取響應中的Token)結合Redis緩存動態數據,供后續用例復用。結果:實現跨用例數據傳遞,維護成本降低50%。
文件上傳/下載測試
難點:
上傳接口需處理多種文件格式(圖片、PDF),腳本難以通用化。
解決方案
封裝文件處理工具類,自動生成測試文件;使用multipart/form-data格式動態構造請求。結果:支持10+種文件類型測試,代碼復用率80%。
3、Python 自動化測試中,若需從 5000 條測試用例中篩選出 3000 條執行,pytest框架應該如何實現?
方法 一:使用標簽(Markers)篩選
適用場景:測試用例已按功能模塊、優先級等分類標記。
實現步驟:
1.標記測試用例
在代碼中使用 @pytest.mark 裝飾器標記需要執行的用例:import pytest@pytest.mark.smoke # 標記為冒煙測試def test login():assert True@pytest.mark.regression # 標記為回歸測試def test payment():assert True
2.執行特定標簽的用例:
使用 -m 參數運行指定標簽的用例:
pytest -m"smoke”# 執行所有標記為 smoke 的用例pytest -m "smoke or regression"# 執行 smoke 或 regression 標簽的用例
方法 二:關鍵字(Keyword)篩選
適用場景:測試用例名稱或類/模塊名包含特定關鍵詞。
實現步驟:
1.命名規范
確保用例名稱包含可識別的關鍵詞(如 api、ui_)
def test api login():
assert True
def test ui checkout():
assert True
2.使用 -k 參數篩選:
pytest -k"api "# 執行名稱包含"api"的用例
????????pytest -k"not ui " # 排除名稱包含"ui "的用例
方法 三:指定目錄/文件/類/方法適用場景:測試用例按目錄或文件組織。
實現步驟:
1.按目錄執行
pytest tests/api/ # 執行 api 目錄下的所有用例
2.按文件或類執行
pytest tests/test login.py #執行單個文件
pytest tests/test _payment.py::TestPayment #執行指定類
pytest tests/test login.py::test api login # 執行單個方法
方法 四:動態跳過測試用例適用場景:根據條件(如環境、配置)動態跳過用例。
實現步驟:
1.使用 skipif 標記
import pytest
@pytest.mark.skipif(env == "prod", reason="Not run in production")
def test dangerous operation():
assert True
4、說一下你是怎么做接口自動化的
? ? ? ? 一:先結合項目經驗講業務
? ? ? ? ? ? ? ? 結合項目講一下公司主要把什么核心的接口做成了接口自動化,并簡單的介紹下核心 的?業務場景。目的主要解決了回歸測試耗時長、降本增效等等。
? ? ? ? 二:講一下你怎么搭建的框架?用了哪些技術。
Requests? ? ?發起接口請求
Pytest框架? ?主要用來管理測試用例
數據驅動(通過外部數據文件或參數化方式管理測試數據)
????????參數化驅動?
使用代碼參數化或裝飾器(如pytest的@pytest.mark.parametrize
)直接在代碼中傳遞不同參數,適用于數據量較小的場景。
? ? ? ? 文件驅動
Excel文件通過??openpyxl用來讀取excel
logging? ? ? ? ? ? ?用來打印執行日志
allure? ? ? ? ? ? ? ? 生成測試報告
pymysql? ? ? ? ? ?操作數據庫
除此之外,還集成了jenkins,自動定時構建,并自動發送郵件等功能。
三.再講一下框架設計分層以及有什么亮點,難點?(怎么設計?過程中遇到什么問題怎么解決?)
比如:基于關鍵字驅動實現底層邏輯封裝,結合yaml,json,excel,mysql多種數據驅動形態實現接口測試數據管理,解決了數據依賴,接口關聯,斷言,參數化,自動失敗重試等問題
整體時間控制在3-4分鐘即可,不需要講如pytest各種框架細節,除非他后續專門問你這個框架怎么管理測試用例的,主要從宏觀角度講面即可。
(要熟悉數據驅動的實現邏輯,接口之間怎么關聯的、斷言、框架怎么管理測試用例的
pytest的細節知識:fixture,conftest,pytest.mark.parametrize
)即pytest的初始化和清理化與參數化。
5、接口自動化測試如何提升測試覆蓋率?
1.全面測試用例設計:根據接口的需求和功能,設計全面的測試用例,覆蓋所有的輸入和輸出情況,包括正常流程、異常情況和邊界值情況。這是提高測試覆蓋率的基礎。
2.數據驅動測試:通過使用數據驅動測試,可以用不同的測試數據來測試接口的不同場景這樣可以提高測試覆蓋率和準確性。
3.結合手工測試:結合手工測試可以發現接口自動化測試中無法覆蓋的測試場景,以提高測試覆蓋率和準確性。
4.定期回歸測試:定期運行自動化測試腳本進行回歸測試,以確保系統的穩定性和可靠性這也是提高測試覆蓋率的一個重要方面。
5.代碼覆蓋率工具:使用代碼覆蓋率統計工具如Jacoco或pytest-cov來監測代碼覆蓋率,并對未被覆蓋的代碼路徑進行測試,這樣可以更精確地知道測試的覆蓋情況,并針對性地補充測試用例。
6.持續集成:將接口自動化測試集成到持續集成(CI/CD)流程中,每次代碼提交后自動運行測試腳本并生成測試報告,以便及早發現和修復接口錯誤,這也有助于提高測試覆蓋率。?
?6、接口自動化測試中,經常需要對不同的測試數據進行測試。請描述你會如何實現測試用例的參數化,以便于能夠使用不同的輸入數據來執行相同的測試邏輯。
在自動化測試框架中,我主要使用Pytest(Python)的參數化功能,使用裝飾器(如@pytest.mark.parametrize
)將外部數據注入測試函數。數據源可以是代碼內列表、CSV文件、數據庫或JSON文件,確保數據易于擴展。框架自動遍歷所有數據組合執行測試,并生成詳細報告。
? ? ? ? 比如在銀行信貸項目中,我經常測試貸款申請接口(如/api/loan/apply
)。該接口需要輸入貸款金額、期限、用戶信用評分等參數。
import pytest
import requests# 定義測試數據:每個元組代表一個測試用例,包含輸入參數和預期響應
test_data = [# 正常場景:低金額、短期限,預期批準(10000, 12, 700, 200, {"status": "approved", "interest_rate": 5.0}),# 邊界場景:最小貸款金額,預期批準(500, 6, 650, 200, {"status": "approved", "interest_rate": 6.0}),# 異常場景:高金額但低信用評分,預期拒絕(50000, 24, 550, 200, {"status": "rejected", "reason": "insufficient_credit"}),# 錯誤場景:無效期限,預期錯誤響應(10000, 0, 700, 400, {"error": "invalid_term"}),
]# 使用pytest.mark.parametrize參數化測試函數
@pytest.mark.parametrize("amount, term, credit_score, expected_status, expected_response", test_data)
def test_loan_application(amount, term, credit_score, expected_status, expected_response):"""測試貸款申請接口:參數化不同輸入數據,驗證接口邏輯。"""# 構建請求數據url = "https://api.bank.com/loan/apply"headers = {"Authorization": "Bearer token"}payload = {"amount": amount, # 貸款金額"term": term, # 貸款期限(月)"credit_score": credit_score # 用戶信用評分}# 發送請求response = requests.post(url, json=payload, headers=headers)# 驗證響應狀態碼assert response.status_code == expected_status, f"預期狀態碼 {expected_status},實際 {response.status_code}"# 驗證響應內容response_data = response.json()for key, value in expected_response.items():assert key in response_data, f"響應缺少字段 {key}"assert response_data[key] == value, f"字段 {key} 預期 {value},實際 {response_data[key]}"
- 參數化裝飾器:
@pytest.mark.parametrize
定義了參數名稱(如amount
,?term
)和數據源test_data
。Pytest自動遍歷每個數據組合執行測試。 - 數據源:
test_data
是一個列表,每個元素是一個元組,包含輸入參數和預期輸出。在真實項目中,我會從CSV或數據庫加載數據,便于團隊協作。 - 測試邏輯:函數
test_loan_application
是通用的:發送請求、驗證響應狀態碼和內容。邏輯固定,但數據變化。
- 在測試信用評估接口時,我參數化了用戶類型(如新用戶、老用戶)、收入水平等,覆蓋了不同風險等級。
- 例如,測試高額貸款時,添加了邊界值如最大允許金額(如100萬),確保系統拒絕超額請求。
- 使用CSV文件管理數據:我將測試數據存儲在外部文件(如
loan_test_data.csv
),通過Pytest插件讀取,實現數據與代碼分離。
參數化不僅用于正向測試,還用于負向測試和性能測試
- 數據驅動設計:
- 使用外部文件(如CSV、Excel)存儲測試數據,便于業務分析師或QA更新數據。例如,在測試還款計劃接口時,我創建了包含不同還款頻率(月付、季付)的數據文件。
- 在Python中,使用
pytest
結合pandas
讀取CSV:import pandas as pd; test_data = pd.read_csv('test_data.csv').values.tolist()
。
- 覆蓋多樣化場景:
- 邊界值分析:參數化最小/最大值,如貸款金額下限(500元)和上限(系統允許的最大值)。
- 異常處理:測試無效輸入(如負利率或空字段),驗證接口錯誤處理邏輯。
- 業務規則驗證:在信貸項目中,參數化信用評分閾值(如<600分拒絕),確保風控規則生效。
- 優勢:在最近一個項目中,參數化幫助我將測試用例從50個減少到10個核心邏輯,執行時間縮短40%,同時覆蓋率從70%提升到95%。
- 挑戰:數據管理需謹慎,如確保敏感數據(用戶ID)脫敏。我使用Mock服務或測試環境專用數據來避免生產風險。
7、假設你正在參與一個項目的接口自動化測試,并且測試數據存儲在一個Excel文件中。請描述你會如何封裝一個Python函數來讀取這個Excel文件中的數據,并確保它可以在你的自動化測試腳本中被復用。
????????測試數據存儲在Excel文件中時,封裝一個可復用的Python函數是關鍵。這能提高代碼的可維護性、減少重復代碼,并確保測試腳本高效運行。以下是我推薦的步驟和方法,基于Python的標準庫和最佳實踐。我會選擇pandas
庫來處理Excel文件,因為它簡單、高效,且支持多種數據格式
第一步為了確保函數可復用,我們需要:
- 輸入參數:文件路徑(必需)和工作表名稱(可選,默認為第一個工作表)。
- 返回值:返回一個DataFrame對象(pandas的數據結構),便于在測試腳本中直接使用數據(如迭代或參數化)。
- 錯誤處理:添加異常處理,避免因文件不存在或格式錯誤導致腳本崩潰。
代碼實現要了解
import pandas as pddef read_excel_data(file_path, sheet_name=0):"""讀取Excel文件中的數據并返回DataFrame。參數:file_path (str): Excel文件的路徑(例如:'data/test_data.xlsx')。sheet_name (str or int, optional): 工作表名稱或索引,默認為0(第一個工作表)。返回:pandas.DataFrame: 包含測試數據的DataFrame對象。異常:如果文件不存在或讀取失敗,拋出FileNotFoundError或ValueError。"""try:# 使用pandas讀取Excel文件data = pd.read_excel(file_path, sheet_name=sheet_name)return dataexcept FileNotFoundError:raise FileNotFoundError(f"文件未找到: {file_path}")except Exception as e:raise ValueError(f"讀取Excel文件失敗: {e}")# 示例使用(在測試腳本中調用)
# test_data = read_excel_data('test_data.xlsx', sheet_name='API_Test')
# print(test_data.head()) # 輸出前幾行數據
- 導入函數:將函數保存在一個模塊文件(如
data_reader.py
),然后在測試腳本中導入。 - 直接使用數據:返回的DataFrame可以直接用于參數化測試。例如,使用
pytest
框架時,可以結合@pytest.mark.parametrize
實現數據驅動測試。
import pytest
from data_reader import read_excel_data # 導入封裝好的函數# 讀取測試數據
test_data = read_excel_data('path/to/test_data.xlsx', sheet_name='TestCases')# 參數化測試用例
@pytest.mark.parametrize("input_data, expected_output", test_data[['Input', 'Expected']].values)
def test_api_endpoint(input_data, expected_output):# 模擬接口調用和斷言response = call_api(input_data) # 假設call_api是自定義的接口調用函數assert response.status_code == expected_output
???????增強復用性的建議
- 處理多工作表:函數支持
sheet_name
參數,可以讀取特定工作表(如sheet_name='Sheet1'
或索引)。如果需要讀取所有工作表,可以修改函數返回字典(鍵為工作表名,值為DataFrame)。 - 數據清洗:如果Excel數據包含空值或格式問題,可以在函數中添加預處理邏輯(如
data.fillna(0)
填充空值)。 - 性能優化:對于大型Excel文件,使用
pandas
的dtype
參數指定列類型以提高讀取速度。 - 錯誤日志:添加日志記錄(如
logging
模塊),便于調試失敗原因。
????????好處總結
通過這種封裝:
- 代碼復用:避免在每個測試腳本中重復編寫讀取邏輯。
- 可維護性:如果Excel格式變化,只需修改一個函數。
- 可靠性:錯誤處理確保自動化測試在文件異常時不會中斷。
- 擴展性:易于集成到CI/CD流程中(如Jenkins)。
8、Python自動化中,unittest框架中setUp和tearDown方法的區別是什么?
??????????1.setUp 方法在每個測試方法執行前被調用,常用于測試前的準備工作,如創建測試環境.
初始化變量等。
2.tearDown 方法在每個測試方法執行后被調用,常用于測試后的清理工作,如刪除測試創建的文件、釋放資源等。
9、接口自動化中,請求頭參數(Headers)、POST請求的data(如JSON、表單等)的處理方式通常遵循數據驅動和可維護性原則,通過參數化和配置化管理實現靈活復用
1. 請求頭參數(Headers)的處理
場景分類
通用頭部(如
Content-Type
、User-Agent
):全局配置,所有接口共用。動態頭部(如
Authorization
令牌):需實時生成或從響應中提取。接口特定頭部(如自定義簽名):個別接口獨有。
處理方式
YAML/JSON配置文件
將頭部參數按環境(測試/預發/生產)或接口類型分類存儲:# config/headers.yaml default:Content-Type: "application/json"User-Agent: "AutoTest/1.0" auth_required:Authorization: "${token}" # 動態替換變量
代碼封裝
封裝頭部生成邏輯,避免重復代碼:def get_headers(auth=False):base = load_yaml("config/headers.yaml")["default"]if auth:base.update({"Authorization": get_token()})return base
POST請求的data(JSON/表單)的處理
數據組織方式
模板化
使用模板文件(如Jinja2)或JSON Schema定義請求體結構,動態填充變量:// templates/login.json {"username": "${username}","password": "${password}","timestamp": "${current_time}" }
數據驅動
通過CSV/Excel/YAML文件存儲測試數據,實現參數化:同7、動態生成
對需實時計算的數據(如簽名、時間戳),在代碼中動態生成:?payload = {"username": "test1","password": hash_password("pass123"),"sign": generate_sign("test1pass123") }
import requests from utils.data_handler import load_test_data, render_templatedef test_login():# 加載測試數據test_data = load_test_data("login.csv")[0] # 取第一組數據# 渲染請求體模板payload = render_template("templates/login.json", test_data)# 發送請求response = requests.post(url="https://api.example.com/login",headers=get_headers(auth=False),json=payload)assert response.status_code == test_data["expected_code"]
環境隔離
通過環境變量或配置文件區分不同環境的參數(如URL、數據庫配置):# config/env.yaml dev:base_url: "https://dev.api.com" prod:base_url: "https://api.example.com"
4. 工具框架集成示例
Pytest + Requests
使用pytest
的fixture
管理參數:@pytest.fixture def auth_headers():token = login_and_get_token()return {"Authorization": f"Bearer {token}"}def test_user_profile(auth_headers):response = requests.get("/profile", headers=auth_headers)
通過以上方法,接口自動化可以實現低耦合、高復用的參數管理,適應復雜業務場景和快速迭代需求。?