To manullay calculate the total duration of jmeter testplan from the Logfile - jmeter

I want to manually calculate the Duration of jmeter testplan from the csv Logfile.I was following the calculation of last timestamp-first timestamp and it looks correct if am running for 1 thread group.For more than 1 threadgroup the samplers will be repeating and I think it should not be the right way to calculate the duration.I tried using transaction controller thinking that the corresponding timestamp will give me the duration of all contained samples but got confused when I saw multiple transaction controller entry in the Log file for more than one threadgroup. I am newcomer in the performance testing and in the jmeter.Any help will be appreciated.

JMeter provides variable which holds test start timestamp, it is ${TESTSTART.MS}
You could use tearDown Thread Group which is designed to run post-test actions. Under tearDown Thread Group you can use Beanshell Sampler to print test duration to jmeter.log file as follows:
long start = Long.parseLong(vars.get("TESTSTART.MS"));
long end = System.currentTimeMillis();
log.info("Test duration: " + (end - start) / 1000 + " seconds");
By the end of the test you should see something like:
2015/06/17 22:20:15 INFO - jmeter.util.BeanShellTestElement: Test duration: 300 seconds
See How to use BeanShell: JMeter's favorite built-in component guide for more Beanshell scripting tips and tricks.
If you have only result file, another option is open .jtl results file with Excel or Google Sheets or equivalent, sort timestamp column (usually the first one), subtract first cell/first row value from the first sell/last row value - this way you'll get test duration in milliseconds.

Related

How to log the current time in JMeter Webdriver sampler

I want log the current time to the JMeter log from the JMeter Webdriver sampler.
I am using the below code in the Webdriver sampler which is logging the time in milliseconds but the problem is my Webdriver sampler has a waiting time of 2 minutes. The getStartTime() and getEndTime() functions are considering the sampler waiting time also.
Is it any other way to get the current time from the Webdriver sampler? I want to measure the time taken between two actions in the browser.
WDS.log.info(WDS.sampleResult.getStartTime())
WDS.log.info('WDS.sampleResult.getEndTime())
You can record start and end time using Date.prototype.getTime() function like:
var before = new Date().getTime()
// here is the code which duration you would like to measure
var after = new Date().getTime()
WDS.log.info('Time taken = ' + (after - before) + ' ms')
Demo:
See The WebDriver Sampler: Your Top 10 Questions Answered for more WebDriver sampler tips and tricks
Exclude the wait time by covering only the required code block with the start time and end time function.
Ex:-
WDS.log.info(WDS.sampleResult.getStartTime())
---some code
WDS.log.info('WDS.sampleResult.getEndTime())
Wait for two minutes..wait(2)
WDS.log.info(WDS.sampleResult.getStartTime())
--some code
WDS.log.info('WDS.sampleResult.getEndTime())
In this way, wait time is excluded from the calculation.
This is not the best solution but one which I can think of.

Execute csv rows, one by one, on all threads

My Test plan has a csv dataset config element, a thread group with a http sampler.
I would like to read first element from csv, run it using 20 threads for 50 iterations, then repeat this sequential process for all the 30 rows of my csv.
I have set the toggle for stop on eof to true.
Most solutions,I have gone through on Stack Overflow, andother blogs, for a suitable solution, suggest adding a loop controller or a while loop, reading the rows using a preprocessor and looping, however, in these cases, I am not able to achieve my objective.
TestPlan
-- User Defined Variables
-- HTTP Request Defaults
-- HTTP Header Manager
-- JSR223 PreProcessor (To get the CSV line count)
-- CSV Data Set Config (Recycle on EOF - False, Stop on EOF - True)
-- Thread Group
-- HTTP Sampler (GET,pass each of the csv dataset element as part of path)
-- View Result Tree
With the above setup, I see that the whole csv is iterated, I inlcuded a loop controller, with loop count, moved the HTTP sampler, under it.
However, when I do this, I was unable to get the usage of Iterations in thread-group.
Article References:
Use same row per thread from a CSV data set in JMeter
How to read each and every row of csv by single user in JMeter?
How to loop each thread with unique data from CSV Data Config file
JMeter - multiple user taking unique row from CSV file
Your requirement is too "exotic", I would recommend creating a new CSV file out of your existing one with:
1st line repeated 100 times (20 threads x 50 iterations)
2nd line repeated 100 times
3rd line repeated 100 times
...
30th line repeated 100 times
If you have problems generating the file you can do this in the runtime, like:
Add setUp Thread Group with 1 thread and 1 loop to your test plan
Add JSR223 Sampler to the Thread Group
Put the following code into "Script" area:
SampleResult.setIgnore()
def generated = new File('/path/to/new/csv/file')
generated.delete()
new File('/path/to/old/csv/file').readLines().each { line ->
1.upto(100, {
generated << line << System.getProperty('line.separator')
})
}
In main Thread Group use CSV Data Set Config "normally", just point it to use the /path/to/new/csv/file
See The Groovy Templates Cheat Sheet for JMeter for more examples of useful Groovy code snippets which you can use to enhance your JMeter tests.

How to save start time of all the individual samples in my jmeter test and use that in JSR223 Listener

Im using influxfb to save the result of my jmeter test.
bellow is the part of code in JSR223 Listener where im in need of your help.
result = new StringBuilder();
result.append("Thro_5,")
.append("label=")
.append(escapeValue(sampleResult.getSampleLabel()))
result.append("count=")
count=sampleResult.getSampleCount();
result.append(count)
result.append(",duration=")
dur1=sampleResult.getStartTime();
result.append(sampleResult.getEndTime()-sampleResult.getStartTime())
*****here code to write data to influxdb*****
I'm trying this code in which i want to know the total duration sample has taken till now to calculate throughput.
a=sampleResult.getEndTime()-sampleResult.getStartTime()
.append(",throughput_=")
.append(totalSamplecount/(a/1000))
Last line in the above code , i.e sampleResult.getStartTime() ,it should be the starting time of a sample in the first loop.
If i have 3 samples in my test ,having loop count 3 ,i want to save the starting time of each sample in the first iteration and use that value in the calculation of throughput of each samples.
Then while i'm in 3rd loop i want to know the total duration it has taken so far from the first iteration.And totalsamplecount/duration
As far as i know sampleResult holds the result of current sample.
I'm stuck in 2 points:
in saving the start time of each samples and use it later for each iteration to calculate the duration.
In saving the total count of individual samples executed till now.

How to stop Jmeter test after specified number of threads failed

I have one Transaction controller which has one http request in my Jmeter test plan. Transaction name and url comes from CSV file. At the end total execution is divided into 5 different transactions.
Testplan:
Testplan
-Thread Group
- User defined variable
Total sample execution will be 8000-10000. Now what i want, if total sample failures reached to 100, my JMeter test should stop test execution.
I have added User defined variable name "thread" and with value "0". I have added below code in Beanshell Post-Processor
int count= Integer.parseInt(vars.get("thread"));
if (prev.getErrorCount()==1){
count++;
System.out.println(count);
vars.put("thread",Integer.toString(count));
}
if (count==100){
System.out.println("Reached to max number of errors in load test, stopping test");
log.info ("Reached to max number of errors in load test, stopping test");
prev.setStopTestNow(true);
}
Somehow code is not working as expected. When error count reach to 100, Jmeter test is not getting stopped. Test is stopped when error count reached to 130. I am not sure who to fix above code.
Can someone please let me know what is issue in above code?
Variables are specific to 1 thread while Properties are shared by all threads.
See:
https://jmeter.apache.org/api/org/apache/jmeter/util/JMeterUtils.html#getProperty(java.lang.String)
https://jmeter.apache.org/api/org/apache/jmeter/util/JMeterUtils.html#setProperty(java.lang.String,%20java.lang.String)
Ensure you synchronize access
Another option is to use a custom java class as a Singleton and increment its value.
Here an example implementation using Beanshell (Prefer JSR223 + Groovy for performances):
setupThreadGroup that resets the counter on test start:
BeanshellPostProcessor that updates counter:
Note that as you call setStopTestNow, test threads are interrupted but do not stop exactly at this time unless you have some timer (which is usually the case)
prev.setStopTestNow(true);

how to get the response time of web pages in jmeter?

How to generte csv file and load csv using response time graph listener?
Can any one help me in detail that how we find response time in jmeter ?
If you run JMeter in command-line non-GUI mode as follows:
jmeter -n -t /path/to/your/test_plan.jmx -l /path/to/results_file.jtl
your results_file.jtl content will look like:
1409124780902,182,Logon,200,OK,Thread Group 1-1,text,true,214,0
1409124781219,153,Logout,200,OK,Thread Group 1-1,text,true,110,0
where second column is page response time in milliseconds.
Other values are:
"1409124780902" - current time stamp in ms
"182" - page response time
"Logon" - sampler name
"200" - Response Code
"OK" - Response Message
"Thread Group 1-1" - Parent Thread Group name, thread number and iteration.
"text" - response data type
"214" - response data size in bytes
"0" - latency
Once your test run is done you can open JMeter GUI and load this results_file.jtl into the listener of your choice.
You might also be interested in JMeter Plugins Extras Set which is capable of generating nice looking and easy understandable response-time related graphs to wit:
Response Times vs Threads
Response Times Distribution
Response Times Percentiles
You can get it by adding Reporters.
Please keep in mind Reporters is cpu and memory intensive components and thus should not be used while actual load test.
But for sample testing you can use it and for load test run you can get response time, average,throughput etc by saving output to jtl file in JMeter.
For normal/sample run
Aggregate report gives Average response time, min, max, median etc.
Summary report also gives the same with less details,
While performing actual run you can save output of these reporters in a jtl file. After the test results can be analyzed from jtl files.

Resources