日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JMETER从JSON响应中提取数据

發布時間:2023/11/30 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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及更高版本開始,Json插件是可選的。

安裝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提取器來提取firstnamejson字段。

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.JsonSlurperdef 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:使用正則表達式來提取部分響應。

轉載于:https://www.cnblogs.com/a00ium/p/10388389.html

總結

以上是生活随笔為你收集整理的JMETER从JSON响应中提取数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。