2012-06-16 2 views
7

Я прочитал несколько руководств по извлечению jMeter RegEx, но он не работает. Я использую jMeter 2.7.jMeter RegEx JSON response

У меня есть этот 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}} 

и этот RegEx Extractor: "ID": (.? +), Вот скриншот Jmeter

enter image description here

Для экстракции, я get $new_address_id = , вместо . Есть идеи?

UPDATE 6/26/2012:

Спасибо 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 Drivers (JSON Путь утверждения JSON Путь Extractor, JSON Formatter)), в частности, для этого случая. Это набор инструментов 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 (это то, что я вижу в debug sampler).

Обновление от вопроса в комментариях:

Если вы должны были иметь список значений, то есть:

{"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-х адресов, 1 имеет идентификатор 26 и другой 6. Json Path $.address.id должны возвращать обе эти идентификаторы. Я только что видел исходный пробоотборник кода, и это не возможно, чтобы получить счет, однако вы можете сделать это, добавив еще один постпроцессор вашего образца, т.е. BSF Sampler и добавляя этот код:

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

Где ${add} является любым переменным, где хранятся результаты $.address.id.

+0

муравей, это очень интересно. Однако по какой-то причине я не смог получить mvn для компиляции файла. Есть ли файл JAR, который можно загрузить без компиляции? – Dean

+1

@ Вы можете использовать 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

Лучший способ выбора ответа JSON в jmeter - это сделать что-то вроде (? M) "nodeRef": "workspace: // SpacesStore/idSpaceStore", \ s * "name": "folder_for_testing-1372432881900",

(м?) - значит начать лечить регулярное выражение как множественная линии, ориентированной (\ S *) - означает любые символы