Is there any way to run two ThreadGroup consecutively in a loop for a certain amount of time? I am writing a test scenario in which I have to create a task for multiple users and then fulfill this task by them. Therefore, I decided to divide the scenario into two thread groups, because it needs one user to create a task and many users to complete it. Everything works fine, but the problem arises when I try to run the test in several iterations.
I tried to check Run Test Group consecutively check-box, but tests instead of performing alternately, e.g.
ThreadGroup 1
ThreadGroup 2
ThreadGroup 1
ThreadGroup 2
perform as follows
ThreadGroup 1
ThreadGroup 1
ThreadGroup 2
ThreadGroup 2
Is it possible to somehow make thread groups execute alternately? I would be very grateful for any advice.
If you want to run multiple iterations you need to let thread group 2 know that the task is ready and let thread group 1 know that the task is compete and it's ok to generate a new task.
There are 2 approaches of passing data between Thread Groups:
__setProperty() function to create/update a value in one Thread Group and __P() function to read the value in another Thread Group
Inter-Thread Communication Plugin, see SynchronizationExample.jmx for reference implementation
Related
I am trying to run a script with two thread groups each for multiple users. script looks like
Test Plan
Thread group 1 (10 users, ramp up period 5 sec and loop count 1)
Samplers
Thread group 2 (10 users, ramp up period 5 sec and loop count 1, thread startup delay 3 sec)
samplers.
both thread groups share some parameters. So I am using Inter thread communication plugin. My requirement is that for first user I want to run thread group1 and then run thread group2 . then start threadgroup1 for second user. Is this possible?
You cannot, an "user" belongs to Thread Group, they don't share any context.
User 1 of Thread Group 1 and user 2 of Thread Group 2 are different beasts.
Normally you should not be passing anything between thread groups, if you need - most probably the test is badly designed and you need to move Samplers under a single Thread Group.
If thread groups "share" some parameters - take a look at User Defined Variables
If thread groups "share" some test steps - take a look at Test Fragments and Module Controller
I have 4 thread groups in my test. I have requirement as below:
I want first 3 thread groups to work sequentially. Hence, I have checked the chekcbox "Run Thread groups consecutively". But, i want my fourth thread group to start 30 mins after the third thread group while the third thread group is still not complete. Can this be achieved on Jmeter. Any help on this is highly appreciated.
If you tick Run Thread groups consecutively box you won't be able to have more than 1 thread group running at any moment of time.
So you need to untick that box on test plan level and start all Thread Groups in parallel.
The fact that the thread group has started doesn't necessarily mean that it will start executing Samplers, you can delay the execution until the previous Thread Group is done.
For example you can use Inter-Thread Communication Plugin for this purpose, in 1st thread group and put something into a FIFO queue and then try to read the value using jp#gc - Inter-Thread Communication PreProcessor in the 2nd Thread Group (add it to the first sampler). The 2nd Thread Group will start executing samplers only when the value will be available in the queue.
See SynchronizationExample.jmx test plan for example implementation
The same approach should be applied for thread groups 3 and 4, when 3rd thread group starts - put something to the FIFO queue so 4th thread group would be aware that the 3rd one has started, then you can "sleep" for 30 minutes using Flow Control Action sampler
I want to introduce some delay between two thread groups.
My test plan is-
Thread Group 1 -
a. Thread 1
b. Thread 2
c. Thread 3 (loop controller is added as a parent to thread 3. Loop controller is designed to run Forever)
Thread Group 2
My plan is to start thread group 1 and then start thread group 2 after some delay. Once both thread group have started they should keep on running. I need to introduce a delay between thread group 1 and 2.
I have tried 2 methods below, but they did not serve my purpose.
I selected Run Thread Groups consecutively from test plan, and introduced a test Action Sampler at the end of thread group 1 with
Target: All Threads
Action: Pause
Duration: 5000
and added Synchronizing Timer as a child of the Test Action sampler and set Number of Simultaneous Users to Group by to the number of threads (virtual users) in the Thread Group 1.
Simply added a Constant Timer before start of Thread Group 2.
What is a good solution for this?
Your solution 1 is very good however you need to add a Test Action sampler to the very beginning of the Thread Group 2 as your current setup assumes it running in the end of Thread Group 1 like:
Thread Group 1
Wait 5 seconds
Thread Group 2
Adding a Constant Timer between thread groups is absolutely not something you want to do as given you have the constant timer at the same level as Thread Groups it means the delay will be applied to each and every sampler. You need to move the timer to be a child of the first request of Thread Group 2. Timer will execute before the request which seems to be something you're looking for. See Advanced Load Testing Part 3 - Top 4 Timers article to learn more about timers use cases and best practices
And finally probably the fastest and the easiest solution would be setting a Startup delay for 2nd Thread Group. It can be done under "Scheduler" section:
as per the documentation:
If the scheduler checkbox is selected, one can choose a relative startup delay. JMeter will use this to calculate the Start Time, and ignore the Start Time value.
I am have been exploring JMeter for the last couple of days. And I am try to achieve the following:
I am trying to create a load test for a service such that, in the first loop 'n' threads are created and in the second loop 'n+m' threads are created and in the third loop 'n+2m' threads, in the fourth 'n+3m' threads and so on. I did find many solutions here and I tried replicating them, but somehow it is not working for me. The test plan I created looks something like this:
Step 1: Add a user defined variable called USERCOUNT = 0
Step 2: Create a thread group. I have used __intSum to increment USERCOUNT by one and storing the result back in USERCOUNT for future reference.
Ideally what I am expecting here is, in the first loop one thread is created, in second loop 2 thread are created and in the third loop 3 threads are created. So in total there should be 6 thread created. However the results show up something like this:
Not sure if I am missing something silly or my approach itself is completely wrong. Any help from the community would be appreciated. :)
I believe what you are trying to do is impossible. When JMeter starts a thread group for the first time it initializes the number of threads.
What you are essentially trying to do is re-run the same test three times with different numbers of users each time. JMeter cannot re-run a thread group once started, it can only re-run ("loop") a thread in a thread group. It is not possible to add threads to a running thread group once the ramp up and threads are initialized. (Let me know if I should try to explain that further).
If you want one thread group to populate the run-time settings of another thread group, you must have two thread groups in the test plan. At the test plan level, check off the option "Run Thread Groups Sequentially."
With that option, JMeter will not initialize the number of threads on the second thread group until the first one finishes. The first thread group can set a global property, and the second thread group can reference it in the number of threads.
How to set a property in beanshell: (this would be in Thread Group 1)
props.put("threadgroup_2_num_users","15");
How to reference that value in Thread Group 2:
${__P(threadgroup_2_num_users)}
If this does not help, maybe try to describe your end goal. What are you trying to learn about the thing you are testing?
Edit: Perhaps using the plugin package "Stepping Thread Group" will allow you to achieve the scenario you are trying in a single thread group. Check this out:
http://jmeter-plugins.org/wiki/SteppingThreadGroup/
JMeter currently doesn't provide possibility to change number of threads on-the-fly during test execution so I would suggest to go with the following alternatives:
Use i.e. Ultimate Thread Group available via JMeter Plugins which adds some extra features to JMeter's Thread Group so you will be able to implement your scenario
Consider so called "goal oriented scenario" when load is based on requests per second rather than on number of virtual users. You can precisely set desired throughput rate and even change it during test run using Constant Throughput Timer
I have two thread groups:
setUp Thread Group - executed only once
Thread Group - executed for number of users defined in CSV file.
The first thread group prepares data once, which will be used by all users in the second thread group.
After finish of the second thread group, I want to repeat the whole process again. This seems not possible, since there is no Forever check box for the test plan itself? Using jmeter 2.9
This is not possible using this way.
You would need to find some hack to do the same thing.
It could be something like:
While controller that tests a stop condition And has 2 If Controller children
- if controller (tests if first thread and does the setup job, when done sets while controller condition to false
- if controller ( tests if other threads and if not wait 10s)
While controller that contains test code