





摘要:JMeter工具在實際測試場景中不僅限于單個線程組和請求,還須根據業務需求和邏輯進行接口間的關聯,以實現正常通信。接口間的通信主要依賴數據驅動,數據可在同線程組和跨線程組間傳遞,解決接口數據傳遞問題在接口測試中尤為重要。文章結合某系統的購物車接口,詳細闡述了JMeter工具如何通過文件和數據庫獲取外源數據,驅動同線程組和跨線程組的接口測試執行,從而優化測試腳本,幫助用戶設計復雜場景,提高測試效率。
關鍵詞:JMeter;接口關聯;數據驅動;同線程組;跨線程組
中圖分類號:TP311文獻標識碼:A
文章編號:1009-3044(2024)34-0043-03開放科學(資源服務)標識碼(OSID):
0引言
隨著軟件行業的迅速發展,企業對軟件產品的要求日益提高,簡單的功能測試已無法滿足市場需求。在日常測試中,不僅需要測試界面功能,還須繞過前端,接口先行進行測試,以確保前后端數據通信暢通。在接口測試過程中,往往需要結合業務需求同時測試多個接口,而這些接口之間通常存在依賴關系。因此,使用接口測試工具可以提高測試效率。目前,市場上主流的接口測試工具包括JMeter、Postman和LoadRunner等,它們各具特色,用戶可根據項目需求選擇最優工具。本文主要介紹JMeter工具如何通過CSV文件和關聯數據庫,將測試數據與測試邏輯分離,通過不同的方式輸入數據集來驅動測試執行,從而更好地模擬真實的用戶場景,使測試結果更趨于真實。
1JMeter介紹
JMeter是一個基于Java的開源免費工具,擁有圖形用戶界面,適用于多種測試場景,如性能測試、分布式性能測試、功能測試和接口測試等[1]。其可擴展性強,用戶可通過插件和定制腳本擴展功能,以滿足復雜測試場景的需求。因此,許多公司將JMeter作為首選的接口測試工具。此外,JMeter能夠靈活處理外源數據驅動測試,并支持HTTP、SOAP等多種服務,采用多線程框架,允許通過多個線程并發取樣[2]。
2JMeter接口關聯
在接口測試過程中,通常會遇到下一個請求的參數需要取自上一個請求的響應值,這一過程體現了接口的關聯。最常見的示例是登錄接口與其他任意接口之間的通信。在使用軟件產品時,第一步通常是登錄,登錄后才能進行后續操作,接口測試同樣需要獲取登錄響應中的鑒權碼,并將其傳遞到其他接口中,以便訪問接口信息。接口關聯的本質是接口間的數據傳遞,將一個接口的響應數據提取出來作為另一個接口的請求參數,從而實現數據之間的通信[3]。
3JMeter數據驅動
JMeter支持數據驅動測試,旨在模擬真實的測試場景,通過使用外源數據來驅動測試場景的執行。這種測試方法靈活多樣,支持不同輸入數據測試同一套腳本以覆蓋多種測試場景。其擴展性強,支持各種數據源,數據可來自文件和數據庫,處理數據庫數據時只需要修改SQL語句即可滿足不同測試場景的要求。
4通過CSV文件獲取外源數據驅動測試執行
在測試加入購物車接口的過程中,為驗證不同商品加入購物車功能的正常性,可將商品的ID放在CSV文件中,以模擬不同商品的加入。由于每次迭代的數據不同,須進行參數化,從參數化文件中取值。CSV數據文件的設置如下:文件名可通過預覽按鈕選擇,文件編碼默認UTF-8,變量名稱可自定義,列數與變量名稱一一對應,用英文逗號隔開(id,nums),忽略首行根據數據而定,若有列名則選擇True,否則選擇False,其余項保持默認[4]。具體操作步驟如下:
打開JMeter腳本文件,切換到存放加入購物車請求的線程組,右擊線程組,選擇“添加”→“配置元件”→“CSVDataSetConfig”以添加數據文件設置元件。
在桌面創建一個文本文件,添加id和nums兩列數據,使用英文逗號隔開,保存后修改文件后綴為.CSV。
雙擊打開CSV文件,數據將自動分為兩列,其中id為商品的ID,nums為對應商品的加入數量。
至此,CSV數據文件設置配置完畢。可在加入購物車接口通過${id},${nums}將CSV數據文件設置中的數據進行調用傳遞。
5通過數據庫獲取外源數據驅動測試執行
5.1數據庫連接配置和JDBCRequest請求取樣器
在使用數據庫獲取外源數據驅動測試執行前,須進行一些準備工作。首先,下載jdbc驅動包,解壓后放在JMeter安裝目錄的lib文件中,并重啟JMeter以使其生效。接下來,在JMeter中完成數據庫連接配置,具體步驟如下:
在測試計劃底部的“庫”中復制粘貼剛才加入lib目錄下的jdbc驅動包全路徑。
在線程組下添加配置元件“JDBCConnectionCon?figuration”。步驟:右擊線程組,選擇“配置元件”→“JDBCConnectionConfiguration”[5]。
添加完成后,在該模塊下配置數據庫地址、選擇jdbc驅動類型(填寫所用數據庫的類型)、輸入數據庫賬戶和密碼。完成數據庫配置后,即可添加“JDBCRequest”請求取樣器進行SQL的編輯[6]。JDBCRe?quest取樣器配置步驟如下:
右擊線程組選擇取樣器→JDBCRequest。
將數據庫配置中連接池名稱mypool關聯到JDBCRequest取樣器頂部variablenameboundtopool中。
在底部Variablenames定義一個變量名用于接口請求調用。JDBCRequest取樣器配置如圖1所示。
為清楚展示SQL語句查詢到的數據并方便其他請求調用,須在JDBCRequest請求取樣器下方添加調試取樣器和查看結果樹以獲取數據傳參的格式。添加調試取樣器的步驟:右擊線程組選擇“取樣器”→“調試取樣器”;添加查看結果樹的步驟:右擊調試取樣器選擇“添加”→“監聽器”→“查看結果樹”。添加完成后運行腳本,可在查看結果樹中看到goods_id_序號中變量名引用的是JDBCRequest請求取樣器中設置的變量名稱goods_id。調試取樣器查看結果樹結果如圖2所示。
5.2同線程組接口關聯實現數據驅動
完成數據庫配置后,通過JDBCRequest請求取樣器查詢到商品ID,為將查詢到的商品ID傳遞給同線程組下的加入購物車接口,須將JDBCRequest請求與加入購物車接口進行關聯[7]。以下介紹三種同線程組讀取數據庫查詢結果的方法,并分析各方法的特點和適用場景。
添加循環控制器:設置循環次數為${goods_id_#},該值調用圖2調試取樣器中的goods_id_#=10,表示循環遍歷10次以獲取數據庫查詢的10個ID結果,用于加入購物車接口的商品ID傳參。須添加計數器,設置開始遍歷值為1,依次增加1,以獲取查詢到的10個goods_id_后的序號。此外,還須設置引用名稱,該名稱可自定義[8]。完成設置后,在加入購物接口中通過${__V(goods_id_${cishu},)}完成goods參數的調用。計數器設置如圖3所示。
以上通過循環控制器獲取數據庫查詢結果驅動測試執行的方式,其特點是可以指定循環次數。這種方式適用于對某個請求進行多次或者重復執行的場景。該方法存在一個缺點:只能通過goods_id_N表示第幾個id,永遠都是從1開始,與所取得的值沒有任何關系,使用不夠靈活,較為死板。
使用ForEach控制器:相較于循環控制器,ForEach控制器獲取數據庫結果更為簡潔明了。配置時須輸入變量前綴,開始循環字段應該為0,結束字段通過${goods_id_#}調用總個數[9]。輸出變量名稱可自定義,用于加入購物車接口請求的參數調用。以上通過ForEach控制器獲取數據庫查詢結果驅動測試執行的方式,其特點是可以通過輸入的數據數量自動調整循環次數。這種方式適用于處理變量數量的場景,不像循環控制器一樣固定循環次數,相比較而言更為靈活。使用函數嵌套:此方法更為精簡,直接使用隨機函數隨機獲取查詢結果。通過隨機函數${__Random(1,${goods_id_#},)}在[1,goods_id_#]之間隨機取值,結合V函數完成商品ID的參數調用。
以上通過函數嵌套獲取數據庫查詢結果驅動測試執行的方式,其特點是具有強大的邏輯處理能力,無須編寫復雜的腳本,允許用戶在測試計劃中執行計算或者邏輯判斷。這種方式適用于在測試計劃中處理計算和邏輯判斷的場景,相較于循環控制器和ForEach控制器來說更易于處理變量。
5.3跨線程組接口關聯實現數據驅動
當接口分布在不同的線程組時,僅使用后置處理器提取數據的JMeter變量無法完成跨線程組接口間的數據傳遞,因為該變量是局部變量,只能在同線程組間傳遞。為實現跨線程組接口數據的關聯,須將局部變量修改為全局變量。在JDBCRequest請求下面添加BeanShell后置處理器,通過編寫BeanShell腳本將局部變量設置為全局變量。示例代碼如下:
在BeanShell取樣器中已將查詢到的商品ID設置為全局變量,但在調用查詢結果時需要在加入購物車接口所在的線程組添加一個計數器。由于BeanShell后置處理程序中已將獲取到的商品ID存放在新的列表中,故須添加計數器逐一獲取商品ID變量前綴(goods_id_)后對應的序號。新列表商品序號從下標0開始計數,且最后一位需要向前進一位。同時,在BeanShell后置處理程序中的num-1已賦值給count,故通過P函數${__P(count,)}調用即可獲得計數器所需最大值。此外,還須在計數器下方添加一個BeanShell預處理程序,通過腳本獲取全局變量并進行處理,然后將“goods_id_”與計數器遍歷獲取到的序號進行拼接,從而獲取真正的商品ID。預處理程序示例代碼如下:
6結束語
本文主要介紹JMeter通過文件和數據庫獲取外源數據在同線程組和跨線程組之間驅動測試執行的各種方法,同時使用BeanShell后置處理程序和BeanShell預處理程序解決了數據庫數據在跨線程組間關聯的問題,并結合某網站加入購物車接口調試驗證了接口間的關聯性。以上數據驅動場景的探索研究可幫助用戶完成復雜測試場景設計,同時亦能更好地維護JMeter接口測試腳本。JMeter工具不僅可實現接口的功能測試,而且可測試接口的性能。下一步將在接口數據驅動的基礎上進行接口性能測試研究,以優化被測系統性能,使軟件產品更趨穩定。
參考文獻:
[1]張億軍.JMeter測試應用研究[J].信息技術與信息化,2021(10):61-64.
[2]張嘉杰.基于JMeter、Ant和WeTest的傭金管理系統接口自動化測試程序開發[J].電子技術與軟件工程,2020(24):26-29.
[3]陳雷.JMeter原理與實踐[M].北京:電子工業出版社,2021.
[4]李金萌.基于JMeter的資產管理系統應用[J].電子技術與軟件工程,2023(4):53-56.
[5]馮瑤,秦洪巖,劉躍光.基于Jmeter開展接口自動化測試方法探索與實踐[J].中國金融電腦,2020(2):48-50.
[6]巴約·艾林勒.JMeter性能測試實戰[M].黃鵬,譯.北京:人民郵電出版社,2020.
[7]王芬.接口測試中數據關聯技術的運用[J].電腦知識與技術,2021,17(11):67-68.
[8]紀力煒.基于JMeter工具的性能自動化測試系統設計與實現[D].南京:南京郵電大學,2016.
[9]陳志勇,馬利偉,萬龍.全棧性能測試修煉寶典:JMeter實戰[M].北京:人民郵電出版社,2016.
[10]周燕,肖玉,許華.基于JMeter接口關聯技術研究[J].信息技術與信息化,2023(3):160-163.
【通聯編輯:謝媛媛】