I have question on jmeter
we have different types of order lines like (3 ,5, 15) orders.
i need to create a script for different order lines.
please find the my approach in loadrunner, how can we do the same in jmeter
In loadrunner--> I have created different action with switch case
Action name :
OrderLine(trans, int orderline)
{
switch case
case 3:
requests for 3 order lines
case 5:
requests for 5 order lines
case 15:
requests for 15 order lines; break;
}
in another action, i will call OrderLine transaction
Action_03Lines()
{
Orderlines(OrderLines_03,3);
Orderlines(OrderLines_03,3);
Orderlines(OrderLines_03,3);
}
Action_05Lines()
{
Orderlines(OrderLines_05,5);
Orderlines(OrderLines_05,5);
Orderlines(OrderLines_05,5);
Orderlines(OrderLines_05,5);
Orderlines(OrderLines_05,5);
}
and i will call the actions on %ile bases.. like Action_03lines will run for 90% and Action_05 & Action_15 will execute with 5% each.
Use Switch_Controller as parent of each request with relevant number in switch value
Switch Value
The number (or name) of the subordinate element to be invoked.
In JMeter you have:
Test Fragment - to hold the reusable code
Module Controller - to refer the reusable code blocks where required
Loop Controller or While Controller - to iterate the block of code for desired number of times or while certain condition is (not) met
Related
Based on this thread - Jmeter - how to return multiple ID(s) based on the array (match JSON path with array)
I managed to get ID's, for every single member of the array.
Now I need to alternate the code and to have a variable for every single ID.
What i tried is:
vars.get('array').replace("[", "").replace("]", "").split(", ").each { country ->
def result = new groovy.json.JsonSlurper().parse(prev.getResponseData()).payload.find { entry -> entry.name == country.trim() }
vars.put("tim" + ${__counter(,)}, result.id as String);
}
But, I am only able to get a single variable.
What should I do in order to save every single result.id, into variables like:
tim1, tim2, tim3...
Don't inline JMeter Functions or Variables into Groovy scripts.
As per JMeter Documentation:
The JSR223 test elements have a feature (compilation) that can significantly increase performance. To benefit from this feature:
Use Script files instead of inlining them. This will make JMeter compile them if this feature is available on ScriptEngine and cache them.
Or Use Script Text and check Cache compiled script if available property.
When using this feature, ensure your script code does not use JMeter variables or JMeter function calls directly in script code as caching would only cache first replacement. Instead use script parameters.
So I would rather recommend amending your code as follows:
vars.get('array').replace("[", "").replace("]", "").split(", ").eachWithIndex { country, index ->
def result = new groovy.json.JsonSlurper().parse(prev.getResponseData()).payload.find { entry -> entry.name == country.trim() }
if (result != null) {
vars.put("tim" + (index + 1), result.id as String);
}
}
Demo:
More information: Apache Groovy - Why and How You Should Use It
Below is the code which i have been trying to address the below UseCase in JMETER.Quick help is appreciated.
Usecase:
A particular text like "History" in a page response needs to be validated and the if the text counts is more than 50 a random selection of the options within the page needs to be made.And if the text counts is less than 50 1st option needs to be selected.
I am new to Jmeter and trying to solve this usingJSR223 POST processor but somehow stuck at vars.put function where i am unable to see the desired number being populated within the V paramter.
Using a boundary extractor where match no 1 should suffice the 1st selection and 0 should suffice the random selection.
def TotalInstanceAvailable = vars.get("sCount_matchNr").toInteger()
log.info("Total Instance Available = ${TotalInstanceAvailable}");
def boundary_analyzer =50;
def DesiredNumber,V
if (TotalInstanceAvailable < boundary_analyzer)
{
log.info("I am inside the loop")
DesiredNumber = 0;
log.info("DesiredNumber= ${DesiredNumber}");
vars.put("V", DesiredNumber)
log.info("v= ${V}");
}
else{
DesiredNumber=1;
log.info("DesiredNumber=${DesiredNumber}");
vars.put("V", "DesiredNumber")
log.info("v= ${V}");
}
def sCount = vars.get("sCount")
log.info("Text matching number is ${sCount_matchNr}")
You cannot store an integer in JMeter Variables using vars.put() function, you either need to cast it to String first, to wit change this line:
vars.put("V", DesiredNumber)
to this one
vars.put("V", DesiredNumber as String)
alternatively you can use vars.putObject() function which can store literally everything however you will be able to use the value only in JSR223 Elements by calling vars.getObject()
Whenever you face a problem with your JMeter script get used to look at jmeter.log file or toggle Log Viewer window - in absolute majority of cases you will find the root cause of your problem in the log file:
How to ensure/handle duplicate values are not getting captured while using regular expression?
In my scenario i need to capture multiple offers from my response. But cant use the same offers again and again within the transaction
There are multiple ways to do this. If you are using the default Regular Expression Extractor, the problem is it creates the variables (eg: offer_1, offer_2 etc), ready to go with the execution. It would've been easier if it returned a ArrayList of some sort where we can remove the duplicates. What I am about to suggest is to add those variables to a list in a JSR223(groovy) sampler/post processor then convert them back to usual jmeter variables to use in the usual jmeter script flow.
Snippet:
I created a sample script as per your description which would return multiple offers with some duplicates. Following is the state of jmeter variables before post processing.
offer_1=RUSSIA
offer_1_g=1
offer_1_g0=offer="RUSSIA"
offer_1_g1=RUSSIA
offer_2=UK
offer_2_g=1
offer_2_g0=offer="UK"
offer_2_g1=UK
offer_3=ICELAND
offer_3_g=1
offer_3_g0=offer="ICELAND"
offer_3_g1=ICELAND
offer_4=USA
offer_4_g=1
offer_4_g0=offer="USA"
offer_4_g1=USA
offer_5=UK
offer_5_g=1
offer_5_g0=offer="UK"
offer_5_g1=UK
offer_6=USA
offer_6_g=1
offer_6_g0=offer="USA"
offer_6_g1=USA
offer_7=USA
offer_7_g=1
offer_7_g0=offer="USA"
offer_7_g1=USA
offer_matchNr=7
As you can see above there are duplicates in the variables. Put the following Groovy code in a JSR223 post processor with groovy as language selected.
// Count of offers extracted by Regular Expression Extractor
def count = Integer.parseInt(vars.get("offer_matchNr"))
// An empty list which will store the offers
def offer_list = []
for (int i = 1; i <= count; i++){
def offer = vars.get("offer_" + i)
offer_list.add(offer)
}
// Removes the duplicates in the list
offer_list.unique()
// Following one liner adds new variables but with only unique offers in similar format as jmeter variable.
offer_list.eachWithIndex{ it, index -> vars.put("unique_offer_${index+1}", "${it}")}
After post processing:
unique_offer_1=RUSSIA
unique_offer_2=UK
unique_offer_3=ICELAND
unique_offer_4=USA
I'm facing a situation where I need to build a request string dynamically before sending it in an HTTP sampler. I'm choosing a random number between 15 and 50, and then for that many times, I append an XML tag with a parameter. So if my random number is 22, the this appended string (I call it ricString) will contain the same xml tag 22 times! And all I want is for it to use 22 different parameter values from the CSV file. But it doesn't do that. It takes the same value 22 times, and then uses the next value in the next iteration. Here is what I have written in my beanshell pre-processor.
counter = ${__Random(15,50)};
i = 0;
String ricString;
while(i<counter)
{
i++;
ricString = ricString + "<req:RCS>${__StringFromFile(...\RIC_3_01_Flag.csv)}</req:RCS>";
}
I have tried using both __StringFromFile as well as __CSVRead(filename, next) functions but no luck. It just does not update the value when inside the while-loop. Anyone know what I'm doing wrong?
Use a CSV DataSet that you nest into your loop (this is very important).
Then just use that variable that your CSV DataSet defines in your XML.
How I can user variables in switch controller. I need this kind of logic:
ThreadGroup contains: counter (start with 1000 and ends with 1020, referense name = record_id), httpRequest(use record_id as a parameter), switch controller (switch value = ${record_id}) and inside switch controller I have size assertion named 1000. But this size assertion is't working. How I can make switch controller working with diffrent cases like 1000, 1001 etc (record_id(counter)).
The switch controller must contain samplers or controllers named 1000, 1001, etc. An assertion is not switchable so no point naming it 1000, you need to name the sample that the assertion applies to.