若是你在這裏,多是由於你須要使用JMeter從Json響應中提取變量。css
好消息!您正在掌握掌握JMeter Json Extractor的權威指南。做爲Rest API測試指南的補充,您將學習掌握Json Path Expressions 所需的一切。html
咱們走吧!而且不要驚慌,那裏沒有什麼困難。前端
爲了更好地理解Json是什麼,這是一個示例Json文檔:java
{
"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。react
你可能會問本身:爲何我須要學習Json?jquery
愈來愈多的REST API和服務器使用Json做爲主要的數據交換格式。在OctoPerf,咱們大量使用Json在AngularJS前端客戶端和Spring Boot後端之間交換數據。git
想知道最好的部分嗎?angularjs
從JMeter 3.0開始,使用Json變量提取器從Json響應中提取數據要容易得多。換句話說,Json提取器能夠原生使用。github
JMeter JsonPath Extractor插件能夠從jmeter-plugins網站下載和安裝。從JMeter 3.0及更高版本開始,Json插件是可選的。正則表達式
安裝JMeter JsonPath插件
JMETER_HOME/lib/ext
目錄,Options > Plugins Manager
頂部菜單,Available Plugins
標籤,Json Plugins
並單擊Apply Changes並從新啓動JMeter。在JMeter的Json的插件應該在右鍵菜單Add > Post Processors > Json Path Extractor
。順便說一句,咱們建議您閱讀咱們的JMeter插件安裝指南,瞭解有關JMeter插件的更多詳細信息。
你懶嗎?由於我是。讓咱們使用原生的JsonPath Extractor!
JMeter的Json Post處理器使用Json Way,一種Java Json Path API,在服務器響應上執行JSon路徑提取。
Json Path提取器應放在HTTP Sampler下。它有幾種可能的設置,所以最相關的是:
-1
對於全部,0
對於隨機的,n
對於第n個,${foo_ALL}
包含全部提取值的串聯的變量,真棒!可是我該如何開始?
如下是一些示例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探索上面的一些例子。
你猜怎麼着?咱們打算試一試。
咱們的示例JMX展現了JMeter Json Extractor和Plugin JsonPath Extractor的工做原理。在JMeter 3.0以前,須要插件執行JsonPath提取。從JMeter 3.0開始,Json Extractions獲得了集成支持。
準備採起一些行動?咱們走吧!
從商店中提取全部做者
提取數組能夠一次從單個Json文檔中提取多個值。例如,咱們能夠從書店中提取全部做者:
authors
產生變量${authors}
,$..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
,$.store.book[?(@.price<= 10)].title
圖書標題的價格<= 10)。您將得到如下變量:
titles_1=Sayings of the Century titles_2=Moby Dick titles_matchNr=2
價格低於10的書籍。
提取書籍做者和標題
如今假設咱們想要同時提取多個Json字段。例如,咱們想查詢全部做者和標題:
multiple
,-1
,$..['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}
),$.headers.*
,-1
這意味着提取全部出現的,如今讓咱們看看結果。
提取全部結果的串聯
最後,讓咱們使用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驗證變量值
的響應斷言被配置以下:
John
在咱們的示例中。是時候執行線程組並查看結果了。
斷言成功經過
若是咱們替換斷言模式來測試titi
。
斷言失敗了
大!如今您知道如何從json響應中提取變量並使用Response Assertion驗證變量值。
如今,你可能想知道:什麼可能出錯?
應該避免的3個常見錯誤是:
根據具體狀況,您可使用其餘技術從服務器響應中提取內容。
假設您有一個很是簡單的Json文檔,其中包含如下內容,而且您須要全部名字:
{
"name":"Simpsons family", "members":[ {"firstName":"Homer", "lastName":"Simpson"}, {"firstName":"Marge", "lastName":"Simpson"}, {"firstName":"Bart", "lastName":"Simpson"} ] }
在這種狀況下,正則表達式提取器可能很適合,由於編寫正則表達式很是簡單。
咱們定義瞭如下設置:
firstname_RegEx
,"firstName":"(.+?)"
,$1$
,3
,(咱們想要Bart)D'oh!
。經過使用Minimal Json庫並將其添加到JMeter,您也能夠從服務器響應中提取json數據。
使用外部Lib配置JMeter
<JMeter Home>/lib/ext
,如今在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 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後處理器能夠得到相同的結果,但出於性能緣由,咱們不建議這樣作。應該使用JSR223後處理器來支持BeanShell後處理器。使用Groovy的JSR223比BeanShell快幾個級別。
配置與JSR223很是類似。這裏咱們有最終變量${firstname_BSH}
。
從JMeter 3.0開始,JMeter Json Extractor插件應該被放棄,以支持內置的Json Path提取器。若是您使用的是JMeter, 此插件仍然有用<= 2.13
。
Json提取器在如下狀況下特別有用:
這個巨大的Json教程即將結束!但是等等?它還沒有完成!
您可能有興趣查看咱們的其餘指南: