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