1. 程式人生 > 其它 >jmeter 不務正業,幹起了可變介面、動態引數自動化測試

jmeter 不務正業,幹起了可變介面、動態引數自動化測試

jmeter 這個工具既可以做介面的功能測試,也可以做自動化測試,還可以做效能測試,其主要用途就是用於效能測試。但是,有些公司和個人,就想用 jmeter 來做介面自動化測試。

你有沒有想過呢?

下面我就給大家講講,用 jmeter 如何做介面自動化測試。

如果要你用 jmeter 來做介面自動化測試,你是不是把幾乎每一個測試用例,都是用一個取樣器來實現?

相信很多人都是這麼想的,也是這麼幹的。

但是,很遺憾,你這種,是初級入門做法。你能實現所有的測試用例都被執行,但是,你寫指令碼和維護指令碼的時間,可能比你用手工執行所有的測試用例時間還要長,而且還可能長很多。因為,只要開發人員改了介面一個地方,你得從所有取樣器中,找出與這個介面相關的所有取樣器,然後一一修改,萬一有遺漏,哪出現的失敗,不是 bug,而是你指令碼的問題。所以說,這是入門級人乾的事情。

哪有沒有更好的辦法呢?

平時寫功能測試用例的時候,習慣用 Excel 的同學,可能就會想,我能把自動化測試用例每個資訊都寫在 Excel 表格中,然後,使用 jmeter 的 CSV 資料檔案讀取功能,把它讀取出來執行,是不是就可以呢?

這種方法,就比前面的方法好了很多,用例還是用 Excel 來維護,只是使用 jmeter 來讀取,執行就可以了。整體的可維護性要好很多很多,工作量也要少很多。

但是,在真正動手去做的時候,我們又會發現,困難重重。

初級測試工程師-測試架構師 學習之路

寫過自動化測試用例的同學,應該會有這樣的經歷,就是做介面測試時,我們通常會先對某個介面各種引數進行測試,這樣,介面地址相同,但是引數不一樣,校驗的介面也一樣。

在做完單個介面之後,我們還會做由多個介面構成的業務測試,這個時候,每個介面地址都不一樣,介面請求的方法也可能不一樣,最後的校驗點,也可能變化,這樣的自動化指令碼,應該要怎麼寫呢?

第一個對單介面,編寫自動化測試指令碼,可能還好實現,因為介面相同,那麼他的請求方法肯定相同,雖然,請求頭、請求體、校驗資訊可能不同,但是,至少還有共同點。

而第二個,對業務編寫自動化測試指令碼,那就很難了,因為幾乎所有的都可能不同,請求的協議、方法、請求頭、請求體,全都可能不同,而且請求頭和請求體還可能要有動態值,這個怎麼做呢?

萬事開頭難,只怕去實踐。只要你想好了,真正去動手做了,這很多問題,就不那麼難了。

有很多事情,我們可以加條件判斷,和迴圈控制等邏輯控制器,就可以實現的。

靠我一篇文章,就把它全部寫出來,這是不現實的,所以,我今天,主要講一個,被很多同學問到,難倒了一大片好漢的問題。

看到這個問題,你想到什麼方法?

如果你在 jmeter 中,每個介面寫一個取樣器,這個問題很好解決,直接使用引數引用就可以解決,但是,這個同學的做法是把測試用例寫在 CSV 檔案中,然後使用 jmeter 去讀取 CSV 檔案,執行測試用例,如何來實現動態引數呢?

肯定,有的同學已經想到了,使用變數引用,在 CSV 中,按照 jmeter 的寫法,寫引用變數。

好了,給大家一個看一個參考:

這個 CSV 檔案中,有兩個不同的介面,說明是做的業務場景自動化測試,第一個介面,是註冊,那麼每次註冊的賬戶肯定不能相同,如果相同了,那麼第二次肯定失敗,所以,就使用了隨機函式,讓註冊的賬戶自動生成。第二個介面是登入,當然,可以用固定賬戶登入,但是,我們前面進行註冊,最好還是用前面註冊的賬戶來登入,這樣更加真實,body 中使用了變數引用,顯然,這是用到了關聯。

我們用 jmeter 寫個指令碼,來執行下,看能否成功

從指令碼來執行情況來看,我們可以取到名稱,地址,和請求體,但是,因為請求體在 CSV 中寫了 jmeter 函式,結果讀取出來執行時,還是原樣執行,並沒有對請求體中的函式進行執行。

怎麼辦呢?

很多人,就卡在這了,不知道怎麼辦了。

其實,我們想一下,現在是內容讀取出來了,但是內容是原樣進行請求,沒有對內容中的函式進行執行,現在的問題,只需要解決 body 中的函式,能被執行就可以了。

我們再想下,在 jmeter 中,有哪些可以執行函式的方法?jexl3 函式可以,groovy 函式可以。

jexl3 函式,是要執行一段程式碼,返回程式碼結果,我們的 body 是 JSON 格式,顯然不能直接執行,要想執行,還得寫 Java 程式碼呼叫 JSON 執行才可以,非常複雜。

groovy 函式,是要執行一個表示式,顯然,也不行。

那還有沒有其他的函式呢?eval 函式,這個函式,返回的是字串表示式執行的結果。

此時,我們修改下我們 jmeter 中取樣器的請求體

看,執行結果,函式被執行了,註冊的賬號動態變化了。

接下來,我們就把第 2 條用例,使用了關聯,也寫出來。

現在,我們已經實現,在 jmeter 中,使用一個取樣器執行 2 個不同介面,並且動態引數值的自動化運行了。

現在,我們再把斷言加上。

注意: 斷言中,如果有中文,就要特別注意檔案編碼

現在,我們再加大難度,在 CSV 檔案中寫個 GET 介面。

我們發現,多個介面請求方法不一樣,jmeter 肯定不能用 1 個取樣器了, get 請求沒有 body 引數,但是,請求頭要新增一個 Token 引數。

是不是一下楞圈了,不知道怎麼動了?看懂下面的視訊,你就知道怎麼做了。

初級測試工程師-測試架構師 學習之路

在取樣器的前面增加一個條件判斷,判斷是請求方法,根據請求方法,執行 POST 取樣器或 GET 取樣器

然後,把迴圈次數設定為 CSV 檔案條數一致,其他的地方,應該就比較容易理解了。

看最後,多條測試用例,只用 2 個取樣器就搞定了。以後,改動 CSV 檔案,可能都不用動 jmeter 指令碼,增加測試用例,改下迴圈控制器數量就可以了。

當然,這還不是最完美的,裡面還有諸多不足。給想用 jmeter 做介面自動化測試的同學開了個頭,更多的,還需要同學們自己動手,也歡迎同學們,在文章後面留言討論。

注意,這篇文章的技術,只適合在自動化中,不能用這個指令碼進行效能測試