用Groovy處理JMeter斷言和日志
本篇文章內(nèi)容主要是分享一下jmeter除BeanShell之外的另外一種腳本語言Groovy。
查閱完官方文檔得出結(jié)論,腳本語言如:Groovy,在jmeter體系中基本說是全能的,例如:處理請求、響應(yīng)、參數(shù)、變量以及收集器和監(jiān)聽器(這些以后有機(jī)會再寫文章,有需求的請異步官方Demo)。總的來講,jmeter中Groovy語法兼容性一般,還是得老老實實按照Java的語法來寫比較穩(wěn)妥,主要還是需要用jmeter自己的API,需要一點(diǎn)時間學(xué)習(xí)和實踐。
序言
Apache JMeter斷言是測試人員能夠設(shè)置標(biāo)準(zhǔn)的組件,這些標(biāo)準(zhǔn)確定將響應(yīng)視為“通過”還是“失敗”。您可以使用斷言來確保樣本和子樣本的返回值與預(yù)期結(jié)果匹配,也可以將其應(yīng)用于JMeter變量。它們將在同一范圍內(nèi)的每個采樣器之后執(zhí)行。
JMeter包含許多斷言元素,用于驗證采樣器的響應(yīng)。

但是,有時需要驗證決定可能遵循復(fù)雜和高級的邏輯,并且無法使用開箱即用的JMeter斷言進(jìn)行配置。例如,確認(rèn)JSON響應(yīng)的有效性,然后評估響應(yīng)的值,并具有調(diào)試問題的自定義失敗消息。
Groovy腳本語言非常適合編寫簡潔且可維護(hù)的測試,以及所有構(gòu)建和自動化任務(wù)。Groovy與Java和任何第三方庫無縫且透明地集成在一起,從而使使用JMeter的Java開發(fā)人員易于使用。與其他可用的腳本語言(例如BeanShell)相比,諸如Power Assertion之類的功能使Groovy中的測試和斷言變得輕松簡潔。
進(jìn)入正題
本Demo使用jmeter5.12版本,。
在以下Demo中,我們要測試服務(wù)器響應(yīng)是否包含結(jié)構(gòu)良好的JSON。我們將通過我們的應(yīng)用程序服務(wù)器運(yùn)行一個請求,并且我們期望收到一個結(jié)構(gòu)化的JSON,校驗結(jié)構(gòu)化的JSON包含固定字段的值。
由于我們知道期望在響應(yīng)中接收哪些鍵,以及應(yīng)該分配給它們的值,因此我們可以使用Groovy斷言來斷言響應(yīng)。
1.簡單的開始
該腳本包括一個線程組和一個采樣器。
2.添加斷言
使能夠使用Groovy作為腳本語言:JSR223。
右鍵單擊采樣器->添加->斷言->JSR223斷言

3.元素配置
設(shè)置以下屬性:腳本語言:Groovy 2.xx,如下圖:

JSR223斷言字段說明:
- 名稱:元素名稱
- 語言:要使用的腳本語言(
Groovy,BeanShell,JS等) - 參數(shù):傳遞給腳本的參數(shù)。參數(shù)存儲在以下變量中:參數(shù),參數(shù)
- 文件名:預(yù)制腳本文件的路徑。將覆蓋主腳本字段中編寫的所有腳本
- 腳本編譯緩存:啟用此選項時,
JSR223斷言(或與此相關(guān)的任何其他JSR223元素)可以預(yù)編譯代碼并將其緩存。這將大大提高性能。“如果可用”表示僅適用于JSR223兼容腳本。Java,JavaScript和Beanshell可以在JSR223斷言中使用,但是與Groovy相反,它們與JSR223的接口不兼容。 - 與
Beanshell元素相比,腳本編譯緩存是使用JSR223元素的主要優(yōu)點(diǎn)。
4.編寫腳本
腳本內(nèi)容:
import groovy.json.* log.info("線程組名字 " + prev.getThreadName()) def end_time = prev.getEndTime() log.info("結(jié)束時間 " + (new Date(end_time).toString())) log.info("響應(yīng)結(jié)果: " + prev.getTime().toString()) log.info("Connect Time is: " + prev.getConnectTime().toString()) log.info("Latency is: " + prev.getLatency().toString()) log.info("響應(yīng)大小" + prev.getBytesAsLong().toString()) log.info("請求url " + prev.getURL()) log.info("測試結(jié)果是 " + prev.isSuccessful().toString()) def response = prev.getResponseDataAsString() log.info("響應(yīng)內(nèi)容是:" + response) def json = new JsonSlurper().parseText(response) log.info("響應(yīng)code" + json.success) assert 2 == json.success log.info("響應(yīng)頭響應(yīng)行是 " + prev.getResponseHeaders())
該腳本除了簡單驗證了響應(yīng)結(jié)果中success字段值意外,還驗證了prev的幾個基本的API以及jmeter日志使用。其他的常用的API以后有機(jī)會我會寫一點(diǎn),有需求的移步官方文檔和Demo。
該腳本從導(dǎo)入JSON Slurper開始。JSON Slurper將JSON文本或閱讀器內(nèi)容解析為Groovy數(shù)據(jù)結(jié)構(gòu)。這里說明一下,import使用的是jmeter自帶的Groovy庫,并不是本地的Groovy環(huán)境配置下面libs里面的庫,如果想增加功能,比如去修改jmeter里面的Groovy依賴,不過我并不建議,太麻煩了。而且自帶的已經(jīng)夠用了。
5.運(yùn)行腳本
響應(yīng)失敗:

在此響應(yīng)中,json.success的值為1,而不是2。
浙公網(wǎng)安備 33010602011771號