javascript
JMETER从JSON响应中提取数据
如果你在這里,可能是因?yàn)槟阈枰褂肑Meter從Json響應(yīng)中提取變量。
好消息!您正在掌握掌握J(rèn)Meter Json Extractor的權(quán)威指南。作為Rest API測試指南的補(bǔ)充,您將學(xué)習(xí)掌握J(rèn)son Path Expressions?所需的一切。
我們走吧!并且不要驚慌,那里沒有什么困難。
Json格式
為了更好地理解Json是什么,這是一個(gè)示例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是一種非常簡單的數(shù)據(jù)格式,幾年前就已經(jīng)接管了XML。
你可能會(huì)問自己:為什么我需要學(xué)習(xí)Json?
越來越多的REST API和服務(wù)器使用Json作為主要的數(shù)據(jù)交換格式。在OctoPerf,我們大量使用Json在AngularJS前端客戶端和Spring Boot后端之間交換數(shù)據(jù)。
想知道最好的部分嗎?
從JMeter 3.0開始,使用Json變量提取器從Json響應(yīng)中提取數(shù)據(jù)要容易得多。換句話說,Json提取器可以原生使用。
JMeter JsonPath插件
JMeter JsonPath Extractor插件可以從jmeter-plugins網(wǎng)站下載和安裝。從JMeter 3.0及更高版本開始,Json插件是可選的。
安裝JMeter JsonPath插件
- 下載plugins-manager.jar并將其放入JMETER_HOME/lib/ext目錄,
- 重啟JMeter,
- 點(diǎn)擊Options > Plugins Manager頂部菜單,
- 選擇Available Plugins標(biāo)簽,
- 選擇Json Plugins并單擊Apply Changes并重新啟動(dòng)JMeter。
在JMeter的Json的插件應(yīng)該在右鍵菜單Add > Post Processors > Json Path Extractor。順便說一句,我們建議您閱讀我們的JMeter插件安裝指南,了解有關(guān)JMeter插件的更多詳細(xì)信息。
你懶嗎?因?yàn)槲沂?。讓我們使用原生的JsonPath Extractor!
JMeter Json Path Extractor
JMeter的Json Post處理器使用Json Way,一種Java Json Path API,在服務(wù)器響應(yīng)上執(zhí)行JSon路徑提取。
Json Path提取器應(yīng)放在HTTP Sampler下。它有幾種可能的設(shè)置,因此最相關(guān)的是:
- 變量名稱:分號(hào)單獨(dú)的變量名稱,
- JSON Path Expressions:從json響應(yīng)中提取內(nèi)容的表達(dá)式,
- 匹配數(shù)字:-1對(duì)于所有,0對(duì)于隨機(jī)的,n對(duì)于第n個(gè),
- Compute concatenation var:創(chuàng)建一個(gè)${foo_ALL}包含所有提取值的串聯(lián)的變量,
- 和默認(rèn)值:如果表達(dá)式不適用于正在處理的json文檔。
真棒!但是我該如何開始?
示例Json路徑
以下是一些示例Json Path表達(dá)式,可用于從上面公開的Json文檔中提取數(shù)據(jù):
| $ .store.book [*]。作者 | 所有書籍的作者 |
| $ ..作者 | 所有作者 |
| $ .store。* | 所有的東西,書籍和自行車 |
| $ .store..price | 一切的價(jià)格 |
| $ ..本書[0,1] | 前兩本書 |
| $ ..書[2] | 從索引0(含)到索引2(獨(dú)家)的所有書籍 |
| $ ..書[2:] | 從尾巴預(yù)訂二號(hào) |
| $ ..書[?(@。ISBN) | 所有ISBN編號(hào)的書籍 |
| $ .store.book [?(@。price <10)] | 商店里的所有書籍都比10便宜 |
| $ .. book [?(@。price <= $ ['expensive'])] | 店內(nèi)所有書籍都不“貴” |
| $ .. book [?(@。author =?/.* REES / i)] | 所有與正則表達(dá)式匹配的書籍(忽略大小寫) |
| $ .. * | 把所有東西都給我 |
| $ .. book.length() | 書籍?dāng)?shù)量 |
如您所見,從Json文檔中查詢特定信息并將它們放入變量中非常簡單靈活。讓我們用JMeter探索上面的一些例子。
你猜怎么著?我們打算試一試。
真實(shí)的JMeter示例
我們的示例JMX展示了JMeter Json Extractor和Plugin JsonPath Extractor的工作原理。在JMeter 3.0之前,需要插件執(zhí)行JsonPath提取。從JMeter 3.0開始,Json Extractions得到了集成支持。
準(zhǔn)備采取一些行動(dòng)?我們走吧!
陣列提取
從商店中提取所有作者
提取數(shù)組可以一次從單個(gè)Json文檔中提取多個(gè)值。例如,我們可以從書店中提取所有作者:
- 變量名稱:authors產(chǎn)生變量${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我們得到了所有書籍的所有作者!
條件提取
有選擇地提取書籍標(biāo)題
現(xiàn)在假設(shè)我們想要提取價(jià)格小于或等于10的書籍的標(biāo)題:
- 變量名稱:titles產(chǎn)生${titles}變量,
- 比賽號(hào)碼:-1,
- JSONPath表達(dá)式?:(?$.store.book[?(@.price<= 10)].title圖書標(biāo)題的價(jià)格<= 10)。
您將獲得以下變量:
titles_1=Sayings of the Century titles_2=Moby Dick titles_matchNr=2價(jià)格低于10的書籍。
多次提取
提取書籍作者和標(biāo)題
現(xiàn)在假設(shè)我們想要同時(shí)提取多個(gè)Json字段。例如,我們想查詢所有作者和標(biāo)題:
- 變量名稱:multiple,
- 比賽號(hào)碼:-1,
- JSONPath表達(dá)式:$..['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提取書籍作者和標(biāo)題
這就是JMeter UI中顯示的結(jié)果。
連接提取
有時(shí),您希望將所有結(jié)果提取并連接成單個(gè)字符串。在這個(gè)例子中,我采用了HTTPBin頭?json端點(diǎn)。
這可以使用該Compute Concatenation var (suffi _ALL)選項(xiàng)實(shí)現(xiàn)。
從JMeter調(diào)用HTTPBin時(shí)收到Json響應(yīng)
端點(diǎn)返回包含客戶端發(fā)送的標(biāo)頭的json。你應(yīng)該看到類似的東西:
{"headers": {"Connection": "close", "Host": "httpbin.org", "User-Agent": "Apache-HttpClient/4.5.5 (Java/1.8.0_161)" } }現(xiàn)在讓我們修改Json提取器并啟用連接結(jié)果的選項(xiàng):
- 創(chuàng)建變量的名稱?:(?foo產(chǎn)生${foo}),
- JSON路徑表達(dá)式:$.headers.*,
- 匹配Nr:-1這意味著提取所有出現(xiàn)的,
- 計(jì)算連接var:選中。
現(xiàn)在讓我們看看結(jié)果。
提取所有結(jié)果的串聯(lián)
最后,讓我們使用Debug Sampler來查看正在提取的變量(foo在此處命名)。
調(diào)試結(jié)果
結(jié)果應(yīng)該是這樣的:
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就能輕松完成。
使用響應(yīng)斷言
這是一個(gè)非常常見的問題:如何使用斷言驗(yàn)證從json中提取的變量?
否則,您要確保提取的變量是正確的。讓我們看看如何做到這一點(diǎn)。
JMeter Dummy Sampler插件
對(duì)于此示例,我們將使用Dummy Sampler插件。為什么?因?yàn)樗试S使用我們想要的任何json生成樣本結(jié)果。
讓我們使用以下Json:
{"firstname": "John","lastname": "Smith" }我們只是將配置虛擬采樣器以將此Json作為響應(yīng)發(fā)送。
JMeter Dummy Sampler插件配置
然后,我們創(chuàng)建一個(gè)Json提取器來提取firstnamejson字段。
JMeter Json Extractor
現(xiàn)在讓我們配置一個(gè)響應(yīng)斷言。
響應(yīng)斷言必須位于之后的JSON提取才能工作。
使用Response Assertion驗(yàn)證變量值
的響應(yīng)斷言被配置如下:
- 應(yīng)用于:要使用的JMeter變量名稱,
- 要測試的字段:文本響應(yīng),
- 模式匹配規(guī)則:等于,
- 要測試的模式:John在我們的示例中。
是時(shí)候執(zhí)行線程組并查看結(jié)果了。
斷言成功通過
如果我們替換斷言模式來測試titi。
斷言失敗了
大!現(xiàn)在您知道如何從json響應(yīng)中提取變量并使用Response Assertion驗(yàn)證變量值。
3常見錯(cuò)誤
現(xiàn)在,你可能想知道:什么可能出錯(cuò)?
應(yīng)該避免的3個(gè)常見錯(cuò)誤是:
- 不要在單個(gè)Json Path提取器中定義多個(gè)變量:腳本可能變得難以理解/維護(hù),
- 不要編寫易受特定json響應(yīng)影響的表達(dá)式,試著堅(jiān)持一般情況,
- 解決方案越簡單,腳本可維護(hù)性就越好。
很高興知道解決方法
根據(jù)具體情況,您可以使用其他技術(shù)從服務(wù)器響應(yīng)中提取內(nèi)容。
正則表達(dá)式提取器
假設(shè)您有一個(gè)非常簡單的Json文檔,其中包含以下內(nèi)容,并且您需要所有名字:
{"name":"Simpsons family","members":[{"firstName":"Homer", "lastName":"Simpson"}, {"firstName":"Marge", "lastName":"Simpson"}, {"firstName":"Bart", "lastName":"Simpson"} ] }在這種情況下,正則表達(dá)式提取器可能很適合,因?yàn)榫帉懻齽t表達(dá)式非常簡單。
我們定義了以下設(shè)置:
- 參考名稱:firstname_RegEx,
- 正則表達(dá)式:"firstName":"(.+?)",
- 模板:?$1$,
- 匹配Nr?:?3,(我們想要Bart)
- 默認(rèn)值:D'oh!。
JSR223與外部庫
通過使用Minimal Json庫并將其添加到JMeter,您也可以從服務(wù)器響應(yīng)中提取json數(shù)據(jù)。
使用外部Lib配置JMeter
- 下載Minimal Json Library最新版本,
- 把它放進(jìn)去<JMeter Home>/lib/ext,
- 重啟JMeter。
現(xiàn)在在Http Sampler下創(chuàng)建一個(gè)JSR223 Post處理器,其服務(wù)器響應(yīng)是一個(gè)Json文檔。從以下腳本中選擇Java語言并激發(fā)靈感:
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","")));上面的代碼提取第三個(gè)家族成員的firstName并將其放在一個(gè)變量中。
JSR223與Groovy
JSR223 PostProcessor具有Groovy語言支持,它具有內(nèi)置的JSON支持,因此您不必添加任何.jars。示例代碼:
import groovy.json.JsonSlurperdef jsonSlurper = new JsonSlurper(); def response = jsonSlurper.parseText(prev.getResponseDataAsString()); vars.put("firstName", response.members[2].firstName.toString());該${firstname}可以根據(jù)需要再后來被重用。
BeanShell Json Extractor
盡管使用BeanShell后處理器可以獲得相同的結(jié)果,但出于性能原因,我們不建議這樣做。應(yīng)該使用JSR223后處理器來支持BeanShell后處理器。使用Groovy的JSR223比BeanShell快幾個(gè)級(jí)別。
配置與JSR223非常相似。這里我們有最終變量${firstname_BSH}。
JMeter插件(Json Path Extractor)
從JMeter 3.0開始,JMeter Json Extractor插件應(yīng)該被放棄,以支持內(nèi)置的Json Path提取器。如果您使用的是JMeter,?此插件仍然有用<= 2.13。
用例
Json提取器在以下情況下特別有用:
- Json REST Apis:越來越多的休息apis基于Json,
- OAuth身份驗(yàn)證機(jī)制,使用Json發(fā)送和接收訪問權(quán)限和刷新令牌,
- 單頁Web應(yīng)用程序(主要看到React或AngularJS)與JSon REST后端通信。
最后的話
這個(gè)巨大的Json教程即將結(jié)束!可是等等?它尚未完成!
您可能有興趣查看我們的其他指南:
- XPath Extractor:從XML響應(yīng)中提取內(nèi)容(如SOAP,
- CSS Jquery Extractor:使用css選擇器從HTML響應(yīng)中提取內(nèi)容,
- 眾所周知的Regex Extractor:使用正則表達(dá)式來提取部分響應(yīng)。
轉(zhuǎn)載于:https://www.cnblogs.com/a00ium/p/10388389.html
總結(jié)
以上是生活随笔為你收集整理的JMETER从JSON响应中提取数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雷鸟电视为什么买的人很少
- 下一篇: mysql删除一条记录