Jmeter values mapping - jmeter

How to achieve a kind of mapping between string and numeric values that can be used for comparison in assertion? Example:
MAP "DELIVERED"=0
"PENDING"=1
"WAITING"=2
sampler1 - extracted numeric_value=0
sampler2 - assert string value="DELIVERED" is equal to its numeric value

Please check the below test plan:-
I have used variable name from regular expression of 1st sampler in the switch controller like ${regVar}..Then used the second request 3 times i.e. 0,1,2 and used response assertion with the desired value like "DELIVERED"=0 for first sampler under switch i.e "0" then in second "PENDING"=1 i.e "1"..so on.
With this, based on the regEx value from 1st http sample, only one http request will be send for 2nd sampler and that request have it own assertion. I have tried with both positive and negative cases. Please change the assertion value based on your requirements.
Please check if it helps.

Be aware of JSR223 Assertion which allows you to use arbitrary Groovy code to define pass/fail criteria.
You can access the numeric_value using vars shorthand for JMeterVariables class like:
def numericValue = vars.get('numeric_value')
Example code:
def myMap = ['0':'DELIVERED', '1':'PENDING', '2':'WAITING']
def numericValue = vars.get('numeric_value')
log.info('Numeric value is: ' + numericValue)
log.info('Status is: ' + myMap.get(numericValue))
Demo:
More information: Scripting JMeter Assertions in Groovy - A Tutorial

Thanks Dmitri, implemented solution based on your suggestion and it suites fine.

Related

Extracting corresponding values in JSR223 post processor in JMeter Randomly

Hi All / Dimitri T Could you please post your valuable thoughts on extracting corresponding Values (For example ItemID1 and ItemSlot1) in one block of code randomly. I was able to write below Jsr223 postprocessor code and it is working fine. But when there are Blank spaces in ItemSlot id, then they are not fetching. From below code , i am passing ${rannum} under "Match No" in required regular expression.
Note: There will be more than 100 corresponding values. In some cases, we won't have ItemSlot1.i.e Blank/null values are appearing from server response. Hence, my script is not picking corresponding values.
Application Server Response:
"viewSaleListingLink": "https://Example.com/cars/item/search/-/listing/ItemID1/100011142",
"saleCountry": "",
"saleNote": "",
"bidLiveUrl": "https://Example.com/cars//registration?p_p_id=RegistrationPortlet_WAR_PWRWeb&p_p_lifecycle=1&p_p_state=normal&ItemSlot1=103009468",
JSR223PostProcessor Code
import java.math.MathContext;
import java.math.RoundingMode;
// Read occurance values from pervious response
def Max = Integer.parseInt( vars.get("ItemID1_matchNr"));
int min=1;
int rannum = min + (int) (Math.random() * ((Max - min) + 1));
log.info("Values id ="+rannum);
vars.put("rannum",rannum.toString());
enter image description here
If you need to extract a random match/pair of matches from the response using Regular Expression Extractor - it's sufficient just to provide 0 as the "Match No" and it will automatically fetch the random match group so you won't have to write any code:
Also be aware that Post-Processors are executed in the order they appear (upside down) so:
If your JSR223 PostProcessor is above the Regular Expression Extractor - ItemID1_matchNr will be undefined
If your JSR223 PostProcessor is below the Regular Expression Extractor - your rannum variable won't have any value
Also your response seems to be JSON so it makes sense switching to JSON JMESPath Extractor which is more powerful and convenient

Get value for dynamic vars.put

If I set the put key value to the dynamic i value in the graph (this is a requirement),
When I get vars.get("i"), I can only get the value aaa2 when i=2
I want to get all the values(aaa1 and aaa2), what should I do?
To view multiple values you need to save multiple variables by changing your vars.put line to:
vars.put("i" + i, a);
and then get it using ${i[number]} as:
${i0} ${i1} ${i2}
Another option is to concatenate values to variable ${i] similar to
vars.put("i" , (vars.get("i") == null ? "" : vars.get("i")) + a);
Also change your Beanshell sampler to JSR223 Sampler according to JMeter Best Practices
we advise switching from BeanShell to JSR223 Test Elements

Regular expression is fetching 9 values how can we add all 9 value to next request in Jmeter

Regular expression is fetching 9 values
Need to add all these ticked values with comma separation in next request.How can we do this in J meter
How can we pass multiple values extracted via regular expression to next request in JMeter
Can you please share some snippet of the HTML response, I'd like to help you with the answer. Also, at times, using an XPath expression in an XPath Extractor can be easier to work with.
If the reference name for is set to VALUE, then you can access each of the 9 matched values as VALUE_1, VALUE_2, ...... VALUE_9
Given you configure your Regular Expression Extractor as follows:
Reference Name: arg_name
Regular Expression: `arg_names" value="(.+?)"
Template: $1$
Match No.: -1
You will get JMeter Variables like:
arg_name_1=foo
arg_name_2=bar
arg_name_3=baz
arg_name_matchNr=3
Now you should be able to concatenate the values using the following __groovy() function:
${__groovy(def builder = new StringBuilder(); 1.upto(Integer.parseInt(vars.get("arg_name_matchNr"))) { builder.append(vars.get("arg_name_" + it)).append("\,") }; builder.toString(),)}
Demo:
More information:
vars is a shorthand to JMeterVariables class instance
Groovy For Loop Examples
Apache Groovy - Why and How You Should Use It

How can I assert a response consisting of an array of values to a user defined variable

I have a Soap request which response returns a set of values under the same tag
let's say
<PricelistDetails>
<ServicePricelistDetailInfo>
<cost>20</cost>
</ServicePricelistDetailInfo>
<ServicePricelistDetailInfo>
<cost>25</cost>
</ServicePricelistDetailInfo>
<ServicePricelistDetailInfo>
<cost>30</cost>
</ServicePricelistDetailInfo>
<PricelistDetails>
I'v created an Xpath assertion to assert the cost tag to a user defined variable:
/Envelope/Body/GetServicePricelistResponse/GetServicePricelistResult/ServicePricelistInfoList/ServicePricelistInfo/PricelistDetails/ServicePricelistDetailInfoList/ServicePricelistDetailInfo/cost ='${COST1}'
whilst COST1 is defined as below :
name : COST1
Value :[20,25,30]
but when running the test plan it is showing an assertion error
Note:
I 've created an Xpath extractor to test the assertion query and it returned all
of the cost values from the response correctly
I would suggest putting your XPath query into XPath Extractor, adding Debug Sampler afterwards and checking the generated variables via View Results Tree listener, my expectation is that you will get something like:
cost=20
cost_1=20
cost_2=25
cost_3=30
cost_matchNr=3
So you will be able to use "normal" Response Assertion against these ${cost_1}, ${cost_2} and ${cost3} variables.
If for some reason you need to go the "XPath way" - use the following XPath Expression in the assertion:
concat("[", //PricelistDetails/ServicePricelistDetailInfo[1]/cost, ",", //PricelistDetails/ServicePricelistDetailInfo[2]/cost, ",", //PricelistDetails/ServicePricelistDetailInfo[3]/cost, "]")="${COST1}"
Demo:
References:
XSLT, XPath, and XQuery Functions
XPath Language Specification
How to Use JMeter Assertions in Three Easy Steps
Your expression will just compare each of values from returned array (20, 25, 30) with [20,25,30] like:
20 = [20,25,30] # false
25 = [20,25,30] # false
30 = [20,25,30] # false
and return false as all comparissons failed, while you need to compare all of them at once:
[20,25,30] = [20,25,30] # true
I'm not sure that it's the best solution, but as last resort you can try
concat('[', string-join(//PricelistDetails/ServicePricelistDetailInfo/cost, ','), ']') = '${COST1}'

JMeter: Parse JSON and count

I am using JMeter to test a web application. The application returns JSON that looks like the following:
{"type":"8","id":"2093638401"}
{"type":"9","id":"20843301"}
{"type":"14","id":"20564501"}
I need to get a count based on type.
I have tried adding foreach controller with a regular expression extractor, but Im not sure I have done it correctly:
Apply to: Main sample only
Response field to check: Body
Reference name: match_type
Regular Expression: "type":"(\d)"
Template: $1$
Match no.: -1
Im new to JMeter so Im not sure if Im doing any of this correctly.
Thanks
If you want to operate on both type and id in single sampler, I think simple regex and ForEach controller won't be sufficient. You will have to write two regex extractor followed by while controller with BSF processor (javascript or beanshell) to extract both the values and export them to jmeter variable. Something of following type
- First Request
- Regex extractor for type
- Regex extractor for id
- BSF processor (to initialize the loopcount=0 and the total_matches of matches that you found)
- while controller (loopcount < total_matches)
- BSF processor
- export/set current_type = type_$loopcount
- export/set current_id = id_$loopcount
- increment loopcount
- USE current_type and current_id in whatever sampler you like
== Update ==
This http://goo.gl/w3u1r tutorial depicts exactly how to go about it.

Resources