JMETER從JSON響應中提取數據
如果你在這裏,可能是因為你需要使用JMeter從Json響應中提取變量。
好消息!您正在掌握掌握JMeter Json Extractor的權威指南。作為Rest API測試指南的補充,您將學習掌握Json Path Expressions 所需的一切。
我們走吧!並且不要驚慌,那裏沒有什麽困難。
Json格式
為了更好地理解Json是什麽,這是一個示例Json文檔:
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
Json是一種非常簡單的數據格式,幾年前就已經接管了XML。
你可能會問自己:為什麽我需要學習Json?
越來越多的REST API和服務器使用Json作為主要的數據交換格式。在OctoPerf,我們大量使用Json在AngularJS前端客戶端和Spring Boot後端之間交換數據。
想知道最好的部分嗎?
從JMeter 3.0開始,使用Json變量提取器從Json響應中提取數據要容易得多。換句話說,Json提取器可以原生使用。
JMeter JsonPath插件
JMeter JsonPath Extractor插件可以從jmeter-plugins網站下載和安裝。從JMeter 3.0及更高版本開始,
安裝JMeter JsonPath插件
- 下載plugins-manager.jar並將其放入
JMETER_HOME/lib/ext
目錄, - 重啟JMeter,
- 點擊
Options > Plugins Manager
頂部菜單, - 選擇
Available Plugins
標簽, - 選擇
Json Plugins
並單擊Apply Changes並重新啟動JMeter。
在JMeter的Json的插件應該在右鍵菜單Add > Post Processors > Json Path Extractor
。順便說一句,我們建議您閱讀我們的JMeter插件安裝指南,了解有關JMeter插件的更多詳細信息。
你懶嗎?因為我是。讓我們使用原生的JsonPath Extractor!
JMeter Json Path Extractor
JMeter的Json Post處理器使用Json Way,一種Java Json Path API,在服務器響應上執行JSon路徑提取。
Json Path提取器應放在HTTP Sampler下。它有幾種可能的設置,因此最相關的是:
- 變量名稱:分號單獨的變量名稱,
- JSON Path Expressions:從json響應中提取內容的表達式,
- 匹配數字:
-1
對於所有,0
對於隨機的,n
對於第n個, - Compute concatenation var:創建一個
${foo_ALL}
包含所有提取值的串聯的變量, - 和默認值:如果表達式不適用於正在處理的json文檔。
真棒!但是我該如何開始?
示例Json路徑
以下是一些示例Json Path表達式,可用於從上面公開的Json文檔中提取數據:
JsonPath(點擊鏈接試試) | 結果 |
---|---|
$ .store.book [*]。作者 | 所有書籍的作者 |
$ ..作者 | 所有作者 |
$ .store。* | 所有的東西,書籍和自行車 |
$ .store..price | 一切的價格 |
$ ..本書[0,1] | 前兩本書 |
$ ..書[2] | 從索引0(含)到索引2(獨家)的所有書籍 |
$ ..書[2:] | 從尾巴預訂二號 |
$ ..書[?(@。ISBN) | 所有ISBN編號的書籍 |
$ .store.book [?(@。price <10)] | 商店裏的所有書籍都比10便宜 |
$ .. book [?(@。price <= $ [‘expensive‘])] | 店內所有書籍都不“貴” |
$ .. book [?(@。author =?/.* REES / i)] | 所有與正則表達式匹配的書籍(忽略大小寫) |
$ .. * | 把所有東西都給我 |
$ .. book.length() | 書籍數量 |
如您所見,從Json文檔中查詢特定信息並將它們放入變量中非常簡單靈活。讓我們用JMeter探索上面的一些例子。
你猜怎麽著?我們打算試一試。
真實的JMeter示例
我們的示例JMX展示了JMeter Json Extractor和Plugin JsonPath Extractor的工作原理。在JMeter 3.0之前,需要插件執行JsonPath提取。從JMeter 3.0開始,Json Extractions得到了集成支持。
準備采取一些行動?我們走吧!
陣列提取
從商店中提取所有作者
提取數組可以一次從單個Json文檔中提取多個值。例如,我們可以從書店中提取所有作者:
- 變量名稱:
authors
產生變量${authors}
, - JSONPath Expression :
$..author
,從任何深度選擇所有作者。
您將獲得以下變量:
authors_1=Nigel Rees
authors_2=Evelyn Waugh
authors_3=Herman Melville
authors_4=J. R. R. Tolkien
authors_ALL=Nigel Rees,Evelyn Waugh,Herman Melville,J. R. R. Tolkien (if Compute concatenation checked)
authors_matchNr=4
我們得到了所有書籍的所有作者!
條件提取
有選擇地提取書籍標題
現在假設我們想要提取價格小於或等於10的書籍的標題:
- 變量名稱:
titles
產生${titles}
變量, - 比賽號碼:
-1
, - JSONPath表達式 :(
$.store.book[?(@.price<= 10)].title
圖書標題的價格<= 10)。
您將獲得以下變量:
titles_1=Sayings of the Century
titles_2=Moby Dick
titles_matchNr=2
價格低於10的書籍。
多次提取
提取書籍作者和標題
現在假設我們想要同時提取多個Json字段。例如,我們想查詢所有作者和標題:
- 變量名稱:
multiple
, - 比賽號碼:
-1
, - JSONPath表達式:
$..[‘author‘,‘title‘]
。
您將獲得以下變量:
multiple_1={"title":"Sayings of the Century","author":"Nigel Rees"}
multiple_2={"title":"Sword of Honour","author":"Evelyn Waugh"}
multiple_3={"title":"Moby Dick","author":"Herman Melville"}
multiple_4={"title":"The Lord of the Rings","author":"J. R. R. Tolkien"}
multiple_matchNr**=4
提取書籍作者和標題
這就是JMeter UI中顯示的結果。
連接提取
有時,您希望將所有結果提取並連接成單個字符串。在這個例子中,我采用了HTTPBin頭 json端點。
這可以使用該Compute Concatenation var (suffi _ALL)
選項實現。
從JMeter調用HTTPBin時收到Json響應
端點返回包含客戶端發送的標頭的json。你應該看到類似的東西:
{
"headers": {
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "Apache-HttpClient/4.5.5 (Java/1.8.0_161)"
}
}
現在讓我們修改Json提取器並啟用連接結果的選項:
- 創建變量的名稱 :(
foo
產生${foo}
), - JSON路徑表達式:
$.headers.*
, - 匹配Nr:
-1
這意味著提取所有出現的, - 計算連接var:選中。
現在讓我們看看結果。
提取所有結果的串聯
最後,讓我們使用Debug Sampler來查看正在提取的變量(foo
在此處命名)。
調試結果
結果應該是這樣的:
foo_1=close
foo_2=httpbin.org
foo_3=Apache-HttpClient/4.5.5 (Java/1.8.0_161)
foo_ALL=close,httpbin.org,Apache-HttpClient/4.5.5 (Java/1.8.0_161)
foo_matchNr=3
這有用嗎?我不太確定。但是,只要您有這種特殊需求,JMeter就能輕松完成。
使用響應斷言
這是一個非常常見的問題:如何使用斷言驗證從json中提取的變量?
否則,您要確保提取的變量是正確的。讓我們看看如何做到這一點。
JMeter Dummy Sampler插件
對於此示例,我們將使用Dummy Sampler插件。為什麽?因為它允許使用我們想要的任何json生成樣本結果。
讓我們使用以下Json:
{
"firstname": "John",
"lastname": "Smith"
}
我們只是將配置虛擬采樣器以將此Json作為響應發送。
JMeter Dummy Sampler插件配置
然後,我們創建一個Json提取器來提取firstname
json字段。
JMeter Json Extractor
現在讓我們配置一個響應斷言。
響應斷言必須位於之後的JSON提取才能工作。
使用Response Assertion驗證變量值
的響應斷言被配置如下:
- 應用於:要使用的JMeter變量名稱,
- 要測試的字段:文本響應,
- 模式匹配規則:等於,
- 要測試的模式:
John
在我們的示例中。
是時候執行線程組並查看結果了。
斷言成功通過
如果我們替換斷言模式來測試titi
。
斷言失敗了
大!現在您知道如何從json響應中提取變量並使用Response Assertion驗證變量值。
3常見錯誤
現在,你可能想知道:什麽可能出錯?
應該避免的3個常見錯誤是:
- 不要在單個Json Path提取器中定義多個變量:腳本可能變得難以理解/維護,
- 不要編寫易受特定json響應影響的表達式,試著堅持一般情況,
- 解決方案越簡單,腳本可維護性就越好。
很高興知道解決方法
根據具體情況,您可以使用其他技術從服務器響應中提取內容。
正則表達式提取器
假設您有一個非常簡單的Json文檔,其中包含以下內容,並且您需要所有名字:
{
"name":"Simpsons family",
"members":[
{"firstName":"Homer", "lastName":"Simpson"},
{"firstName":"Marge", "lastName":"Simpson"},
{"firstName":"Bart", "lastName":"Simpson"}
]
}
在這種情況下,正則表達式提取器可能很適合,因為編寫正則表達式非常簡單。
我們定義了以下設置:
- 參考名稱:
firstname_RegEx
, - 正則表達式:
"firstName":"(.+?)"
, - 模板:
$1$
, - 匹配Nr :
3
,(我們想要Bart) - 默認值:
D‘oh!
。
JSR223與外部庫
通過使用Minimal Json庫並將其添加到JMeter,您也可以從服務器響應中提取json數據。
使用外部Lib配置JMeter
- 下載Minimal Json Library最新版本,
- 把它放進去
<JMeter Home>/lib/ext
, - 重啟JMeter。
現在在Http Sampler下創建一個JSR223 Post處理器,其服務器響應是一個Json文檔。從以下腳本中選擇Java語言並激發靈感:
import com.eclipsesource.json.JsonObject;
String jsonString = prev.getResponseDataAsString();
JsonArray members = Json.parse(jsonString).asObject().get("members").asArray();
vars.put("firstName",String.valueOf(members.get(2).getString("firstName","")));
上面的代碼提取第三個家族成員的firstName並將其放在一個變量中。
JSR223與Groovy
JSR223 PostProcessor具有Groovy語言支持,它具有內置的JSON支持,因此您不必添加任何.jars。示例代碼:
import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper();
def response = jsonSlurper.parseText(prev.getResponseDataAsString());
vars.put("firstName", response.members[2].firstName.toString());
該${firstname}
可以根據需要再後來被重用。
BeanShell Json Extractor
盡管使用BeanShell後處理器可以獲得相同的結果,但出於性能原因,我們不建議這樣做。應該使用JSR223後處理器來支持BeanShell後處理器。使用Groovy的JSR223比BeanShell快幾個級別。
配置與JSR223非常相似。這裏我們有最終變量${firstname_BSH}
。
JMeter插件(Json Path Extractor)
從JMeter 3.0開始,JMeter Json Extractor插件應該被放棄,以支持內置的Json Path提取器。如果您使用的是JMeter, 此插件仍然有用<= 2.13
。
用例
Json提取器在以下情況下特別有用:
- Json REST Apis:越來越多的休息apis基於Json,
- OAuth身份驗證機制,使用Json發送和接收訪問權限和刷新令牌,
- 單頁Web應用程序(主要看到React或AngularJS)與JSon REST後端通信。
最後的話
這個巨大的Json教程即將結束!可是等等?它尚未完成!
您可能有興趣查看我們的其他指南:
- XPath Extractor:從XML響應中提取內容(如SOAP,
- CSS Jquery Extractor:使用css選擇器從HTML響應中提取內容,
- 眾所周知的Regex Extractor:使用正則表達式來提取部分響應。
JMETER從JSON響應中提取數據