#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*) — означает любые символы