接口測試
1.接口的概念
- 程序內部的接口:程序內部接口指同一程序或系統內不同模塊、組件或類之間的交互點,用于數據傳遞、功能調用或資源共享
- 系統對外的接口:是不同系統、模塊或服務之間進行交互的邊界定義,通常通過預定義的協議、數據格式和通信方式實現。它允許外部實體(如用戶、其他系統或第三方應用)與系統進行數據交換或功能調用,而無需了解內部實現細節
2.接口測試
接口測試是軟件測試的一種類型,專注于驗證不同系統、組件或服務之間的交互點(即接口)是否按預期工作。主要檢查數據傳輸、格式、協議以及業務邏輯的正確性,確保系統間通信的可靠性和穩定性。
接口測試重要性
接口就像軟件里的 “快遞通道”—— 前端、后端、不同系統之間傳數據、調功能,都得走這條道。接口測試,就是檢查這條 “通道” 通不通、安全不安全、能不能扛住壓力。
- 一是防 “鉆空子”,前端校驗(比如密碼長度限制)很容易繞開,接口測試能盯著后端,避免有人直接發惡意請求偷數據、非法登錄;
- 二是早排雷,后端接口做好就能測,不用等前端,發現問題早,改起來又快又便宜,總比上線后用戶用不了再修強;
- 三是保穩定,比如電商大促時,接口若沒測過并發,一多人用就崩,用戶付不了款、查不到訂單,損失就大了。
因此,接口測試的重要性就體現出來了
如何執行接口測試
通過接?設計?例
通過性驗證
通過性驗證確保接口在正常輸入條件下正確執行并返回預期結果,是接口測試的基礎。
基本功能測試
依據接口文檔定義的功能,使用符合要求的輸入參數進行測試。例如,獲取用戶信息的接口傳入已知存在的用戶ID“12345”,驗證返回的用戶名、年齡、聯系方式等數據是否準確。
驗證響應內容時需檢查狀態碼(如200)及響應數據的完整性和準確性。
參數組合
測試接口在不同參數組合下的表現,覆蓋參數間的相互影響和邊界情況。
參數排列組合
列出所有輸入參數及其取值范圍,通過笛卡爾積生成組合用例。例如文件上傳接口的“文件類型”(.docx、.pdf、.jpg)、“文件大小”(<1MB、1-10MB、>10MB)、“是否加密”(是/否)組合測試。
驗證每種組合下接口的行為,如文件上傳成功與否、加密設置是否生效。
邊界參數組合
關注參數邊界值及其組合。例如分頁查詢接口測試(頁碼=1,每頁數量=1)或(頁碼=最大值,每頁數量=最大值),避免越界錯誤。
結合業務邏輯測試邊界,如訂單金額滿減優惠的臨界值(99元、100元、101元)與其他參數組合,驗證優惠計算準確性。
接口安全
發現潛在安全漏洞,保護系統和用戶數據。
身份認證與授權
未授權訪問測試:不提供認證信息調用接口,驗證是否返回401錯誤。例如直接請求訂單詳情接口,檢查是否拒絕訪問。
權限繞過測試:用低權限用戶訪問高權限接口(如普通用戶調用刪除接口),驗證是否返回403錯誤。
認證信息過期測試:使用過期令牌調用接口,檢查是否返回“令牌過期”提示并阻止訪問。
數據安全
敏感數據加密測試:通過抓包工具檢查密碼等敏感數據是否明文傳輸,確保接口加密傳輸且服務器可正確解密。
SQL注入測試:在參數中注入惡意SQL,驗證接口是否拒絕執行并返回輸入不合法提示。
異常驗證
測試接口在異常情況下的處理能力,確保穩定性和健壯性。
輸入異常
參數缺失測試:逐一缺失必填參數(如注冊接口缺少郵箱),驗證是否返回明確錯誤(如“郵箱不能為空”)。
參數類型錯誤測試:傳入類型不符的參數(如字符串“abc”代替整型年齡),檢查是否提示“參數類型錯誤”。
非法字符測試:輸入特殊符號或亂碼,驗證接口是否拒絕并給出錯誤提示。
環境異常
網絡異常測試:模擬網絡延遲或中斷,觀察接口是否返回超時或連接失敗提示,并在恢復后正常工作。
服務器資源不足測試:限制內存/CPU使用率至90%以上,調用接口檢查是否返回“服務器繁忙”提示且系統無崩潰。
依賴服務異常測試:停用數據庫或第三方服務,驗證接口是否返回“服務不可用”提示而非錯誤數據或崩潰。
結合業務邏輯來設計?例
根據自己的系統設計測試用例,依據軟件系統所承載的實際業務流程、規則及需求,來構建具有針對性和有效性的測試用例。
接口化自動化測試
接口自動化測試是軟件測試中的一種方法,通過自動化腳本模擬客戶端與服務器之間的接口交互,驗證接口功能、性能和安全性。它能提高測試效率、減少人工錯誤,并支持持續集成。
接??動化流程
1.需求分析
分析請求:深入理解接口的功能、業務規則、輸入輸出要求等,明確測試范圍和重點。比如明確接?的URL、請求?法(如get、post、PUT、DELETE等)、請求頭、請求參 數和請求體等信息。
分析響應:確定接?返回的數據格式、狀態碼以及可能的錯誤信息。
2.挑選自動化接口
根據項目特點和需求,優先選擇穩定性高、變更頻率低且業務關鍵的接口進行自動化。
- 功能復雜度:優先選擇功能復雜、邏輯分?多的接?進??動化測試。
- ??險功能:選擇對業務影響?、?險?的接?進??動化測試,確保其穩定性和可靠性。
- 重復性?:對于需要頻繁執?的測試任務,如回歸測試中的接?測試,?動化測試可以避免重復? 動測試的繁瑣和低效,提?測試效率。
3.設計?動化測試?例
如果在功能測試階段已經設計了測試?例,可以直接拿來使?。?
如果無則根據接?需求和功能,設計正向測試?例(正常場景)和反向測試?例(異常場景),包括邊 界值測試、參數組合測試等。
4.搭建?動化測試環境
選擇合適的編程語言和開發工具,以及我們的設備的配置和網絡環境等
5. 設計?動化執?框架
設計?個框架來執?測試?例,包括報告?成、參數化處理和?例執?邏輯。
6. 編寫代碼
根據設計好的測試?例和框架,編寫?動化測試腳本。
7. 執??例
使?測試框架(如pytest)來執?編寫的測試?例。
8. ?成測試報告?
測試完成后,?成測試報告。可以使?pytest --html=report.html
?生成 HTML 格式報告
requests模塊
Python 的?requests
?庫是一個簡單易用的 HTTP 庫,用于發送各種 HTTP 請求(如 GET、POST),并處理響應數據。它簡化了網絡通信,是 Web 開發、API 調用和數據爬取的常用工具。
1.安裝
在python的終端中輸入命名行
pip install requests==2.31.0
2.Response 對象提供的屬性/?法介紹
屬性/方法 | 描述 |
---|---|
r.status_code | 響應狀態碼 |
r.content | 字節方式的響應體,會自動解碼gzip和deflate壓縮 |
r.headers | 以字典對象存儲服務器響應頭,若鍵不存在則返回None |
r.json() | Requests中內置的JSON解析方法,將響應體解析為JSON格式 |
r.url | 獲取實際請求的URL |
r.encoding | 編碼格式,根據響應頭部的字符編碼確定 |
r.cookies | 獲取服務器設置的cookies |
r.raw | 返回原始響應體,不進行任何處理 |
r.text | 字符串方式的響應體,會自動根據響應頭部的字符編碼進行解碼 |
r.raise_for_status() | 如果請求返回的狀態碼不是200,拋出HTTPError異常 |
常?請求?法
requests.get(url, params=None, **kwargs)
: 發送 GET 請求,用于獲取數據。requests.post(url, data=None, json=None, **kwargs)
: 發送 POST 請求,用于提交數據。requests.put(url, data=None, **kwargs)
: 發送 PUT 請求,用于更新資源。requests.delete(url, **kwargs)
: 發送 DELETE 請求,用于刪除資源。
代碼示例
r = requests.get("https://www.baidu.com")
#傳遞的時候進行參數的指定req_get = requests.request(url="https://www.baidu.com",method="GET")print(r)#打印狀態碼print(r.status_code)
# 打印響應體字符串格式print(r.text)
添加請求頭信息
請求接口常見參數的名稱、數據類型和描述:
參數名 | 數據類型/結構 | 描述 |
---|---|---|
url | 字符串 | 請求的目標接口地址 |
headers | 字典 | 包含要發送的HTTP頭部信息 |
cookies | 字典/列表/RequestsCookieJar | 包含需要隨請求發送的cookies |
files | 字典 | 包含需要上傳的文件信息 |
data | 字典/列表/字節串 | 包含請求體數據,用于表單提交或原始數據發送 |
json | 字典 | 自動序列化為JSON格式并作為請求體發送 |
params | 字典/列表/字節串 | 作為查詢字符串附加到URL末尾 |
auth | 元組 (用戶名, 密碼) | 用于HTTP基礎認證的憑據 |
timeout | 浮點數/元組 | 請求超時時間設置(單位:秒) |
proxies | 字典 | 配置代理服務器信息(如{'http': 'http://10.10.1.10:3128'} ) |
verify | 布爾值/字符串 | 控制SSL證書驗證(True 為默認驗證,False 跳過驗證,字符串指定CA路徑) |
代碼示例
需要加什么參數就寫什么
# 這里自己找網站嘗試
url = "****"data = {"username" : "zhangsan","password" : 123456
}req_post = requests.request(url=url , method= "POST",data=data)print(req_post.json())
?動化框架pytest
pytest 是 Python 的?個強?測試框架,?持單元測試、功能測試和 API 測試。它以簡潔的語法和豐富的插件系統著稱,適合從簡單到復雜的測試需求。
安裝 pytest
通過 pip 安裝 pytest:
pip install pytest
安裝后的解釋器變化
編寫測試用例
- ?件名必須以 test_ 開頭或者 _test 結尾
- 測試類必須以 Test 開頭,并且不能有__init__ ?法(初始化方法類似于java中的構造方法)
- 測試?法必須以test 開頭
class Test():def test01(self):print('the_Test01_test01')def test02(self):print('the_Test01_test02')
當滿?以上要求后,可通過命令?參數pytest 直接運?符合條件的?例。
pytest命令參數
pytest 常用命令行參數及其功能說明的表格(加粗的為常用):
命令 | 功能描述 | 備注 |
---|---|---|
pytest | 在當前目錄及其子目錄中搜索并運行測試 | 默認行為 |
pytest -v | 增加輸出的詳細程度(顯示每個測試用例的詳細信息) | |
pytest -s | 顯示測試中的 print 語句輸出(默認被捕獲) | |
pytest test_module.py | 運行指定的測試模塊 | |
pytest test_dir/ | 運行指定目錄下的所有測試 | |
pytest -k <keyword> | 只運行測試名包含指定關鍵字的測試 | 支持表達式(如 -k "not slow" ) |
pytest -m <marker> | 只運行標記為指定標記的測試(如 @pytest.mark.slow ) | 需預先標記測試 |
pytest -q | 減少輸出的詳細程度(靜默模式) | |
pytest --html=report.html | 生成 HTML 格式的測試報告 | 需安裝 pytest-html 插件 |
pytest --cov | 測量測試覆蓋率(默認統計當前目錄) | 需安裝 pytest-cov 插件 |
示例一:運?符合運?規則的?例
pytest
?例2:詳細打印,并輸?print內容
pytest -s -v
或者pytest -sv (
可以連寫)
?例3:指定?件/測試?例
#指定?件:pytest 包名/?件名pytest cases/test_01.py#指定測試?例: pytest 包名/?件名::類名::?法名pytest cases/test_01.py::Test::test_a
pytest配置?件
創建 pytest.ini ?件,該?件為pytest 的配置?件。
配置選項 | 作用描述 |
---|---|
addopts | 指定在命令行中默認包含的選項(如 -v 或 --tb=native )。 |
testpaths | 指定搜索測試的目錄列表(如 tests 或 integration_tests )。 |
python_files | 定義測試模塊的文件匹配模式(如 test_*.py 或 *_test.py )。 |
python_classes | 定義測試類的名稱前綴或模式(如 Test* 或 *Test )。 |
python_functions | 定義測試函數或方法的名稱前綴或模式(如 test_* 或 *_test )。 |
norecursedirs | 指定在搜索測試時應忽略的目錄(如 .* 或 node_modules )。 |
markers | 注冊自定義標記(如 slow 或 integration ),用于分類測試用例。 |
示例配置
在 pytest.ini
文件中使用上述配置:
[pytest]
addopts = -vs
testpaths = ./cases
python_files = test_*.py
python_classes = Test*
python_functions = test_*
前后置
在測試框架中,前后置是指在執?測試?例前和測試?例后執??些額外的操作,這些操作可以?于 設置測試環境、準備測試數據等,以確保測試的可靠性
- setup_method 和 teardown_method :這兩個?法?于類中的每個測試?法的前置和后置操作。
- setup_class 和 teardown_class :這兩個?法?于整個測試類的前置和后置操作。
- fixture :這是 pytest 推薦的?式來實現測試?例的前置和后置操作。靈活的控制和更強?的功能。
代碼示例1
class Test():def setup_method(self):print("setup_method: 準備執行測試方法 ")def teardown_method(self):print("teardown_method: 清理測試方法 ")def test01(self):print('the_Test01_test01')def test02(self):print('the_Test01_test02')
代碼示例2
class Test():def setup_class(self):print("setup_method: 準備執行測試方法 ")def teardown_class(self):print("teardown_method: 清理測試方法 ")def test01(self):print('the_Test01_test01')def test02(self):print('the_Test01_test02')
斷?
斷?( assert )是?種調試輔助?具,?于檢查程序的狀態是否符合預期。
assert 條件, 錯誤信息
代碼示例1,基本數據斷言
a = 1
b = 1
assert a == ba = 'hello'
b = 'hellw'
assert a == b
代碼示例2,列表斷言
a = ['a',2,'hello']
b = ['a',3,'hellw']
assert a == b
還有一個函數斷言和接口斷言就不示例了,懶~
參數化
參數化是一種通過將代碼或模型中的固定值替換為變量(參數)來實現靈活性和可復用的技術。
?例1:在?例上使?參數化
import pytest@pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6),("6*9", 42)])def test_eval(test_input, expected):assert eval(test_input) == expected
?例2:在類上使?參數化
@pytest.mark.parametrize('n,expected', [(1, 2), (3, 4)])
# pytestmark = pytest.mark.parametrize("n,expected", [(1, 2), (3, 4)])
# 全局變量賦值
class TestClass:def test_cases(self,n,expected):assert n + 1 == expecteddef test_cases1(self, n, expected):assert n*1 + 1 == expected
fixture
pytest 中的 fixture 是?種強?的機制,?于提供測試函數所需的資源或上下?。它可以?于設置測試環境、準備數據等。
fixture標記的?法調?
@pytest.fixture
def fixture_01():print('這是一個fixture標記的方法')
// 可作為參數使用
def test01(fixture_01):print('這里調用了fixture的方法')
#假設需要登錄狀態訪問其他頁的情況下
@pytest.fixture()
def login():print("我登錄了")def test_list(login):print('列表頁')def test_detail(login):print('詳情頁')
fixture嵌套
# 創建第一個fixture并返回a
@pytest.fixture
def first_entry():return "a"#創建第二個fixtrue并建立列表
@pytest.fixture
def order(first_entry):return [first_entry]# 添加一個b并加斷言觀察
def test_string(order):order.append("b")assert order == ["a", "b"]
yield fixture
yield fixture
?是一種特殊的裝置(fixture)實現方式。它通過?yield
?語句將裝置分為兩部分:設置階段和清理階段。裝置在?yield
?前的代碼屬于設置邏輯,yield
?后的代碼屬于清理邏輯。
#yield fixture
@pytest.fixture()
def login():print("我登錄了")yieldprint('我下線了')def test_list(login):print('列表頁')def test_detail(login):print('詳情頁')
帶參數的fixture
scope參數詳解
scope參數用于控制fixture的作用范圍,決定了fixture的生命周期。可選值包括:
- function(默認):每個測試函數都會調用一次fixture
- class:同一個測試類中共享這個fixture
- module:同一個測試模塊中共享這個fixture(一個文件里)
- session:整個測試會話中共享這個fixture
autouse參數
autouse參數默認為False。當設置為True時,每個測試函數都會自動調用該fixture,無需顯式傳入。
params參數
params參數用于參數化fixture,支持列表傳入。每個參數值都會使fixture執行一次,類似于for循環的效果。
ids參數
ids參數需要與params配合使用,為每個參數化實例指定可讀的標識符(給參數取名字)。
name參數
name參數用于為fixture顯式設置一個名稱。如果使用了name來引用,則在測試函數中需要使用這個名稱來調用fixture(給fixture取名字)。
@pytest.fixture(scope='class')
def login():print("我登錄了")yieldprint('我下線了')
class Testcase:def test_list(self,login):print('列表頁')def test_detail(self,login):print('詳情頁')
通過 params 實現參數化
@pytest.fixture(params=[1, 2, 3])
# request 是 pytest 提供的一個特殊對象,request.param 用于獲取當前 fixture 實例化時使用的參數值。
def num(request):return request.paramdef test_square(num):result = num * numassert result >= 0