how to pass specific arguments in batch commands during jenkins builds - windows

I'm trying to use Jenkins to automate performance testing with JMeter,
each build is a single JMeter test and I want to increase the number of users(threads) for each Jenkins build if the previous was successful.
I have configured most of the build, with SSH plugin I can restart Tomcat, copy catalina.out, with publishing performance I can open the .jtl file and determine if the build was successful.
What I want is to execute a different batch command for the next build(to increase the number of users(threads) and user id's)
For example:
jmeter -Jthreads=10 -n -t C:\TestScripts\script.jmx -l C:\TestScripts\Jenkins.jtl
jmeter -Jthreads=20 -n -t C:\TestScripts\script.jmx -l C:\TestScripts\Jenkins.jtl
jmeter -Jthreads=30 -n -t C:\TestScripts\script.jmx -l C:\TestScripts\Jenkins.jtl...
Is there some good jmeter plugin some counter that i can use to increase some variable by 10 each time:
jmeter -Jthreads=%variable1%...
I have tried by setting environmental variables and then incrementing that variable by:
"SET /A thread+=10"
but it doesn't change that variable because jenkins opens its own CMD, a new process :
("cmd /c call C:\WINDOWS\TEMP\jenkins556482303577128680.bat")

Use the following SET command to increase threads variable by 10:
SET /A threads=threads+10
Or inside double quotes:
SET /A "threads+=10"

Not knowing your Jenkins configuration, and which plugins you have installed and how do you run the test it is quite hard to come up with the best solution.
The only "universal" workaround I can think of is writing the current number of threads into a file in Jenkins workspace and reading the value of threads from the file on next execution.
Add setUp Thread Group to your Test Plan
Add JSR223 Sampler to your Thread Group
Put the following Groovy code into "Script" area:
import org.apache.jmeter.threads.ThreadGroup
import org.apache.jorphan.collections.SearchByClass
import org.apache.commons.io.FileUtils
SampleResult.setIgnore()
def file = new File(System.getenv('WORKSPACE') + System.getProperty('file.separator') + 'threads.number')
if (file.exists()) {
def newThreadNum = (FileUtils.readFileToString(file, 'UTF-8') as int) + 10
FileUtils.writeStringToFile(file, newThreadNum as String)
def engine = ctx.getEngine()
def test = org.apache.commons.lang.reflect.FieldUtils.getField(engine.getClass(), 'test', true)
def testPlanTree = test.get(engine)
SearchByClass<ThreadGroup> threadGroupSearch = new SearchByClass<>(ThreadGroup.class)
testPlanTree.traverse(threadGroupSearch)
def threadGroups = threadGroupSearch.getSearchResults()
threadGroups.each {
it.setNumThreads(newThreadNum)
}
} else {
FileUtils.writeStringToFile(file, props.get('threads'))
}
The code will write down the current number of threads in all Thread Groups into a file called threads.number in Jenkins Workspace and on subsequent runs it reads the value from it, adds 10 and writes it back.

For now i am creating 20 .jmx files (1.jmx, 2.jmx , 3.jmx ...) each whith a different number of users. and calling them whit this command :
jmeter -n -t C:\TestScripts\%BUILD_NUMBER%.jmx -l C:\TestScripts\%BUILD_NUMBER%.jtl
the first billd will call 1.jmx the second 2.jmx ...
it isn't the best method but it works for now. I will try your advice over the weekend when i have more time.

i have found the a solution that works for me, it inst pretty. I created a python script which changes a .CVS fil from which JMeter reads the number of threads and the starting user id. This python script incremets the starting user id by the number of threads in the previous bild and the number of threads by 10
file = open('C:\\Users\\mp\\AppData\\Local\\Programs\\Python\\Python37-32\\eggs.csv', 'r')
a,b=file.readlines()[0].split(",")
print(a,b)
b=int(b)
a=int(a)
b=a+b
a=a+10
print(a,b)
f = open("C:\\Users\\mp\\AppData\\Local\\Programs\\Python\\Python37-32\\eggs2.csv", "a")
f.write(str(a)+","+str(b))
f.close()
I have python on my pc and a i am calling the script in Jenkins as a windows Bach command
C:\Users\mp\AppData\Local\Programs\Python\Python37-32\python.exe C:\Users\mp\AppData\Local\Programs\Python\Python37-32\rename_write_file.py
I am much better in python than Java so I implemented this in Python.
So for each new test,the CSV file from which jmeter reads values is changed.

Related

JMeter - Summary Report not displaying correctly

I am new to JMeter so bear with me...
I have a setUp Thread Group where I am grabbing a token and then re-using that in the HTTP Header Manager within the main Thread Group. Within that Thread Group I have the following parameters set...
I run this command to execute the tests:
jmeter -n -t PSC_Token.jmx -l testPsc.jtl -f
When I open the testPsc.jtl file though in Summary Report, I would expect that each request would show 600 for # Samples (200 threads * 3 loop count) but it is showing 1200 for each.
I tried deleting the file entirely and re-running it, just in case it was appending or something strange. That doesn't resolve the issue though.
Any ideas?
You're writing the same data into the same file 2 times, the options are in:
Disable (or better delete) the Summary Report listener, in general Listeners don't add any value, they only consume resources
Or remove -l command line argument and run your test just like:
jmeter -n -t PSC_Token.jmx
Also be aware that according to JMeter Best Practices you should always be using the latest version of JMeter so consider upgrading to JMeter 5.5 (or whatever is the latest stable version available at JMeter Downloads page)

jmeter running more tests than in CSV list

I'm setup a jmeter test where I've added a CSV Data set Config with a list of IDs that I want the test to go through. The csv file has 10,000 IDs but when its running, it seems to run more than 10,000 tests.
I've set some of these setting as well:
Thread Group
Number of threads: 10
Ramp-up period: 1
Loop count: 1
CSV Data Set Config
Recycle on EOF: False
Stop thread of EOF: False
Sharing Mode: All threads
I then run the test via the cli like this:
./jmeter.sh -f -n -t /home/user/rtf-load-csv-list.jmx -l /home/user/logtest/test.log -e -o /home/userhtml/
when I do a wc -l /home/user/logtest/test.log, I see more than the 10,000 requests but there are only 10,000 IDs in the csv file.
why doesn't it stop after the initial 10,000?
You need to set Stop thread of EOF to True otherwise when all 10000 values will be used JMeter will continue sending the requests with default placeholder of <EOF>
More information: Using CSV DATA SET CONFIG

How to set -JlopCount = <Forever> in Jmeter non-GUI mode?

Goal is to set the following and run a test plan with a "Thread Group" and "CSV Data Set Config" with 1000 lines/user accounts. So in 20 mins i want 10 threads to go through my 1000 line long csv file.
I set these settings in GUI mode and it does what i want:
Thread Group .
num of threads - 10 .
LoopCount=Forever .
scheduler=on .
duration=7200 .
"CSV Data Set Config"
Recycle on EOF? - False
Stop thread of EOF? - False
Sharing mode=All Threads
The problem is that i can't reproduce these setting from non_gui mode. I run it as follows and it only goes through # of csv lines equaling the # of threads set. So if i set 20 threads it will go through 20 lines of a file and exit.
-Jseconds=1200
-JthreadCount=20
-JcsvFile=../../user_files/j2kUsers.csv
-JloopCount=???
Use -1 as the property value, Thread Group has a Loop Controller under the hood and as per documentation:
The value -1 is equivalent to checking the Forever toggle.
You can also put the values to user.properties file like:
seconds=1200
threadCound=20
etc.
to avoid entering the values each time you run the script, the values van be overriden via -J command line argument at any time.
More information: Apache JMeter Properties Customization Guide

How can I test 50 threads and 60 threads ,for slave 1 and slave 2 respectively from jmeter non gui command?

Scenario :
I have 2 slave machines configured , I want to send 50 users for slave 1, 60 users for slave 2 . I am using non GUI jmeter from command .
IP Address example :
Slave 1 : 1.0.0.1
Slave 2 : 2.0.0.2
Jmeter test plan configuration variables:
Number of threads :${__P(threads1,)}
Ramp-up period : ${__P(threads2,)}
Loop Count : ${__P(threads3,)}
I tried following command on jmeter start, but its not working as per expected:
jmeter -n -t POC1.jmx -R 1.0.0.1,2.0.0.2 -Gthreads1=50 -Gthreads2=1 -Gthreads3=1, -Gthreads1=60 -Gthreads2=1 -Gthreads3=1
Please help me if I am wrong in above command , please tell me how can I send 50 user threads , ramp up period 1 and loop count 1 for slave 1 and 60 user threads ramp up period 1 and loop count 1 for slave 2.
You won't be able to do it the above way as:
All remote slaves are executing the same test plan
You can pass global properties via -G command-line argument, so all the remote clients will be having the same properties set
The solution is to use different user.properties on different slaves, like:
Define amount of virtual users in your Test Plan using __P() function like:
${__P(threads,)}
On first slave add the next line to user.properties file (lives in JMeter's "bin" folder)
threads=50
On second slave add the next line to user.properties file
threads=60
Restart JMeter on slaves
You can also pass threads property value via -J command line argument while starting JMeter servers like:
On first slave
jmeter -Jthreads=50 -s -j jmeter-slave1.log .....
On second slave
jmeter -Jthreads=60 -s -j jmeter-slave2.log .....
See Apache JMeter Properties Customization Guide for more information on using JMeter properties, setting and overriding them

JMeter CSVRead in Non Gui Mode does not read the file

I use JMeter 2.11.
I build my Test with nesting files and so on. With CSV Data Set it did not work. But i found a solution with the JMeter function __CSVRead and it works fine in GUI mode.
Now I have to run this test in non-GUI mode and it does not work.
I try to read a CSV file with some urls and want to send a normal HTTP request zu this adress.
in my HTTP request I set for server name: ${__CSVRead(${file},0)} Port: 7080
In GUI mode he can read the file in non-GUI not. I don´t know why.
Result in the log:
1406123833303,1077,asd,Non HTTP response code: org.apache.http.conn.HttpHostConnectException,Non HTTP response message: Connection to http://:7080 refused,jp#gc - Ultimate Thread Group 1-1,text,false,2213,0
Please don´t say I have to take "CSV Data Set" it really doesn´t work with it ;)
My expectation that in GUI mode you're using relative path in your ${file} variable.
The easiest option is switch to using full path instead of relative.
Alternatively you can check where JMeter expects CSV file to be present and copy it over. It can be done, i.e. using Beanshell Sampler with the following code:
import org.apache.jmeter.services.FileServer;
File file = new File(FileServer.getFileServer().getBaseDir() + System.getProperty("file.separator") + vars.get("file"));
if (!file.exists()) {
ResponseMessage = "Failed to locate " + vars.get("file") + " file under " + FileServer.getFileServer().getBaseDir() + " folder";
IsSuccess = false;
log.error(ResponseMessage);
SampleResult.setStopTestNow(true);
}
The code above checks existence of file with the name stored in ${file} variable under current JMeter working directory and if the file isn't there sampler will fail and the test will be stopped.

Resources