2012-06-16 181 views
7

我讀過jMeter RegEx提取的一些教程,但它不工作。我使用jMeter 2.7。jMeter RegEx JSON響應

我有這樣的JSON:

{"address":{"id":26,"user_id":1,"genre":"billing","first_name":"testFN1","last_name":"testLN1","company":null,"street1":null,"street2":null,"city":null,"state":"DC","zip":null,"country":null,"country_iso2":null,"phone1":"32432424322","phone2":null}} 

,這正則表達式提取: 「ID」:(?+),這裏的JMeter

enter image description here

的截圖爲提取,我得到$new_address_id = ,而不是。有任何想法嗎?

更新2012年6月26日

感謝Cylian的建議。這非常有幫助。我最終將其更改爲:"id":(\d+)

我也沒有找到一個在JMX文件替換爲

<stringProp name="RegexExtractor.regex">&quot;id&quot;:(.+?,)</stringProp> 

<stringProp name="RegexExtractor.regex">&quot;id&quot;:(\d+)</stringProp> 

從而迅速作出修復更換。謝謝!

回答

11

我建議你看看:

http://jmeter-plugins.org/wiki/JSONPathExtractor/

本節(JSON utils的(JSON路徑斷言,JSON路徑抽出,JSON格式化)),特別是對於這種情況。這些是我公司開發的一套jmeter工具,它們非常有用。

讓我們以您的案例爲例。測試用例是這樣的:

enter image description here

所以虛擬樣品返回響應,就像你所指定的一個:

{"address":{"id":26,"user_id":1,"genre":"billing","first_name":"testFN1","last_name":"testLN1","company":null,"street1":null,"street2":null,"city":null,"state":"DC","zip":null,"country":null,"country_iso2":null,"phone1":"32432424322","phone2":null}} 

JSON提取很簡單:

$.address.id 

而且你不需要花哨的正則表達式。結果是26(這是我在調試採樣器中看到的)。從問題

更新的評論:

如果你有值列表,即:

{"address":[{"id":26,"user_id":1,"genre":"billing","first_name":"testFN1","last_name":"testLN1","company":null,"street1":null,"street2":null,"city":null,"state":"DC","zip":null,"country":null,"country_iso2":null,"phone1":"32432424322","phone2":null}, {"id":6,"user_id":1,"genre":"billing","first_name":"testFN1","last_name":"testLN1","company":null,"street1":null,"street2":null,"city":null,"state":"DC","zip":null,"country":null,"country_iso2":null,"phone1":"32432424322","phone2":null}]} 

名單與2地址-ES,1具有ID 26,另一個6. JSON的路徑$.address.id應該返回這兩個ID。我剛纔看到採樣器源代碼,這是不可能得到計數,但是你可以通過添加另一個後置處理器來樣,即BSF Sampler並通過添加該代碼做到這一點:

vars.put("ADDRESS_COUNT", "${__javaScript('${add}'.split('\,').length,)}".toString()); 

哪裏${add}是你存儲在何處的任何變量結果$.address.id

+0

螞蟻,這很有趣。但是,由於某種原因,我無法讓mvn編譯這個文件。有沒有可以在不編譯的情況下下載的JAR文件? – Dean

+1

@Dean你可能使用maven 2來構建項目。你應該使用maven 3,對不起,沒有提到在github頁面我會改變它 – ant

+0

它剛纔改變 – ant

12

您正在使用.+?這意味着:

  • . - 比賽前一個之間的字符 - 匹配任何單個字符不是一個換行字符
  • +(缺省情況下,可使用s標誌被改變)和無限次
  • ? - 作爲幾次儘可能(懶惰)

因此,雖然它將匹配"id":26,但該模式僅與.+?匹配爲2而非26

要解決這個問題,你嘗試更好的東西比這

("id":\d+)\b 

意味着

// ("id":\d+)\b 
// 
// Options: case insensitive 
// 
// Match the regular expression below and capture its match into backreference number 1 «("id":\d+)» 
// Match the characters 「"id":」 literally «"id":» 
// Match a single digit 0..9 «\d+» 
//  Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
// Assert position at a word boundary «\b» 

("id":[^,:]+)\b 

意味着

// ("id":[^,:]+)\b 
// 
// Options: case insensitive 
// 
// Match the regular expression below and capture its match into backreference number 1 «("id":[^,:]+)» 
// Match the characters 「"id":」 literally «"id":» 
// Match a single character NOT present in the list 「,:」 «[^,:]+» 
//  Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
// Assert position at a word boundary «\b» 

("id":\S+)\b 

意味着

// ("id":\S+)\b 
// 
// Options: case insensitive 
// 
// Match the regular expression below and capture its match into backreference number 1 «("id":\S+)» 
// Match the characters 「"id":」 literally «"id":» 
// Match a single character that is a 「non-whitespace character」 «\S+» 
//  Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
// Assert position at a word boundary «\b» 

希望這有助於。

+0

謝謝,這是非常有幫助的。 – Dean

+0

這應該是正確的答案。 –

0

在jmeter中選擇JSON響應的最好方法是做類似於(?m)「nodeRef」:「workspace:// SpacesStore/idSpaceStore」,\ s *「name」:「folder_for_testing-1372432881900」,

(M?) - 用於啓動治療的正則表達式爲導向 多線(\ S *) - 指任何字符