JMeter : How to run Multiple Samplers under a single Thread group for multiple concurrent users? - jmeter

I am new to JMeter and trying to learn JMeter by doing performance testing for one of the application in my organization.
I am facing the blow issue with the concurrent execution of a single thread for multiple users.
Base URL: http://xyz.abc.com/app/
Complete URL : http://xyz.abc.com/app/{RandomSesionID}/Account/Login
I've create a Thread with HTTP Requests as show below.
Thread Group
Hit Base URL
It Loads Login URL
Post Credentials and Click Login
Navigate to Landing Page(baseURL/{RandomSessionID}/Main/Home)
Click Logout(It will navigate to BaseURL/{RandomSessionID}/Main/Home)
When I let the thread count to its default value 1, Everything is working fine. However , The moment I set it to more than 1 (with ramp up time to 10sec), below thing happening.
User 2--->
Hit Base URL
Get The Login URL
Post The Credential
It again goes back to Request 2 (Get The Login URL)
and all the steps of the user are getting redirected to the second request irrespective of what I am requesting.
I tried organizing everything into Simple Controllers to see if the sequence will remain for all users but no avail, I am still running into the same issue.
please help me to understand what is going wrong here and how I can resolve these errors to test the application with more concurrency.
EDIT 1
I did a further investigation on this issue from my end and here are the observations I had.
Case 1: When I create two separate JMeter instances and run the same test parallel with different users, The Thread completely successfully without any errors.
Case 2: Wile Running the Thread with 2 users as mentioned above, The second HTTP request for BaseURL:/Home/Main redirecting the request to /Account/Main instead of going to the next step as shown below.
Image 1 :All The HTTPRequests In Order
Image 2 : This Is the Navigation Request For User 1
Image 3 :User 2 Hitting /Home/Main and Getting Redirected To /Account/Login As Response
Image 4 : User 2 Hitting /Home/Main and Got /Home/Main response
Image 5: User 2 Hitting The /Home/Main and Getting Redirected in Response
As you can see in Image 1, Those are the series of requests which I am making through the thread group and these requests are the same for all the users in the thread.
In Image 2, You can see /Home/Main is a Single GET request with a valid /Home/Main response without any issues.
However, In the Subsequent Images 3-5, You could see that the GET /Home/Main-134 making sub-request and 134-0 and 134-1 with 134-0 to GET /Home/Main and 134-1 to GET /Account/Login.
My Observation: I doubt that JMeter is using a single tab/ instance of the browser and hitting those web requests in the same tab where the first request was initiated. Due to which for the second user, it is always redirecting to the Login Page even though the session ID is valid.
To Confirm whether what I observed is correct, I tried replicating the same scenario in the Chrome Browser as mentoined below.
1. Open Chrome broswer and Access the Base URL.
2. Login and Navigate to Home/Main
3. Now In the same Tab, Type BaseURL and It redirected me to the Login page.
4. Now Enter Credentials of User 2 and login and nvaigate to Home/Main.
5. Now I Try accessing the firt User URL by going back by 3-4 tabs.
However, This won't replicate the exact steps as we are using the browser normally whereas in the requests, we are directly hitting the urls with the GET/POST requests.
I am in a fix and unable to understand what I should do to get through this issue.I am not even sure whether it is the issue with the Application or issue with the Jmeter.
Are there any setting in JMeter which will make sure each Thread (user) of the Thread group gets the option to have a dedicated request instead of using the single instance of the browser internally ?

My expectation is that your It again going back to Request 2 statement is wrong.
Each JMeter thread (virtual user) executes Samplers upside down (or according to Logic Controllers)
So most probably your Get The Login URL is being executed by the second user and given the label of the request is the same you cannot distinguish which user is executing which sampler.
You can add i.e. __threadNum() function as the postfix for the request label like:
Hit Base URL user: ${__threadNum}
this way you will get the information regarding which virtual user is executing which request at each moment of time:
Check out Apache JMeter Functions - An Introduction article to learn more about JMeter Functions concept

Related

JMeter web page test - Your session expired because of inactivity

There will be two actions once we click on log in button
login page action
dashboard action
Part of JMeter
login page action got success.in the continuation
dash board action got failed saying
"text":"Your session expired.","explanation":"Your session expired because of inactivity."
Can anyone help me please..
Your SUT is likely to have some form of verification mechanism which checks user session by verifying parameter(s).
Well-behaved test should do exactly what real browser does, to wit:
Open login page
Perform login
Open dashboard
and your job is to ensure that requests which are being triggered by JMeter are 100% match to the requests which are being sent by the real browser.
Try adding HTTP Cookie Manager to your Test Plan, if your SUT checks the cookie - that should be enough. If not - most probably you will need to perform correlation - the process of extracting dynamic parameters from previous response using JMeter Post-Processors, saving them into JMeter Variables and replacing hard-coded (recorded) values with these variables.

Running Jmeter for Https app with single user for multiple times through Loop controller

Attached is the snapI am trying to run jmeter for single user with value of 10 in loop controller , I first login into the app and then subsequently uses the CSRF token accordingly for future request .The login is always successful and generates CSRF token, But when i try to use CSRF token for future request , I get unauthorized HTTP 401 reponse code , when running with value 10 in loop controller for single user , the same works when i try to run single user with value 1 in loop controller , Any idea how to fix this? (Note :- All this is present in same thread Group)
Well-behaved JMeter test should be able to loop single user without any problem, most likely you have a problem with your test design or mismatch with the application under test behaviour. General recommendation would look like:
First of all switch to iterations on Thread Group level, JMeter configuration elements don't respect iterations originated from elsewhere as "iterations"
Add Debug Sampler and View Results Tree listener to your Test Plan
Run your test with 1 user and 2 loops
Inspect request and response details, identify missing/extra/different parameters and fix them. See How to Debug your Apache JMeter Script for more details on JMeter test troubleshooting techniques.
Blind shot: your test includes login request and the virtual user is already logged in therefore it doesn't require login on 2nd loop. In this case you have 2 options:
Put the logic which needs to be executed only 1 time under Once Only Controller
If you use HTTP Cookie Manager be aware that Clear cookies each iteration works only on Thread Group-level iterations

Automated script logs out using JMeter

I am trying to automate testing of a web application.
I have recorded the test using JMeter proxy template (JMeter version is 3.2) and couple of times when I ran the test in the JMeter it ran properly but after sometime only some part runs properly.
Following are the steps I am doing:
Hitting the URL
Logging into the application
changing some feature in the application
and so on.
All the steps ran perfectly first few times but then after that only till login everything runs properly.
Just to be sure I tried passing the jsessionid from the first request to the next requests using the Regular "Expression Extractor". I can see in the View Results Tree that jsessionid is passed properly but next page after the step two still takes me into the login screen.
Any help will be very much appreciated.
I have attached screenshot for better understanding:
The response header of logged in page includes a sessionid which is used by another request while logging in.
All the sessionID are properly maintained still after logging in the next page takes me to the login page instead displaying what was done next in the recording.
When it comes to load testing of JSF-based web applications you need to take care at least of the following dynamic parameters:
JSESSIONID
javax.faces.Viewstate
JSESSIONID is a normal HTTP cookie so it is quite enough to add a HTTP Cookie Manager to deal with it
javax.faces.Viewstate is client state management mechanism which also acts as a security token to verify user's origin. So you will need to properly correlate it, i.e. extract from previous response using one of JMeter PostProcessors, store into a JMeter Variable and add as a parameter to the next request. Remember to do this for each and every request.
There might be more application specific dynamic parameters, the easiest way of detecting them is recording the same request (or scenario) 2 times, compare the recorded scripts, detect and work around the differences.

Concurrent thread group execution on same application is failing few sampler in jmeter

I am rookie to Jmeter.
I have been asked to run multiple thread groups where there is a single Testplan.
All these Thread groups perform different scenarios on same application.
but running them concurrently is failing few samplers, on the other hand if i run them sequentially then everything works well.
so can anyone guide me on this as what can be done.
Details:
there are 3 samplers.
1. Login with post form
2. Get case status page
3. Logout
Unique key generated from Login page response is RANDOM_TOKEN_KEY which I am capturing and passing it to "Get case status page".
JsessionID is getting generated uniquely for individual steps hence i have skip that one.
From case status page I am directly clicking on Logout page which is working fine.
Issue: when this test is triggered for more than 1 threads, example 10 at same time. then Login is working fine but "Get case status page" sample is throwing error as "Your current session has expired. Please log in again."
Script failed when run concurrently with same user credentials
You should check the checkbox "Delay Thread creation until needed" in Thread Group.
This way threads will work without interrupting the flow.

Jmeter- Unable to understand result for the workflow

My website workflow is as follows:
User Name-->Password-->Click on login button-->Click on Report menu(Daily Transaction)--->Select date and device in report-->Click on Generate button.
Now I want to check load testing for this scenario that if multiple users gets logged in and access the reports, how my website will act?
I have created csv file for multiple user login with report data. But not able to understand the output coming. It is displaying Login request twice i.e. Login request and under daily report request it is again displaying login request. I have created Login request and report request separately.
In result I am not getting why it is displaying login request again under daily report request.
I believe that it is due to 1st login request failure as daily report request is not available for non-authenticated user. I would recommend taking the following steps to resolve your issue:
Add a HTTP Cookie Manager to your Test Plan. It will automatically care about handling cookies and hopefully will be enough to let you to proceed.
If not - record your login request several times and inspect recorded requests to see if there are any differences. If they are - you'll need to provide some mandatory dynamic parameter along with credentials. In that case test Scenario skeleton will look as follows:
GET request to Login Page
Extract dynamic parameter value
POST request to Login Page providing username, password and dynamic parameter name/value pair
See ASP.NET Login Testing with JMeter guide for more details on dynamic parameters extraction and usage bits, even if your application is not ASP.NET based it should still give you a clue on what needs to be done.
If you are using Transaction Controllers this can yield misleading results like you are seeing.
For example, take the following:
Transaction Controller - Name "Login"
HTTP Sample - Name "Login"
If "Generate Parent Sample" is selected on the transaction controller, you will only see the Transaction Controller in your results. If this option is not selected, you will see both the HTTP Sample AND the Transaction Controller in the result set.
Also, please note that the "Parent Sample" time is recorded as the TOTAL time taken to do all requests in the transaction end to end!! In almost all cases this reports inaccurate times because a real web environment has asynchronous calls.
For this reason it is strongly encouraged to avoid transaction controllers. In one case you report end-to-end time for all samples which is incorrect, and the other alternative is to report the transaction controller AND the sub-samples, which in turn makes your test report the incorrect rate of transactions.

Resources