如何實現基于場景的接口自動化測試用例?

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快

自動化本身是為了提高工作效率,不論選擇何種框架,何種開發語言,我們最終想實現的效果,就是讓大家用最少的代碼,最小的投入,完成自動化測試的工作。

基于這個想法,我們的接口自動化測試思路如下:

1.不變的內容全部通過配置化來實現,比如:腳本執行的環境、請求的 HOST、URL 路徑、測試數據等;

2.環境和數據關聯變更:依據不同的環境,選擇不同的配置及對應的測試數據;

3.抽取公共方法,避免冗余代碼

4.場景化的用例,實現可配置化;

5.數據驅動。

一、問題

在做自動化的過程中,不能只考慮單接口的腳本,也要考慮場景化的用例。場景化的用例?不需要每個步驟都去校驗所有的數據,可能?更多看重串聯后的最終效果。

那什么是場景用例?

其實就是多個接口組成的業務場景,常規寫代碼的做法是,先調用接口1,驗證結果, 再調用接口2,再繼續接口3,… 等等;在測試場景中,可能只是各個接口的入參不一樣,或者是調用的接口不一樣。這樣代碼寫起來就會冗余。

比如:

def test_01(self):# step 01result1 = PackDemo().getTest()assert result1 == 4# step02result2 = PackDemo2().getTest2("name")assert result2 == 'name'# step03result3 = DemoApi().getTest()assert result3 == 2

這樣的用例,對于簡單的接口沒什么問題,但是對于復雜的接口,校驗邏輯比較多,或者入參比較多,實現的方式就過于單一了。且不同場景的話,每個都要更改調用的步驟和返回值,場景越多冗余越多。

如果使用配置化的方式,每次從配置文件中動態加載配置的場景用例, 而且能夠做到加載后做對應的斷言,那該多好。

怎么做呢?咱們看看一些核心的實現。

二、方案

2.1 項目結構

項目結構如下:

圖片

img

采用當前比較流行的 Python + Pytest + Allure 來實現,具體結構不做展開。

2.2 場景用例的配置數據

 test_scenario.json
{"test_01": {"step_1": {  ---- 步驟節點名稱,可自定義"packagePath": "api", --- 這個步驟要運行的方法所屬類的包路徑"class": "DemoApi", --- 這個步驟要運行的方法所屬類名稱"method": "getTest", --- 這個步驟要運行的方法名稱"request": null,  ---這個步驟運行的方法入參"response": 2, ---這個步驟運行的結果,可以是一個值,或者對象"verify": { --- 數據校驗的節點"type": 1, ---數據校驗的類型"keys": null  ---如果是校驗的特定字段,這里需要輸入部分校驗的字段}},"step_2": {"packagePath": "api.demo","class": "PackDemo","method": "getTest2","request": "request -> name","response": 6,"verify": {"type": 1,"keys": null}},"step_3": {"packagePath": "api.demo","class": "PackDemo2","method": "getTest3","request": {"name": "param-name","num_list": ["a", "b", "c"]},"response": 8,"verify": {"type": 1,"keys": null}}}
}

2.3 動態加載類

在我們配置了以上的測試場景的數據后,我們希望在用例執行的過程中,通過獲取我們的配置,能夠動態的加載數據文件中提到的方法,并執行對應的方法,那這個過程的實現我們主要通過如下的動態加載類來實現。

# DynamicLoad.py 
# 部分主要的摘錄如下def __load_module(self):"""加載對應路徑下的模塊:param package_path: 包路徑:param class_name: 類名稱:return:"""return importlib.import_module("." + self.class_name, package=self.package_path)def __getClassInstance(self):"""加載對應的模塊下的類,并返回對應類的實例 :param module_name: 對應的模塊:param class_name::return:"""self.my_module = self.__load_module()self.my_class = getattr(self.my_module, self.class_name)()return self.my_classdef execMethod(self, method, *args):"""加載對應類下的方法 :param instance: 對應的實例:param method: 要執行的方法:return:"""result = getattr(self.__getClassInstance(), method)(*args)return result

有了以上動態加載的方法后,在執行場景用例時,依據上述的方法,就可以執行測試文件中提到的方法。

2.4 場景分析類

在場景用例的測試數據中,除了需要解析需要執行的類、方法外,還要解析文件中涉及到的出入參及數據比對方式,因此,這里還需要一個場景分析類,來解析數據文件中關于具體執行過程的配置。

 #ScenariosAnalyze.pydef analyse_exe_scenario(self, case_data):step_result = {}summary = Truefor i in case_data:instance = DynamicLoad(case_data[i]['packagePath'], case_data[i]['class'])if case_data[i]['request'] is not None:result = instance.execMethod(case_data[i]['method'], case_data[i]['request'])else:result = instance.execMethod(case_data[i]['method'])if case_data[i]['verify'] is not None:compare_type = case_data[i]['verify']['type']keys = case_data[i]['verify']['keys']step_compare_result = DataCompare().compare_type(compare_type=compare_type, actual=result,expect=case_data[i]['response'], keys=keys)if not step_compare_result:summary = Falsestep_result[i] = step_compare_resultstep_result['summary'] = summaryreturn step_result

2.5 用例實現

 @File : test_scenario.pyclass TestScenario:@allure.story('場景用例01')@allure.severity(allure.severity_level.BLOCKER)@pytest.mark.smokedef test_01(self):result = Nonecase_data = self.test_data_json['test_01']result = self.scenario_analyze.analyse_exe_scenario(case_data)assert result['summary'] is True

通過上述簡單的腳本調用,就可以完成一個場景用例的測試了。

三、小結

以上就是場景用例配置化的實現思路。

它的優點是:

1.配置化: 一切固定不變的內容全部配置化,最終達到:一個環境配置文件,一套腳本,幾套測試數據,依據環境的不同選擇不同的測試數據執行對應的測試腳本;

2.門檻低:因為配置化,測試同學只要把測試數據文件中的關鍵節點配置好,然后在腳本中寫下調用方法,就完成用例編寫了;

3.好擴展:在后續的實現中,可以將這些配置全部頁面化,包括環境、數據、腳本,達到無代碼開發的目的;

缺點當然是不夠靈活,所以沒有完美的方案,只有合適的,以上,僅供大家參考。

最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

這些資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/web/84439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84439.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FreeRTOS 任務管理學習筆記

FreeRTOS 任務管理學習筆記 引言 本文檔旨在通過在STM32微控制器上使用FreeRTOS來理解和實現任務管理。實驗的重點是創建和管理多個任務、處理任務同步以及通過簡單的硬件接口控制任務狀態。 實驗概述 實驗涉及創建三個任務: LED1_Task: 每300毫秒切換一次LED。…

c++set和pair的使用

set是C中的一種關聯容器,具有以下特點: 存儲唯一元素(不允許重復) 元素自動排序(默認升序) 基于紅黑樹實現(平衡二叉搜索樹) 插入、刪除和查找的時間復雜度為O(log n) 前言 在C…

終端命令行執行具體的方法名測試用例

你可以使用如下命令單獨執行 test_mutation_login_by_email 方法:python3 manage.py test apps.login.test_client.LoginTestCase.test_mutation_login_by_email 注意事項: 路徑 apps.login.test_client 要與你項目實際的 Python 包路徑一致(即 test_client.py 文件所在的包…

20250620在Ubuntu20.04.6下編譯KickPi的K7的Android14系統

【處理SDK】 rootrootrootroot-X99-Turbo:~/Android14$ tar zxvf rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android14$ ll rootrootrootroot-X99-Turbo:~/Android14$ rm rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android1…

碳中和時代的家電革命,從華為智選IAM看科技企業的環保擔當

在"雙碳"戰略與品質消費浪潮的雙重加持下,家電產業正經歷一場前所未有的綠色革命。華為智選與空凈十大品牌IAM的深度協同,不僅構建了智能家電領域的技術新高地,更通過系統性創新持續拓展著行業可持續發展的想象空間。從凈水科技的突…

(C語言)Map數組的實現(數據結構)(鏈表)(指針)

源代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>// 鍵值對節點 typedef struct Node {char* key;int value;struct Node* next; } Node;// Map結構 typedef struct {Node* buckets[100]; // 固定大小的哈希桶&#xff08;…

Logback示例解析

<configuration><!-- 環境變量 --><springProperty scope"context" name"app.name" source"spring.application.name" defaultValue"application"/><!-- 日志存放路徑 --><property name"log.path&qu…

elementui響應式數據類型變更情況

背景。vue2。data中定義的響應數據類型是[]數組。應用在el-select中&#xff08;非multiple情況&#xff09;。當發生響應數據有變更渲染視圖時&#xff0c;發現定義的數組轉換成了字符串。 本身不是問題。但因為疏忽引發了watch監聽formData數據時產生了產生了多次監聽事件。…

人機融合智能 | 人智交互語境下的設計新模態

本章旨在探討技術與設計領域在人智交互語境下的關系及其影響,討論通過傳統設計對人智交互的優化方法。通過回顧大數據和發展趨勢,以 AI技術作為重要的技術推力,我們認為 AI技術將會在未來成為設計領域不可缺少的重要環節,并能夠幫助設計師更加高效、準確地開展設計工作。本章著…

C++設計模式分類(GOF-23種設計模式)

文章目錄 GOF-23 設計模式分類一、從目的分類1. 創建型&#xff08;Creational&#xff09;模式2. 結構型&#xff08;Structural&#xff09;模式3. 行為型&#xff08;Behavioral&#xff09;模式 二、從范圍分類1. 類模式&#xff08;Class Pattern&#xff09;2. 對象模式&…

AbMole| LY294002(M1925)

LY294002是一種廣譜的PI3K抑制劑&#xff0c;對PI3Kα/δ/β的IC50分別為0.5 μM/0.57 μM/0.97 μM。LY294002 也可以抑制 CK2 的活性&#xff0c;IC50 為 98 nM。LY294002 還是一種競爭性 DNA-PK 抑制劑&#xff0c;可逆結合 DNA-PK 的激酶結構域&#xff0c;IC50 為 1.4 μM…

第1章,[標簽 Win32] :第一個 WIn32 程序,MessageBox 函數

專欄導航 上一篇&#xff1a;第1章&#xff0c;[標簽 Win32] &#xff1a;第一個 WIn32 程序&#xff0c;程序入口 回到目錄 下一篇&#xff1a;無 本節前言 本節的學習&#xff0c;需要前兩節的內容作為先修知識。如果還沒有去看本專欄的前兩節&#xff0c;請你先去學習它…

求助帖:學Java開發方向還是網絡安全方向前景好

最近網絡安全被一個培訓機構吹得天花亂墜&#xff0c;雖然他家既有網安又有java和UI&#xff0c;我也是學軟件工程的&#xff08;山西某211&#xff0c;此機構是每年和我們學校合作的校企公司&#xff09;&#xff0c;但那里的老師仍然大力推薦我學網絡安全&#xff08;滲透、代…

OpenCV 圖像仿射變換之旋轉

一、知識點 1、void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags INTER_LINEAR, int borderMode BORDER_CONSTANT, …

HCIP-數據通信基礎

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 本篇筆記是根據B站上的視頻教程整理而成&#xff0c;感謝UP主的精彩講解&#xff01;如果需要了解更多細節&#xff0c;可以參考以下視頻&#xff1a;…

C語言基本數據類型與變量詳解

# C語言基本數據類型與變量詳解 ## 數據類型概述 在C語言中&#xff0c;數據類型決定了變量在內存中的存儲方式和大小&#xff0c;以及可以對其執行的操作。合理選擇數據類型能夠提高程序的效率和準確性&#xff0c;避免內存浪費和數據溢出等問題。 C語言的基本數據類型主要包括…

Babylon.js學習之路《十、高級幾何體:自定義模型與復雜形狀生成》

文章目錄 1. 引言&#xff1a;高級幾何體的應用場景2. 參數化建模&#xff1a;Babylon.MeshBuilder2.1 擴展幾何體類型2.2 自定義多邊形&#xff08;ExtrudePolygon&#xff09; 3. 頂點級建模&#xff1a;自定義VertexData3.1 手動定義頂點數據3.2 動態生成地形&#xff08;高…

【趙渝強老師】Kubernetes的安全框架

Kubernetes集群的安全框架主要由以下認證、鑒權和準入控制三個階段組成。這三個階段的關系如下圖所示。 視頻講解如下 【趙渝強老師】Kubernetes的安全框架 認證&#xff08;Authentication&#xff09; 當客戶端與Kubernetes集群建立HTTP通信時&#xff0c;首先HTTP請求會進…

CDN與靜態資源優化

CDN與靜態資源優化 在現代Web系統和AI應用中&#xff0c;隨著用戶訪問量的不斷攀升&#xff0c;靜態資源&#xff08;如HTML、CSS、JavaScript、圖片、音視頻、模型文件等&#xff09;帶來的負載日益沉重。尤其在大模型推理、前端渲染、廣告投放等場景中&#xff0c;靜態資源的…

如何填寫“appium inspector”內容?

1. 確認已經開啟appium的服務&#xff0c;運行appium 參考內容&#xff1a;{"appium:platformName": "Android", # 系統名稱"appium:platformVersion": "9", # 安卓版本&#xff0c;看設備"appium:deviceName": "3d…