How to use logic controller with an array in JMeter - jmeter

I've a CSV with list of values that are passed in via each POST request and I would like to store a response attribute eg. response_some_id, that generated for each unique POST request.
Once I obtain the array for that set, I would like to run the GET requests on that array; please let me know if I need more details that could help.

Add a Beanshell Post Processor as a child of your "Post Call"
Add the code into the Post Processor's "Script" area
vars.put("response_some_id_" + ${__counter(TRUE,)}, "foo");
The code above will generate following JMeter Variables:
response_some_id1=foo
response_some_id2=foo
response_some_id3=foo
response_some_id4=foo
response_some_id5=foo
If you have "response_some_id" variable you can substitute "foo" bit with vars.get("response_some_id")
Change your Loop Controller to ForEach Controller. Configure the ForEach Controller as follows:
Input Variable Prefix: response_some_id
Start Index: 0
End Index: how many IDs do you have. You can leave this blank.
Output Variable Name: anything meaningful, it will hold current "response_some_id_N" value. I.e. current_response_id
Leave Add "_" before the number ticked
Use ${current_response_id} in your "Get Call"
Reference material:
Documentation entry for __counter function
How to use BeanShell: JMeter's favorite built-in component guide

Related

Jmeter check using if controller, for a variable has a value or not

in one of my steps in the Jmeter script, I'm using json extractor to read a value from a key(address) in the JSON response and store it in a variable called "TypeOfRequest." In the next step, I need to check if the "TypeOfRequest" value is null or not(There can be situations I don't find that key in the JSON response). Then I need to take a different route.
Snippet how I'm getting the TypeOfRequest from Json extractor $.communicationMethods[:1].hTTPS.address
So my question is, how do I check if TypeOfRequest has a value or not in the if controller?
tried using '${__javaScript(vars.get("TypeOfRequest") == null)}(ref https://www.blazemeter.com/blog/jmeter-if-controller and https://sqa.stackexchange.com/questions/32969/how-do-i-check-if-a-variable-is-null-using-a-if-controller) but unable to go through the if condition, can someone help me with this. Thanks in advance
Just use Debug Sampler to see what JMeter Variables are defined and inspect their values, my expectation is that you're "unable to go through the if condition" because your TypeOfRequest variable is not null, i.e. it's present but it's an empty string.
Also the referenced article suggests using __groovy() or __jexl3() function so I believe if you change your condition to something like:
${__groovy(org.apache.commons.lang.StringUtils.isEmpty(vars.get('TypeOfRequest')),)}
you will be able to "go through the if condition"

Using Extracted JSON Value in Another JMeter Thread

First, let me preface this question that I've only been using JMeter for 36 hours.
I've been able to successfully create a thread that performs a POST (json body) to generate a new record.
{
"id":1257697771,
"displayName":"TERM2",
"functionName":"f_1257697771",
"displayableSourceExpression":"TRUE",
"typeId":200,
"groupId":300,
"clobObjId":1257697772,
"typeCode":5,
..........
}
I need to take the new record's ID (1257697771) value returned in order to perform updates, get by ID, delete, etc. on this record in other threads.
After much reading, I've created a Regular Expression Extractor where:
Apply to: Main Sample Only
Field to Check: Body as Document
Reference Name: newRecord
Regular Expression: "id":(.+?)\,"displayName"
Template: $1$
Match No: 1
Default Value: NONE
At this point, I'm not sure if my Regular Expression is formatted correctly where (.+?) is valid.
Also, I'm confused if I can either just specify the new reference (newRecord) in another thread's HTTP request's Parameters or use a BeanShell Post-Processor, or a Response Assertion, etc....
There a lot of answers for the same function of "Passing". Not being a programmer, I've tried to follow the discussion "how to extract json response data in jmeter using regular expression extractor?", but I'm still not clear.
Any insight is appreciated. Thanks.
JMeter Variables are local to Thread Group, you need to convert your variable to JMeter Property.
Use:
__setProperty() function in the Thread Group where you define your newRecord variable like:
${__setProperty(newRecord,${newRecord},)}
__P() function to access property value like:
${__P(newRecord,)}
See Knit One Pearl Two: How to Use Variables in Different Thread Groups article for more detailed explanation.
Also be aware of the Function Helper Dialog as it looks like JMeter functions syntax was developed by aliens.
To pass a value between threads you need to use the jmeter property function.
In a jsr223 postprocessor using groovy the code to get the value is as follows:
def userProperty = props.get('propertyToGet')
vars.put('userProperty', String.valueOf(userProperty))
You would then access the variable in your thread using:
${userProperty}
Or you can use shorthand directly:
${__P('propertyToGet')}
Variables in jmeter are thread specific.
Thanks everyone. I was able to resolve it with your help!
In the first thread:
set the Reg Expression Extractor Regular Expression = "id":(.+?)\,"displayName"
added a Bean Assertion where Parameters = ${__setProperty(newRecord,${newRecord},)}
In the second thread:
appended the Path url with ${__P(newRecord,)}
Executing the first thread (POST) resulted an new record with a unique ID. (1257698108)
Executing the 2nd thread (GET) shows
GET http://server/.../.../.../.../1257698108
And returns the exact data generated in the first thread.
Thanks everyone for your help!

How can I use the value of prev HTTP Request to the next HTTP Request in jMeter?

I'm newbie in jMeter and I'm working with it.
I have one Thread Group which consists of two Loop Controllers.
In 1st Loop Controller, there's a HTTP Request which contains body data
{ ..., "var1": "var-${__RandomString(10,1234567890abcdefg)}", ... }
In 2nd Loop Controller, there's also another HTTP Request that contains var1, and I want to asssign this var1 with same value as the prev var1 in the 1st Loop Controller.
I have tried use User Defined Variables, but it generated same value for another Thread Groups, I want generate different value of var1 for each Thread Group.
Can anyone help me what should I do to make it works? Thank you :)
Add Post Processors --> Regular Expression Extractor to the Http Request which you want to fetch the variable named var1.
As the above picture is shown use "var1": "(.+?)", as Regular Expression. The (.+?) part defines that Hey! Regular Expression Extractor, please fetch for me whatever is between "var1": " and ",, which you'll find in the response content. So var-${__RandomString(10,1234567890abcdefg)} would be fetched into a variable named Var1 (Because you defined Var1 as the Reference name.
Then, in the Http Request where you want to access that variable, use ${Var1} in order to send the value of Var1 variable as a request parameter. Something like the picture below
Note that the last value in the loop will be saved in Var1. If you want to save all values in the first loop in order to use those in the second loop,There's many way to do that.
You can add a Counter from Config Element to the first loop Controller and define for example loopCounter as the reference name for it. Fill the start and increment fields with 0 and 1.
Then change the regular expression to Var${loopCounter}
In the next loop's Http Request you can access these variables with ${Var1}, ${Var2} and ...
Just change your __randomString() function to look like:
${__RandomString(10,1234567890abcdefg,var1)}
it will overwrite ${var1} with random generated value so you'll get the same random string in both loop controllers.
See How to Use JMeter Functions articles series for more information on the above and other functions.

JMeter: how to vary request inside Thread Group

I have to write load tests for web application using JMeter. The application has items available for booking, each item has a 'Book' button. If some user clicks this button for item, it becomes unavailable for other users. My question is:
Is it possible to make JMeter threads to book different items (to make different requests) and how to implement it?
You should be able to determine what parameter is being posted by different "Book" buttons and modify nested requests as needed. Test plan structure should be something like:
Open Booking Page - HTTP Request
Get all Booking IDs - Post Processor
Book - HTTP Request
Where "Post Processor" can be
Regular Expression Extractor
CSS/JQuery Extractor
XPath Extractor
In case of multiple matches Post Processor will return multiple variables like
BookindID_1=some value
BookindID_2=some other value
BookindID_3=some other value 2
....
BookindID_matchNr=10
There are at least 2 options on how to proceed with these values:
Iterate all the values using ForEach Controller
Stick to current virtual thread number via __threadNum function so thread #1 will take BookindID_1 variable, thread #2 - BookingID_2 variable value, etc.
It is also possible to take random value using __Random function but it may result in request failure if item is not available.
The correct way of 2 variables combination looks like:
${__V(VAR1${VAR2})}
So combining BookingID_N and __threadNum will look like
${__V(BookingID_${__threadNum})}
See How to use JMeter Functions post series for more on what can be done via functions.
yes, If every item has static(predefined) unique id,descriptor,identifier then that can be parameterized using a csv config file or random no. generator and selector
Random no generator and selector will work only for integers but csv config is better/standard practice. If you need more help please paste your test plan here with explaination of your need.

How to Get, Assign the Span Id value in JMeter Beanshell?

I have created a User Defined Variable with name as "Status" and a default value as "Started".
I got a HTML Response, with following content:
<SPAN id="ApplicationStatus"> Interrupted</SPAN>
I want to get the Span Id value and use in beanshell samplers to process further either in If Controller or Switch Controller.
I used Regular Expression extractor to extract the value needed and its working too.
But when i say vars.get("Status") will always return me the default value "Started".
Is there a way where i can extract the required value "Interrupted" and substitute that to the user defined variable "Status"?
Yes you can get that value of #ApplicationStatus into your User Defined Variable (UDV).
You can use regex but really you shouldn't for this type of parsing I'm not going to get into many reasons why.
Here is how you can do it using alternative (better solution IMHO) :
String html = "<SPAN id=\"ApplicationStatus\"> Interrupted</SPAN>";
Document doc = Jsoup.parse(html);
String value = doc.select("#ApplicationStatus").first().text();
//Put value in UDV Status
vars.put("Status", value);
You can add this to your sampler that does this kind of parsing i.e Beanshell sampler, here are the imports (which go above this code) :
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
Please note that this code is Jsoup dependent so you will need to download jsoup jar and put it in your $JMETER_HOME/lib directory.
Hope this sheds some light on your issue.
Update
If you want to avoid Java, I've written small jmeter post processor component that extracts text value from HTML element. Take a look at :
https://github.com/c0mrade/Html-Extractor
If you go over the steps how to install the post processor from the page above, you would use it as follows :
Right click on your sampler. Add a Post Processors -> Html Extractor , in the jquery selector field write #ApplicationStatus and store result in variable of your choice (Status). Following this add Debug Sampler, if in your Debug sampler there is variable Status with the value Html Extractor is working! you're done!
I can't reproduce your issue.
Here is my plan:
- User defined variables with variable Status
- Thread Group
- HTTP Request
- Regular expression extractor with reference name = Status
- Beanshell Sampler that logs Status variable
Beanshell sampler logs value that was received in Regular Expression Extractor

Resources