接口測試自動化好處
顯而易見的好處就是解放雙手??猿棉。
- 可以在短時間內(nèi)自動執(zhí)行大量的測試用例
- 通過參數(shù)化和數(shù)據(jù)驅(qū)動的方式進行測試數(shù)據(jù)的變化,提高測試覆蓋范圍
- 快速反饋測試執(zhí)行結(jié)果和報告
- 支持持續(xù)集成和持續(xù)交付的流程
使用Requests+pytest+allure搭建測試框架的目的
-
簡化接口測試編寫
Requests庫是 Python 的一個優(yōu)雅且簡單的 Http庫记盒,可以很方便地發(fā)送 http 請求掷豺,接收和處理接口返回的響應(yīng)數(shù)據(jù)
-
強大的斷言和校驗功能
Pytest 是一個功能強大的測試框架龄毡,提供豐富的斷言功能想诅,用于驗證接口響應(yīng)的正確性召庞。
-
美觀的測試報告
Allure是一個開源的測試報告生成工具,可以生成漂亮来破、交互式和易于理解的測試報告篮灼。
-
持續(xù)集成
使用Requests+Pytest+Allure搭建的框架可以與持續(xù)集成和自動化流程集成,實現(xiàn)快速的接口測試徘禁。
搭建過程
環(huán)境準備
-
安裝requests诅诱、pytest、allure的方法
pip install requests
pip install pytest
pip install allure-pytest
requests送朱、pytest 的安裝很簡單娘荡,這里主要講講如何安裝 allure。
-
Windows 安裝 allure
java 安裝
-
下載JDK
首先我們需要下載 java 開發(fā)工具包 JDK骤菠,,在下載頁面中根據(jù)自己的系統(tǒng)選擇對應(yīng)的版本疤孕,本文以 Window 64位系統(tǒng)為例:
下載后工具包 jdk 后根據(jù)提示進行即可商乎,安裝 jdk 的時候也會安裝 jre,一并安裝就可以了祭阀。安裝過程中可以自定義安裝路徑等信息鹉戚,我選擇的安裝目錄為 D:\Program Files \
-
配置環(huán)境變量
安裝完成后哦,搜索框輸入”編輯系統(tǒng)環(huán)境變量“专控。(或"此電腦"抹凳,右鍵后選擇"屬性",選擇"高級系統(tǒng)設(shè)置"
-
在系統(tǒng)屬性里伦腐,點擊"環(huán)境變量"
在系統(tǒng)變量中設(shè)置屬性 JAVA_HOME
3. PATH 設(shè)置
%JAVA_HOME%\bin;
%JAVA_HOME%\jre\bin;
allure 命令行工具安裝
allure命令行工具 allure是一個命令行工具赢底,需要去github上下載最新版 github.com/allure-fram…
下載完成后,解壓,我是放在D盤
把bin目錄添加到環(huán)境變量Path下
注意: cmd命令行運行 java幸冻、javac粹庞、allure可能表現(xiàn)安裝未成功,出現(xiàn)這種情況時可以先選擇重啟試試洽损。
框架整體結(jié)構(gòu)
名稱 | 說明 |
---|---|
api | api |
config | 配置文件庞溜,存放setting.ini配置文件,主要配置接口域名和mysql數(shù)據(jù)庫信息 |
core | request 請求方法封裝碑定、關(guān)鍵字返回結(jié)果類 |
data | 存放測試用例數(shù)據(jù) |
log | 日志 |
report | 測試報告數(shù)據(jù) |
testcase | 測試方法 |
utils | 工具類 |
pytest.ini | pytest 配置文件流码,為運行項目的相關(guān)參數(shù) |
requirements.txt | 相關(guān)依賴包及版本 |
測試代碼運用了代碼分層思想,具體往后看延刘。
- 在testcases文件夾中漫试,不做接口請求和返回值的操作,用一個方法A代替访娶,參數(shù)為請求參數(shù)
- 方法A中調(diào)用B方法商虐,B方法接收組裝好的參數(shù)(包含headers)
- B方法調(diào)用C方法,C方法接收請求參數(shù)崖疤,參數(shù)為接口路徑(不包含域名)和 **kwargs(接收B方法中組裝好的參數(shù)) C方法參數(shù)為url秘车,接口請求參數(shù): **kwargs
測試用例
創(chuàng)建測試文件并編寫測試方法
(1).py測試文件必須以“test ”開頭(或“ test”結(jié)尾)
(2)測試方法必須以“test_”開頭
(3)測試類必須以Test開頭
- 使用 Pytest 提供的裝飾器 “@pytest.mark” 來標記測試用例,其中“@pytest.mark.parametrize ”用于參數(shù)化測試用例劫哼,通過裝飾器可以將多個參數(shù)傳遞給測試函數(shù)叮趴。
- @allure.feature("") 是Allure插件提供的一個裝飾器,用于定義測試報告中的feature(敏捷開發(fā)場景)权烧。通過使用該裝飾器眯亦,可以將測試用例按照功能模塊進行分類展示般码,提供測試報告可讀性妻率。
如下是用戶登錄的一個例子,test_get_token 函數(shù)被標記為參數(shù)化測試用例板祝,通過”@pytest.mark.parametrize“傳遞一個參數(shù)data和對應(yīng)的值宫静。在測試函數(shù)中,可以直接使用傳遞的參數(shù)進行測試邏輯券时,驗證請求接口返回是否通過孤里,斷言返回狀態(tài)和登錄令牌。
## test_user.py
@allure.feature("用戶模塊")
class TestUser:
@pytest.mark.parametrize("data", get_data()['user_login'])
@allure.story("登錄-獲得token")
@allure.title("登錄獲取令牌測試用例")
def test_get_token(self,data):
result = login(data)
assert result['body']['success'] is True
assert len(result['body']['accessToken']) != 0
發(fā)送請求和處理響應(yīng)
調(diào)用requests庫發(fā)送http請求橘洞,將data參數(shù)中的請求方式捌袜、參數(shù)和請求體通過調(diào)用 api_util_new.do_request()發(fā)送請求,使用response接收接口請求的響應(yīng)結(jié)果炸枣,并將響應(yīng)結(jié)果處理后返回虏等。
def login(data):
"""
獲取令牌
:param json_data
:return:
"""
response = client_api.do_request(url=data['url'], method=data['method'], json=data['data'])
return process_response(response)
以下是對于接口請求響應(yīng)結(jié)果的處理弄唧,使用字典ResultResponse存儲處理后的response,檢查請求響應(yīng)狀態(tài)代碼以確定請求是否成功博其,并提取響應(yīng)內(nèi)容通過日志打印出來方便定位問題套才。
def process_response(response):
ResultResponse = {}
if response.status_code == 200 or response.status_code == 201:
ResultResponse['success'] = True
ResultResponse['body'] = response.json()
else:
ResultResponse['success'] = False
logger.info("請求狀態(tài)異常")
logger.info("響應(yīng)內(nèi)容>>>:" + json.dumps(response.json(), ensure_ascii=False))
return ResultResponse
封裝 HTTP 請求的類 "RestClient",在類方法 do_request() 中慕淡,使用 request() 方法接收接口url背伴,接口請求 method 和可選的其他關(guān)鍵字參數(shù)。在 request() 方法中峰髓,傳入的 method(GET傻寂、POST、PUT携兵、DELETE) 疾掰,使用 requests 庫發(fā)送相應(yīng)的 http 請求。
class RestClient:
def do_request(self, url, method,**kwargs):
return self.request(url, method, **kwargs)
def request(self, url, method, **kwargs):
if method == "GET":
return requests.get(self.api_root_url + url, **kwargs)
if method == "POST":
return requests.post(self.api_root_url + url, **kwargs)
if method == "PUT":
return requests.put(self.api_root_url + url, **kwargs)
if method == "DELETE":
return requests.delete(self.api_root_url + url, **kwargs)
client_api = RestClient()
數(shù)據(jù)驅(qū)動測試和校驗
- 通過 yaml 文件存放測試用例數(shù)據(jù)徐紧,如下user_login_body 為用戶登錄數(shù)據(jù)列表静檬,其中url為api地址,method 為請求方式并级,data為請求參數(shù)
user_login_body:
- url: /api/signin
method: POST
data: {
username: user
password: pwd
}
json轉(zhuǎn)yaml格式的方法網(wǎng)上一堆拂檩,比如 bejson,而校驗 yaml 書寫格式的工具嘲碧,可以使用 YamlLint
通過裝飾器 @pytest.mark.parametrize稻励,運行測試時會獲取測試用例的數(shù)據(jù)去執(zhí)行測試
-
校驗接口返回結(jié)果的正確性通常使用斷言來實現(xiàn)。根據(jù)接口返回的數(shù)據(jù)結(jié)構(gòu)愈涩,可以使用適當?shù)臄嘌院瘮?shù)來校驗各個字段的值是否符合預(yù)期望抽。
Pytest 支持使用 assert 關(guān)鍵字進行斷言assert 函數(shù),Pytest 提供了一些內(nèi)置的斷言函數(shù)
assertEqual(a, b)
assertTrue(x)
assertFalse(x)
assertIs(a, b)
assertIsNone(x)
assertIn(a, b)
assertNotIn(a, b)
報告生成展示
在命令行執(zhí)行命令:pytest
運行用例后履婉,會得到一個測試報告的原始文件煤篙,但這個時候還不能打開成HTML的報告,還需要在項目根目錄下毁腿,執(zhí)行命令啟動 allure
服務(wù)辑奈。下圖是個結(jié)果測試結(jié)果的展示示例。
allure測試報告框架是一個開源的測試報告生成工具狸棍,它提供了豐富的功能和靈活的配置選項身害,用于生成美觀味悄、可交互和易于理解的測試報告草戈。基本過程如下:
- 框架集成:通過與 Pytest 集成 侍瑟,利用 Pytest 框架提供的插件機制唐片,將測試結(jié)果和相關(guān)信息收集起來丙猬。
- 結(jié)果收集: allure 收集 Pytest 生成的測試結(jié)果數(shù)據(jù),結(jié)果數(shù)據(jù)中包括測試用例的執(zhí)行狀態(tài)费韭、斷言結(jié)果茧球、日志信息等。
- 報告生成: allure 使用收集到的數(shù)據(jù)轉(zhuǎn)換為 xml 格式星持,并利用報告模板和樣式表定義抢埋,渲染出漂亮的 html 文件。
持續(xù)集成
Jenkins中安裝Allure插件
Allure Jenkins Plugin
添加接口自動化測試的代碼
觸發(fā)規(guī)則我選擇的是準備發(fā)布打tag 后督暂,自動執(zhí)行構(gòu)建
cd ${WORKSPACE}
pytest
總結(jié)
本項目在實現(xiàn)過程中揪垄,把整個項目拆分成請求方法封裝、HTTP接口封裝逻翁、關(guān)鍵字封裝饥努、測試用例等模塊。
首先利用Python把HTTP接口封裝成Python接口八回,接著把這些Python接口組裝成一個個的關(guān)鍵字酷愧,再把關(guān)鍵字組裝成測試用例,而測試數(shù)據(jù)則通過YAML文件進行統(tǒng)一管理缠诅,然后再通過Pytest測試執(zhí)行器來運行這些腳本溶浴,并結(jié)合Allure輸出測試報告。