使用mongodb+pytest+allure+jenkins構建api介面自動化測試
一.介紹
之前學習robotframework的時候,知乎上有人推薦這個框架,高呼pytest大法好,正好最近要重構一個專案的服務端介面自動化測試框架。
學了一下,確實很好用,分享出來一個自己,希望有所幫助吧。
二.功能
+ 資料驅動
- 針對介面測試的特點(同一業務場景對某一功能介面各種引數請求校驗介面的返回)Mongo基於文件儲存,省去json序列化轉換操作,測試類+測試方法對映到Mongo中一個集合,集合中每一條資料依次執行測試方法中的業務邏輯。例如,使用各種不同的組合資料登陸,或購買各種規格,數量的商品。
- 下圖為專案中一組資料示例,利用pytest的pytest_generate_tests的hook 將資料庫中的對應的集合的資料賦值data和scm。
data作為資料,scm作為返回的校驗模板。
-
資料動態渲染
- 支援資料動態替換,如‘{{ DevToken }}’,替換變數,{% int %}替換為函式。
- {'tu': ['{{ val }}', {'newkey': '{{ val }}'}],
'key': {'str': '{% fake.pystr(max_chars=10) %}',
'phone': '{% fake.phone_number() %}',
'company': '{% fake.company() %}'}
}
------->
{'tu': [456, {'newkey': 456}],
'key': {'str': 'CxtMTqAhLY',
'phone': '13319170599',
'company': '精芯網路有限公司'}
}
-
Schema 模板使用
- 支援部分校驗,只校驗scm中有的key值
- 規則支援函式 例如
{
"data" : "{% str %}", #校驗返回的data是個字串物件
"traceID" : "{{ traceID }}", #校驗traceID相等
"message" : "token錯誤", #校驗返回的message
"code" : "00120112001",
"success" : false #校驗布林值等於false
}
-
優化配置檔案,
-
將不同環境的配置資訊儲存到config檔案,執行時通過不同的env引數(--env=online --env=test)載入不同的配置資訊到不同的環境執行測試,如host地址,使用者名稱密碼,等
三.可維護性
這樣分層組織的好處,提高了程式碼的複用,模組化之後,是測試邏輯更加突出。後期迭代有的介面引數如果有變動,只需要在project_lib中或者fixture中進行修改。testcase只關注業務邏輯。
testcase |
引用fixture組合出測試場景,針對特定介面功能的測試用例 |
scenario |
測試用例場景模組,根據不同粒度組合一些場景,如:測試訂單的操作,商家登陸商家上架一個商品,使用者新增商品提交訂單生成一個訂單。基於這個場景進行訂單的取消,結算的測試。 |
fixture |
Pytest中的類似xUnit的setUp和tearDown,配置scope=(session/class/function),使用起來更加靈活。 |
lib |
依產品線定製,新增介面公共引數,簽名演算法 特殊介面資料處理。 |
Req |
實現基本send方法,公共的資料渲染、返回校驗,列印日誌等方法 |
四.與jenkins結合
jenkins就沒什麼可說的了,安裝一個Allure的外掛。配置生成報告命令。
csdn這個破編輯頁面真特麼難用。就這樣把不想寫了,fuck。
五.程式碼
簡單的demo上傳到github。https://github.com/Be5yond/pytest_demo.git
---------------------------------------- 2018/10/27--------------------------------------------------
看到github有兄弟fork了這個專案,可能還是有點用的,更新一下吧。之前採用mongodb佐資料驅動是因為那個專案的開發設計的api引數巢狀太深,不好處理。結構比較好的介面一般都是格式差不多的,可以用excel來儲存測試資料,看起來更加直觀,對映方式也很簡單,測試類對應一個excel檔案,每一個方法對應一個sheet,sheet中的每一行就是一條testcase。
對於某些介面不需要關心的引數,在lib層使用DefaultData方法將預設引數填進去,避免測試資料檔案中很多重複的資料。
像呼叫get_test傳送請求parameter中會預設新增StartTIme,EndTime和Type引數。