Does JMeter support to select a sampler in Thread Group randomly? - random

In my Test Plan, I have Thread Group with 5 Samplers. Is there a way with JMeter that I want to select one among the 5 samplers in Thread Group Randomly and do performance testing to only that particular sampler ?

Add User Defined Variables to your Test Plan and create i.e. randomSampler variable with the value of ${__Random(0,4,)} (use __Random() function to generate a random number between 0 and 4 inclusively)
Add Switch Controller to your Thread Group and use ${randomSampler} as the "Switch Value"
Put your Samplers under the Switch Controller
That's it, each time you run the test the random Sampler will be chosen and executed:

Related

How to stop a thread group execution if the request from previous thread group fails in JMETER test plan?

In a JMeter test plan, I have 4 thread groups which will be executed consecutively, however there is a dependency of certain variables from one thread group to another and hence, in case of any sampler failure in previous thread group, the execution of subsequent thread groups should stop.
Test Plan:
Each thread group is a simple thread group [not setUp or tearDown thread group]
How to control or decide the thread groups execution flow/order in JMeter?
The fastest and the easiest way is to stop the test when an error occurs on Thread Group level
If you want more flexibility you can check whether this HTTP Request B2 was successful or not by using ${JMeterThread.last_sample_ok} pre-defined variable in the If Controller, then you can add Flow Control Action as a child of this If Controller and decide what do you want to do there.
This is pretty much similar to point 2, if your Thread Groups C and D rely on a variable from the Thread Group B you can put all the Samplers under the If Controller
You can set number of threads in Thread Groups C and D using __P() function like ${__P(threads,)} and in case of value you can use __setProperty() function to set this threads property to 0 - thread groups with 0 threads are not being "started"
You need to pass the status (flag) from the previous thread group(s) to the subsequent thread groups. Status should be evaluated before executing the requests in the subsequent thread groups.
You can pass the values between the thread groups with JMeter properties.
Use props.put('canContinue',true) from the JSR223 element with the status
or
Set the property through JMeter function ${__P(canContinue,true)}
In the subsequent thread groups you can check the status with a If controller
${__groovy(!props.get("canContinue"),)}
Add a Flow Control Action sampler to the If Controller and set what you want to do.

How i can be sure that JMeter is not using the same sample more than one time at same time?

I'm using JMeter to test my applications, and I desire to use the same sample N times.
For example, lets say I have 100 different samples how I'll use to test my Login, and want to use these samples 10 times.
I'm using 100 threads, and 10 loops for that.
How I can be sure that the second loop using a sample will start just after that the first loop of that sample has finished (and not have the same sample running simultanious)?
I'm having some troubles to understand how JMeter lead to this scenario.
JMeter acts as follows:
Each thread (virtual users) executes Samplers upside down (or according to the Logic Controllers)
When there are no more Samplers to execute:
-if there is > 1 loop in the Thread Group - the thread starts executing Samplers once again
if there are no more loops to iterate - the thread is being shut down
You can track which thread is executing which sampler by adding __threadNum() function to the sampler name. The Thread Group iteration can be tracked by adding the special JMeter Variable ${__jm__Thread Group__idx}
If you don't want user 1 and user 2 to execute sampler1 at the same time - put this sampler under the Critical Section Controller, but in this case you will not have any concurrency.

How do I store extracted RegEx in Jmeter and use it in next samplers

I'm trying to measure response throughput against concurrency for each of the REST APIs that are added into each sampler in a thread group. The Thread Group in my test plan is as follows
Thread Group
1st Sampler > HTTP POST /path to REST API/ > result > generates unique ID1 -> RegEx: ${uniqueId1}
1.1. Test Action with 10 seconds pause because POST could take some time to generate unique ID1
2nd sampler > HTTP GET /path to REST API/${uniqueId1} > result > generates unique ID2 -> RegEx: ${uniqueId2}
3rd sampler > HTTP GET /path to REST API/${uniqueId1}/${uniqueId2} > result > generates unique ID3 -> RegEx: ${uniqueId3}
4th sampler > HTTP GET /path to REST API/${uniqueId1}/${uniqueId2}/${uniqueId3}/data > result
As you see since each sampler is dependent on each other I have to add them into one Thread group and functional validation works fine without any issues.
But I need to measure response throughput for each of the REST APIs in each sampler. That means I need to run concurrent threads like 100 to 100K+ to measure throttling limit for each API response.
If I run the above thread group as it is with 10 threads and 5 loop count, each sampler is being waiting until down stream sampler is completed and hence throughput calculation varies because 10 threads are repeating 5 times based on 5 loop count.
So I'm trying to find a way to complete all the POSTs first whether threads count is 10 only or thread count is 10 with 5 loop count and collect all the ${uniqueId1} and pass it to all GET samplers so that POST sampler does not have to wait to complete remaining samplers.
Similarly ${uniqueId2} and ${uniqueId3} should follow the same process.
So is there any way to achieve this in Jmeter? An immediate answer would be much appreciated!
Thanks in advance
You don't need the Test Action sampler as JMeter waits for previous sampler completion prior to starting next one.
If you want to run requests in parallel the most straightforward solution will be creating as many IDs as needed in setUp Thread Group and then run 4 normal Thread Groups representing your scenarios in parallel.
You can use JMeter Properties to pass the uniqueIDs values between Thread Groups, to wit:
__setProperty() function to define uniqueID value in the setUp Thread Group
__P() function in other Thread Groups to read the value
See Knit One Pearl Two: How to Use Variables in Different Thread Groups article for example of sharing data between different Thread Groups

How to run all loops for the first sample and then switch to the following samples in Jmeter

I have a Jmeter project that contains 3 samples and one counter that is used by all three samples.
The test structure is next:
-Test Plan
--Thread Group
----Counter
----Listener
----Enrollment HTTP sample (SOAP request)
----Configuration HTTP sample (SOAP request)
----Start Cycle HTTP sample (SOAP request)
The test has a value when I run all threads and loops for the first sample, then for the second and then for the third sample.
Other words, I have to Enroll an Individual, Configure cycle and Start cycle. The counter value should be the same for all three samples.
The question is how can I configure the test so Jmeter will execute all threads and loops for the first sample, then for the second and for the third sample separately?
I need it into the one Jmeter project because I plan to include this test into CI process.
You can break down your samples to different thread groups as follows:
Thread Group 1
Counter
Enrollment
Thread Group 2
Counter
Configuration
Thread Group 3
Counter
Start cycle
And check Run Thread Groups Consecutively box on Test Plan level. In this case thread groups will be executed one by one.
I would also recommend to take a look into __threadNum function which returns the number of current thread, i.e. 1 for the first thread, 2 for the second, and so on. Perhaps you could switch from counter to __threadNum function. Also there is a __counter function which is being incremented by 1 each time it's called. You may wish to check out How to Use JMeter Functions post series to see how you can achieve additional flexibility.

How to configure jmeter to run sampler tests through percentage of threads not all of them

I would like to run multiple samplers with different frequencies. For example in a test plan I have two samplers A and B and I want to 80% of threads run sampler A and 20% of threads run sampler B. How can I configure this situation instead of running all thread on all samplers?
The quick and dirty way would be to use an Interleave Controller and add Sampler A 4 times and Sampler B 1 time. But, that is very, very dirty.
A better way would be to use the Switch Controller. Then you can execute Sampler A or B depending on a variable you can set and change on a test and thread basis. (Initialise per test and change per thread.)
The variable you need can be found under the Config Elements and is named Counter.

Resources