2012-06-16 21 views
7

Przeczytałem kilka samouczków dotyczących ekstrakcji jMeter RegEx, ale to nie działa. Używam jMeter 2.7.jMeter RegEx Odpowiedź JSON

mam ten 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}} 

i ten regex Extractor: "id": (.? +), Oto zrzut ekranu JMeter

enter image description here

Do ekstrakcji, ja uzyskać $new_address_id = , zamiast . Jakieś pomysły?

UPDATE 26.06.2012:

Dzięki Cylian za sugestię. To bardzo pomocne. Zmieniłem go na: "id":(\d+).

Ja też zrobiłem znaleźć zastąpić w pliku JMX dla

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

i zastąpić

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

który wydał poprawkę szybko. Dzięki!

Odpowiedz

11

Proponuję przyjrzeć:

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

ten odcinek (utils JSON (JSON Ścieżka twierdzenie, JSON Ścieżka wyciąg, JSON Formatter)), w szczególności w tym przypadku. Są to zestaw narzędzi jmeterowych opracowanych w mojej firmie, są one bardzo przydatne.

Weźmy za przykład Twoją sprawę. Przypadek testowy wygląda następująco:

enter image description here

Więc manekin próbka zwraca odpowiedź, tak jak ten, który określony:

{"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}} 

ekstrakcja JSON jest bardzo prosta:

$.address.id 

I nie potrzebujesz żadnych wyrafinowanych wyrażeń. Wynik to 26 (to jest to, co widzę w sampler debugowania).

Aktualizacja z pytaniem w komentarzach:

Gdybyś listę wartości mają IE:

{"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}]} 

Lista z 2 Adres-es, 1 ma identyfikator 26 i 6. inną ścieżkę Json $.address.id powinien zwrócić oba te identyfikatory. Widziałem tylko kod źródłowy sampler i to nie jest możliwe, aby uzyskać zliczania jednak można to zrobić przez dodanie kolejnego postprocesor do próbki tj BSF Sampler i dodając ten kod:

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

Gdzie ${add} jest jakakolwiek zmienna w której przechowywany wyniki $.address.id.

+0

mrówka, to jest bardzo interesujące. Jednak z jakiegoś powodu nie udało mi się przekonać mvn do kompilacji pliku. Czy istnieje plik JAR, który można pobrać bez kompilacji? – Dean

+1

@ Dean prawdopodobnie używasz maven 2 do budowy projektu. Powinieneś użyć maven 3, przepraszam, nie wspominając o tym, że na stronie github zmienię to – ant

+0

to się zmieniło właśnie teraz – ant

12

Używasz .+? co oznacza:

  • . - Dopasuj dowolny pojedynczy znak, który nie jest znakiem łamania linii (domyślnie, może zostać zmieniony za pomocą s Flag)
  • + - poprzedzający mecz charakter między jedną i nieograniczone czasy
  • ? - jak kilka razy, jak to możliwe (leniwy)

Tak więc, podczas gdy będzie pasować do "id":26, wzorzec będzie pasował .+? tylko jako 2 tylko zamiast 26.

Aby rozwiązać ten problem, spróbuj coś lepszego niż to:

("id":\d+)\b 

oznacza

// ("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» 

lub

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

oznacza

// ("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» 

lub

("id":\S+)\b 

oznacza

// ("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» 

nadzieję, że to pomaga.

+0

Dzięki, to jest bardzo pomocne. – Dean

+0

To powinna być poprawna odpowiedź. –

0

najlepszym sposobem wyboru odpowiedzi JSON w jmeterze jest zrobienie czegoś takiego jak (? M) "nodeRef": "workspace: // SpacesStore/idSpaceStore", \ s * "name": "folder_for_testing-1372432881900",

(m?) - środki zaczynają traktować regexp jak wielu linii zorientowanych (\ s *) - oznaczają wszelkie znaki

Powiązane problemy