Python接口自動化搭建過程置吓,含request請求封裝

接口測試自動化好處

顯而易見的好處就是解放雙手??猿棉。

  1. 可以在短時間內(nèi)自動執(zhí)行大量的測試用例
  2. 通過參數(shù)化和數(shù)據(jù)驅(qū)動的方式進行測試數(shù)據(jù)的變化,提高測試覆蓋范圍
  3. 快速反饋測試執(zhí)行結(jié)果和報告
  4. 支持持續(xù)集成和持續(xù)交付的流程
使用Requests+pytest+allure搭建測試框架的目的
  1. 簡化接口測試編寫

    Requests庫是 Python 的一個優(yōu)雅且簡單的 Http庫记盒,可以很方便地發(fā)送 http 請求掷豺,接收和處理接口返回的響應(yīng)數(shù)據(jù)

  2. 強大的斷言和校驗功能

    Pytest 是一個功能強大的測試框架龄毡,提供豐富的斷言功能想诅,用于驗證接口響應(yīng)的正確性召庞。

  3. 美觀的測試報告

    Allure是一個開源的測試報告生成工具,可以生成漂亮来破、交互式和易于理解的測試報告篮灼。

  4. 持續(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 安裝

  1. 下載JDK

    首先我們需要下載 java 開發(fā)工具包 JDK骤菠,,在下載頁面中根據(jù)自己的系統(tǒng)選擇對應(yīng)的版本疤孕,本文以 Window 64位系統(tǒng)為例:

 下載后工具包 jdk 后根據(jù)提示進行即可商乎,安裝 jdk 的時候也會安裝 jre,一并安裝就可以了祭阀。安裝過程中可以自定義安裝路徑等信息鹉戚,我選擇的安裝目錄為 D:\Program Files \
  1. 配置環(huán)境變量

    1. 安裝完成后哦,搜索框輸入”編輯系統(tǒng)環(huán)境變量“专控。(或"此電腦"抹凳,右鍵后選擇"屬性",選擇"高級系統(tǒng)設(shè)置"

    2. 在系統(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輸出測試報告。

【干貨分享】接口自動化測試-Pytest核心固件Fixture詳解以及應(yīng)用實戰(zhàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滴铅,一起剝皮案震驚了整個濱河市戳葵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汉匙,老刑警劉巖拱烁,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異噩翠,居然都是意外死亡戏自,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門伤锚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擅笔,“玉大人,你說我怎么就攤上這事屯援∶兔牵” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵狞洋,是天一觀的道長弯淘。 經(jīng)常有香客問我,道長吉懊,這世上最難降的妖魔是什么庐橙? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任假勿,我火速辦了婚禮,結(jié)果婚禮上态鳖,老公的妹妹穿的比我還像新娘转培。我一直安慰自己,他們只是感情好浆竭,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布浸须。 她就那樣靜靜地躺著,像睡著了一般邦泄。 火紅的嫁衣襯著肌膚如雪羽戒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天虎韵,我揣著相機與錄音易稠,去河邊找鬼。 笑死包蓝,一個胖子當著我的面吹牛驶社,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播测萎,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼亡电,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硅瞧?” 一聲冷哼從身側(cè)響起份乒,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腕唧,沒想到半個月后或辖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡枣接,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年颂暇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片但惶。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡耳鸯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膀曾,到底是詐尸還是另有隱情县爬,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布添谊,位于F島的核電站财喳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碉钠。R本人自食惡果不足惜纲缓,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喊废。 院中可真熱鬧祝高,春花似錦、人聲如沸污筷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓣蛀。三九已至陆蟆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惋增,已是汗流浹背叠殷。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诈皿,地道東北人林束。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像稽亏,于是被迫代替她去往敵國和親壶冒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容