90%測試猿都想學(xué)的Jmeter技能,你get嗎?
01.
前言
jmeter 這個工具既可以做接口的功能測試,也可以做自動化測試,還可以做性能測試,其主要用途就是用于性能測試。但是,有些公司和個人,就想用 jmeter 來做接口自動化測試。
你有沒有想過呢?
下面我就給大家講講,用 jmeter 如何做接口自動化測試。

02.
jmeter 與接口自動化測試
如果要你用 jmeter 來做接口自動化測試,你是不是把幾乎每一個測試用例,都是用一個取樣器來實現(xiàn)?
相信很多人都是這么想的,也是這么干的。
但是,很遺憾,你這種,是初級入門做法。你能實現(xiàn)所有的測試用例都被執(zhí)行,但是,你寫腳本和維護腳本的時間,可能比你用手工執(zhí)行所有的測試用例時間還要長,而且還可能長很多。
因為,只要開發(fā)人員改了接口一個地方,你得從所有取樣器中,找出與這個接口相關(guān)的所有取樣器,然后一一修改,萬一有遺漏,哪出現(xiàn)的失敗,不是 bug,而是你腳本的問題。所以說,這是入門級人干的事情。
那有沒有更好的辦法呢?
平時寫功能測試用例的時候,習(xí)慣用 Excel 的同學(xué),可能就會想,我能把自動化測試用例每個信息都寫在 Excel 表格中,然后,使用 jmeter 的 CSV 數(shù)據(jù)文件讀取功能,把它讀取出來執(zhí)行,是不是就可以呢?
這種方法,就比前面的方法好了很多,用例還是用 Excel 來維護,只是使用 jmeter 來讀取,執(zhí)行就可以了。整體的可維護性要好很多很多,工作量也要少很多。
但是,在真正動手去做的時候,我們又會發(fā)現(xiàn),困難重重。
寫過自動化測試用例的同學(xué),應(yīng)該會有這樣的經(jīng)歷,就是做接口測試時,我們通常會先對某個接口各種參數(shù)進行測試,這樣,接口地址相同,但是參數(shù)不一樣,校驗的接口也一樣。
在做完單個接口之后,我們還會做由多個接口構(gòu)成的業(yè)務(wù)測試,這個時候,每個接口地址都不一樣,接口請求的方法也可能不一樣,最后的校驗點,也可能變化,這樣的自動化腳本,應(yīng)該要怎么寫呢?
第一個對單接口,編寫自動化測試腳本,可能還好實現(xiàn),因為接口相同,那么他的請求方法肯定相同,雖然,請求頭、請求體、校驗信息可能不同,但是,至少還有共同點。
而第二個,對業(yè)務(wù)編寫自動化測試腳本,那就很難了,因為幾乎所有的都可能不同,請求的協(xié)議、方法、請求頭、請求體,全都可能不同,而且請求頭和請求體還可能要有動態(tài)值,這個怎么做呢?
萬事開頭難,只怕去實踐。只要你想好了,真正去動手做了,這很多問題,就不那么難了。
有很多事情,我們可以加條件判斷,和循環(huán)控制等邏輯控制器,就可以實現(xiàn)的。
靠我一篇文章,就把它全部寫出來,這是不現(xiàn)實的,所以,今天,主要講一個,被很多同學(xué)問到,難倒了一大片好漢的問題。

03.
實操案例
如果你在 jmeter 中,每個接口寫一個取樣器,這個問題很好解決,直接使用參數(shù)引用就可以解決,但是,這個同學(xué)的做法是把測試用例寫在 CSV 文件中,然后使用 jmeter 去讀取 CSV 文件,執(zhí)行測試用例,如何來實現(xiàn)動態(tài)參數(shù)呢?
肯定,有的同學(xué)已經(jīng)想到了,使用變量引用,在 CSV 中,按照 jmeter 的寫法,寫引用變量。
好了,給大家一個看一個參考:

我們用 jmeter 寫個腳本,來運行下,看能否成功。

從腳本來運行情況來看,我們可以取到名稱,地址,和請求體,但是,因為請求體在 CSV 中寫了 jmeter 函數(shù),結(jié)果讀取出來運行時,還是原樣運行,并沒有對請求體中的函數(shù)進行執(zhí)行。
怎么辦呢?
很多人,就卡在這了,不知道怎么辦了。
其實,我們想一下,現(xiàn)在是內(nèi)容讀取出來了,但是內(nèi)容是原樣進行請求,沒有對內(nèi)容中的函數(shù)進行執(zhí)行,現(xiàn)在的問題,只需要解決 body 中的函數(shù),能被運行就可以了。
我們再想下,在 jmeter 中,有哪些可以運行函數(shù)的方法?jexl3 函數(shù)可以,groovy 函數(shù)可以。
04.
Exl3 函數(shù)
jexl3 函數(shù),是要運行一段代碼,返回代碼結(jié)果,我們的 body 是 JSON 格式,顯然不能直接運行,要想運行,還得寫 Java 代碼調(diào)用 JSON 運行才可以,非常復(fù)雜。
groovy 函數(shù),是要運行一個表達式,顯然,也不行。
那還有沒有其他的函數(shù)呢?eval 函數(shù),這個函數(shù),返回的是字符串表達式運行的結(jié)果。

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


看,運行結(jié)果,函數(shù)被執(zhí)行了,注冊的賬號動態(tài)變化了。
接下來,我們就把第 2 條用例,使用了關(guān)聯(lián),也寫出來。

現(xiàn)在,我們已經(jīng)實現(xiàn),在 jmeter 中,使用一個取樣器執(zhí)行 2 個不同接口,并且動態(tài)參數(shù)值的自動化運行了。
現(xiàn)在,我們再把斷言加上。

注意:斷言中,如果有中文,就要特別注意文件編碼
現(xiàn)在,我們再加大難度,在 CSV 文件中寫個 GET 接口。

我們發(fā)現(xiàn),多個接口請求方法不一樣,jmeter 肯定不能用 1 個取樣器了, get 請求沒有 body 參數(shù),但是,請求頭要添加一個 Token 參數(shù)。
是不是一下楞圈了,不知道怎么動了?看懂下面的圖,你就知道怎么做了。

在取樣器的前面增加一個條件判斷,判斷是請求方法,根據(jù)請求方法,執(zhí)行 POST 取樣器或 GET 取樣器
然后,把循環(huán)次數(shù)設(shè)置為 CSV 文件條數(shù)一致,其他的地方,應(yīng)該就比較容易理解了。
05.
END
看最后,多條測試用例,只用 2 個取樣器就搞定了。以后,改動 CSV 文件,可能都不用動 jmeter 腳本,增加測試用例,改下循環(huán)控制器數(shù)量就可以了。
當然,這還不是最完美的,里面還有諸多不足。給想用 jmeter 做接口自動化測試的同學(xué)開了個頭,更多的,還需要同學(xué)們自己動手,也歡迎同學(xué)們,在文章后面留言討論。
注意,這篇文章的技術(shù),只適合在自動化中,不能用這個腳本進行性能測試。