構建高效的接口自動化測試框架思路
在選擇接口測試自動化框架時,需要根據團隊的技術棧和項目需求來綜合考慮。對于測試團隊來說,使用Python相關的測試框架更為便捷。無論選擇哪種框架,重要的是確保 框架功能完備,易于維護和擴展,提高測試效率和準確性。今天勇哥介紹一個基于Python的接口自動化測試框架,結合了Python的Unittest框架、Requests庫以及數據驅動思想,幫助您更好地實現接口測試。
1. 接口自動化測試項目框架簡介
搭建接口自動化測試框架的技術棧如下:
- 語言:Python,簡潔高效,上手容易,無壓力;人生苦短,我用 python;
- 測試框架:Unittest,封裝自定義斷言方法進行驗證,如:eq\lt\lte\gt\gte\neq\str_eq等等;
- 接口調用:Requests庫,提供不同的HTTP請求方法,支持session和cookies,支持失敗請求重發等;
- 數據驅動:數據驅動測試(DDT),以用例數據來生成測試用例;
- 數據管理:Openpyxl,用于進行Excel數據的讀寫,同時支持CSV、JSON、YAML、TXT等數據格式;
- 依賴管理:封裝各類強大的工具庫,如正則、jsonpath、字典取值的方式獲取請求數據、響應數據;
- 變量管理:封裝全局變量,臨時變量,環境變量,動態管理各類變量,動條調用函數,前后置腳本等;
- 動態腳本:封裝PM對象,讓動條變量除了可以使用{{args}} 或{{func(*args,**kwargs)}}的方法使用變量外,還要能夠類似postman一樣靈活編寫python動態代碼;
- 數據庫交互:PyMySQL,根據不同數據庫選擇相應的第三方模塊來完成交互;
- 數據格式轉換:Eval,JSON,用于將數據在不同格式之間進行轉換;
- 日志處理:Logging,統一日志輸出格式,記錄渠道、級別和執行結果,便于問題定位;
- 持續集成:Jenkins,通過配置定時執行測試用例、查看測試通過率,解決重復發版帶來的重復工作,并使用插件unittestreport生成HTML報告和發送郵件;
2. 接口測試流程
接口測試步驟可以概括如下:
- 獲取接口文檔:首先要與開發團隊協作,獲取接口文檔,了解每個接口的功能和參數要求。
- 設計接口測試用例:根據接口文檔,設計接口測試用例,覆蓋正常場景、異常場景以及邊界值等情況。
- 編寫接口測試代碼:使用Python Unittest框架,結合Requests庫發起接口調用,并在測試用例中進行斷言驗證。
- 執行接口測試用例:執行編寫好的接口測試用例,對接口進行驗證。
- 發現問題與跟蹤:如果發現接口問題,及時記錄并提交至缺陷管理平臺,與開發團隊協作解決問題。
- 性能測試:對接口的并發情況和響應時間進行測試,確保接口性能滿足要求。
3. 接口測試用例設計
接口測試用例設計要從以下幾個方面入手:
- 正常場景驗證:保證接口按照需求返回正確結果,根據接口文檔的參數要求傳入合適的數據,驗證接口返回結果是否符合預期。
- 參數組合驗證:對于接口有多個參數的情況,驗證不同參數組合下接口的行為是否正確,包括必填和可選參數的組合。
- 異常驗證:測試接口對異常情況的處理,例如輸入異常值、多輸入、少輸入參數等,確保接口能正確處理異常情況并返回合理結果。
- 安全性驗證:對于涉及安全的接口,例如登錄接口,驗證用戶名和密碼的加密是否安全可靠。
- 性能測試:測試接口的并發情況和響應時間,確保接口能在高負載下穩定運行。
4. 接口測試執行中的數據庫校驗
為了確保接口返回的數據與數據庫中的數據一致或者業務流程腳本編寫,有時候需要使用數據庫:
- 數據庫預置數據:在測試前,可以預先在數據庫中插入需要的測試數據,然后接口測試用例執行時,校驗接口返回的數據與預置的數據是否一致。
- 接口調用比對:接口測試用例執行時,通過調用數據庫查詢的方式,獲取接口需要的數據,然后與接口返回的數據進行比對,確保一致性。
- 數據清理:在接口測試用例執行完畢后,進行數據清理,將測試過程中產生的垃圾數據從數據庫中刪除,以保持數據庫的干凈和整潔。
- 流程數據預埋:執行某些接口前,先插入固定數據,流程開始后讀取固定數據,實現業務流的運轉,最好再刪除數據。
5. 接口測試質量評估標準
接口測試的質量評估八股文如下:
- 業務功能覆蓋是否完整:確認接口測試用例是否覆蓋了所有的業務功能點。
- 業務規則覆蓋是否完整:檢查接口測試用例是否涵蓋了所有的業務規則和邊界情況。
- 參數驗證是否達到要求:驗證接口對不同參數的處理是否符合預期,包括參數邊界和業務規則。
- 接口異常場景覆蓋是否完整:測試接口在異常情況下的處理是否正確,確保系統在異常情況下能正確穩定運行。
- 接口覆蓋率是否達到要求:確認接口測試用例是否覆蓋了所有接口,包括不同的場景和輸入組合。
- 代碼覆蓋率是否達到要求:檢查接口測試代碼的覆蓋率,確保所有關鍵邏輯都得到驗證。
- 性能指標是否滿足要求:對接口的性能進行測試,確保在高負載下接口仍能穩定運行。
- 安全指標是否滿足要求:驗證接口的安全性,確保數據傳輸和存儲的安全性。
6. 接口測試中依賴第三方數據的處理
如果依賴第三方數據的接口有時候難以直接調用接口處理時,可如下處理:
- 使用Mock工具:利用Mock工具(如:JSON Server、Easy Mock)模擬第三方數據接口的返回數據,降低對第三方數據的依賴性,加快開發和測試速度。
- 編寫虛擬接口:在接口測試用例中,編寫虛擬接口,直接返回模擬的第三方數據,以達到測試的目的。
- 編寫代理接口:如果無法模擬第三方數據,可以編寫代理接口,將測試請求轉發到真實的第三方數據接口,并在接口測試用例中校驗代理返回的數據是否正確。
- 直接往數據庫中插入數據或者更改某條數據的信息,達到模擬第三方接口正常的情況。
- 如果有一些回調接口,直接利用第三方回調的參數格式修改某些變量,自己手動觸發回調修改數據,提高穩定。
7. 接口測試項目的數據管理
在接口測試項目中,不同類型的數據需要靈活地進行管理和存儲:
- Excel數據管理:對于較小規模的數據或者靜態數據,可以使用Excel來管理測試數據 (1萬條數據以內比較推薦)。Python中的Openpyxl庫可以很方便地讀取和寫入Excel數據,同時支持其他數據格式的轉換。
- yaml文件:對于非常小規模的數據或者配置文件數據,可以使用yam來管理測試數據 (數據量200以內可以考慮)。Python中yaml庫讀取和寫入yarm文件還是很方便的。同時這個文件可以注釋。
- 數據庫交互:對于大規模的數據或者需要頻繁變更的數據,可以使用數據庫來存儲測試數據。Python中的PyMySQL庫可以實現與數據庫的交互,方便數據的讀取和寫入。
- 數據驅動思想:數據驅動測試(DDT)是一種測試方法,通過讀取測試數據源來動態生成和執行測試用例。這種方式可以使得測試數據和測試用例分離,降低代碼的冗余。
- 數據緩存:在測試過程中,為了提高測試效率,可以將已經處理過的數據進行緩存,下次測試時直接使用緩存數據,避免重復請求或計算。
- 配置文件:一些接口測試中的配置信息,例如接口URL、賬號密碼等,可以單獨放在配置文件中,便于管理和修改。
8. 解決接口文檔缺失問題
遇到接口文檔缺失的情況,解決思路如下:
- 與開發溝通:與開發人員直接溝通,了解接口的參數和預期結果,根據開發人員提供的信息編寫測試用例。
- 抓包分析:通過抓包工具(如Fiddler、Wireshark)來分析接口的請求和響應,從中提取接口的參數和數據,以及接口的行為和返回結果。
- 數據庫查詢:對于接口數據存儲在數據庫中的情況,可以通過查詢數據庫來獲取接口的數據,并根據數據設計測試用例。
- 源碼接口分析:對于代碼能力強的童鞋,可以直接拉去開發的項目代碼去分析有哪些接口及參數去設計測試用例(有這個能力還寫個毛接口測試??)。
- 日志分析:通過日志查詢(如elk,tail)等等獲取接口的請求和響應,從而設計測試用例。
9. 自動化測試框架的好處
搭建一個自動化測試框架對于接口測試項目有很多好處:
- 提高測試效率:自動化測試可以快速執行大量測試用例,提高測試效率和執行速度。
- 減少重復工作:通過自動化測試,可以減少人工測試中的重復性工作,提高測試人員的生產力。
- 提高測試準確性:自動化測試可以避免人為因素對測試結果的影響,提高測試的準確性。
- 持續集成和持續交付:通過自動化測試框架,可以實現持續集成和持續交付,加快軟件的開發和交付速度。
- 靈活性和可擴展性:自動化測試框架可以根據項目的需要進行定制和擴展,適應不同項目的需求。
當然,很多童鞋會覺得市面那么多開源工具及框架,直接拿來主義使用就好,為啥還要自己整呢?嗯確實沒錯,但是在座的各位還是得考慮一下換工作(被迫換工作)時,坐在你對面的面試官要怎么應付吧...
10. 解決接口產生的垃圾數據
勇哥解決接口產生的垃圾數據常用解決思路如下:
- 數據庫回滾:在測試用例執行完成后,使用數據庫事務回滾將數據還原到測試前的狀態,確保數據不會對接口環境產生影響。
- 數據清理腳本:編寫數據清理腳本,定期執行數據清理操作,刪除過期或不再需要的測試數據,保持數據庫的整潔。
- 定時任務:設置定時任務,定期執行數據清理操作,避免測試數據過多導致數據庫性能下降。
- 自動化數據清理:在自動化測試框架中集成數據清理功能,確保每次測試執行后都能自動清理產生的垃圾數據。
- 接口閉環調用:對于有新增增刪改的接口,執行增改接口后,標記數據id等關鍵信息,在teardown 部分執行批處理調用刪除接口。
11. 針對第三方接口常見的測試思路
第三方接口這玩意不文檔,面試或者工作中遇到的還是比較多。勇哥挖箱底給大家一些思路:
- 使用Mock數據:可以使用Mock工具來模擬第三方接口的返回數據,以便于測試獨立進行,不受第三方數據影響。
- 數據備份與還原:在接口測試之前,先對第三方數據進行備份,測試完成后再進行數據還原,確保測試對第三方數據沒有實質性影響。
- 數據協調:與第三方數據提供方進行協調,請求提供穩定的測試數據,或者在測試時提供臨時的測試環境,避免影響到正式環境數據。
- 容錯設計:在測試時,要考慮到第三方數據不穩定的情況,設計容錯機制,使得接口在部分數據缺失或異常時也能正常運行,不影響整體測試流程。
- 日志監控:監控第三方數據接口的日志,及時發現異常情況,與第三方數據提供方溝通解決。
12. 如果控制接口在整個測試流程中只調用一次
如果有其他接口需要先獲取接口信息(例如登錄接口),而且希望登錄接口只調用一次,并在后續其他接口中使用該登錄憑證:
- 使用Fixture(Pytest)或Setup(Python unittest):在測試框架中,可以使用Fixture或Setup功能,在執行測試用例前,先執行登錄接口,并將登錄憑證保存到緩存中。后續其他接口執行前,先判斷登錄憑證是否存在,如果存在,則直接使用,不再重復調用登錄接口。
- 登錄接口與其他接口合并:將登錄接口與其他接口合并成一個測試用例,保證登錄接口在其他接口調用之前執行,且只執行一次。這樣可以確保登錄憑證在后續其他接口中有效。
- 使用Session保持登錄狀態:有些接口測試工具(如Requests-Test)支持Session功能,可以通過Session保持登錄狀態。在第一次調用登錄接口后,Session會自動保存登錄憑證,在后續其他接口中直接使用Session即可。
- 封裝登錄接口:將登錄接口封裝成一個單獨的函數或類,該函數或類內部維護登錄狀態,確保登錄只調用一次。其他接口調用前,先調用登錄函數或類的方法,獲取登錄憑證。
- 使用全局變量:在程序中使用全局變量來保存登錄憑證,在其他接口中讀取該全局變量獲取登錄憑證,避免重復調用登錄接口。