JMeter регулярное выражение JSON-ответ

#performance #testing #jmeter

Вопрос:

Я прочитал несколько руководств по извлечению регулярных выражений JMeter, но это не работает. Я использую JMeter 2.7.

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

и этот экстрактор регулярных выражений: «идентификатор»:(. ?), вот скриншот JMeter

введите описание изображения здесь

Для извлечения я получаю $new_address_id = 2 вместо 26. Есть какие-нибудь идеи?

ОБНОВЛЕНИЕ 6/26/2012:

Спасибо Сайлиану за ваше предложение. Это очень полезно. В итоге я изменил его на: "id":(d ) .

Я также нашел замену в файле JMX для

 <stringProp name="RegexExtractor.regex">amp;quot;idamp;quot;:(. ?,)</stringProp>
 

и заменить на

 <stringProp name="RegexExtractor.regex">amp;quot;idamp;quot;:(d )</stringProp>
 

Что быстро исправило ситуацию. Спасибо!

Ответ №1:

Вы используете . ? , что означает:

  • . — Сопоставьте любой отдельный символ, который не является символом разрыва строки(по умолчанию, может быть изменен с помощью 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»
 

Надеюсь, это поможет.

Комментарии:

1. Спасибо, это очень полезно.

Ответ №2:

Я предлагаю вам взглянуть на :

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

Этот раздел (JSON utils (утверждение пути JSON, Извлечение пути JSON, форматирование JSON)), в частности, для этого случая. Это набор инструментов jmeter, разработанных в моей компании, они очень полезны.

Давайте возьмем в качестве примера ваш случай. Тестовый пример выглядит следующим образом :

введите описание изображения здесь

Таким образом, фиктивный образец возвращает ответ, точно такой же, как тот, который вы указали :

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

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

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

Комментарии:

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

2. @Dean вы, вероятно, используете maven 2 для создания проекта. Вам следует использовать maven 3, извините, что не упомянул об этом на странице github, я это изменю

3. @Дин, ты смог построить ?

4. Привет, муравей, извини, у меня не было возможности построить после того, как регулярное выражение сработало. Я займусь этим, когда проведу несколько более сложных проверок

5. Привет, муравей, у меня есть OS X Lion и я использую RailsInstaller. Он построил его очень легко. Мне нравятся компоненты. Однако я не смог найти здесь больше информации о различных компонентах: atlantbh.com/jmeter-components . Например, в компоненте извлечения JSON ничего нет.

Ответ №3:

лучший способ выбрать ответ JSON в jmeter-это сделать что-то вроде (?m) «nodeRef»: «рабочее пространство://SpacesStore/idSpaceStore»,s* «имя»: «folder_for_testing-1372432881900»,

(?m) — означает начать рассматривать регулярное выражение как многострочное (s*) — означает любые символы