How to make JMeter read unique values from a csv - jmeter

I am running a JMeter test which requires me to use a value only once. If i use that value again the test will fail. As of now I am reading these value from a CSV and I have noticed that JMeter is neither reading these values in a sequence nor using the value only once.
These values have been provided by another team which will use these values in their test once I have successfully used them in mine and they need the value to be in sequence so even if I let JMeter do its thing i can't give the other team number because they are not in sequence.
I know in Loadrunner you can do this but now sure how to do it in JMeter.

I Assume you use "csv data set config" for Parameterization. You should use below settings.
Recycle on EOF: false,
Stop thread on EOF: True,
Sharing mode: All thread.
This setting is similar to that of unique, each iteration, continue with last value, abort vuser at EOF in loadrunner.

Related

Jmeter random number generation

I have a requirement to generate a random number and use it in subsequent requests. So, before using this newly generated random number in first subsequent request, i need to check if this random number generated is already exists in the application or not by comparing with newly generated response number. So for this validation i am thinking to use an extractor to get the count and eventually verify this is >1 and make it run until this condition is invalid. So in case of random number already exists, i need to generate a new random value since the previous one is already exist in the application. Any snippet i can use here?
An easier option would be going for __time() function which produces an Unix timestamp in milliseconds from 1st of Jan 1970. To be on the safe side you can add current thread number to it so even in case of concurrency you would get unique values (incrementing each millisecond):
More information on JMeter Functions concept: Apache JMeter Functions - An Introduction

Global incrementing field that could used in thread groups in Jmeter

I have a Test which is running for 30 Thread groups and each thread needs a unique variable which will increment and used when the Test is running.I have used a counter in this case which will be used in the API request body.
Now every time I am using the Test I have to manually go and changed the Starting Value and the Number format in the Counter which is lot of manual work since I am using 30 thread groups
My question is Can I use a global variable which will have a way to get a unique number to each thread group which will be used by each API request
I am a beginner for Jmeter so any help will be appreciated.
There's unique number per thread using function ${
__threadNum}
thread number function simply returns the number of the thread currently being executed
Just parameterize it using __P() function like:
Once done you will be able to override the above properties values via -J command-line argument like:
jmeter -JstartingValue=100 -JnumberFormat=00000 -n -t test.jmx
To make the changes permanent you can add the next lines to user.properties file:
startingValue=100
numberFormat=00000
the values which you pass via the command-line will take over the values which are in the user.properties file.
You can also provide default values like:
${__P(startingValue,1)}
so in case if the startingValue property is not set the test will use 1 as the default value.

Avoid failed cases in jmeter

I am running jmeter to perform performance testing on a web application. The web application restricts the creation of the duplicate task. When I record that using blazemeter and run it with 100 threads, it shows that the task creation url is failed in the report, as it tries to create a task with the same name. How to avoid this?
In the majority of cases you simply cannot record and replay JMeter script without prior modifications as you need to perform correlation and parameterization.
In particular your case you need to identify the task id, most probably it is a parameter of a POST request and replace recorded hard-coded value with a JMeter Function which will generate a random value, i.e.
__Random() - for a random number in the given range
__RandomString() - for a random string from the given characters
__UUID() - creates a GUID-like structure with a very high chance of being unique, i.e. 123e4567-e89b-12d3-a456-426655440000

Is it possible to create a User Defined Variable in JMeter using an expression?

I've been trying to use JMeter to create some automated Performance Tests and I'm setting up a job in Jenkins so that people can run it and view the results there.
I'm trying to add a few parameters to the job that correspond to the options available in the Thread Group. They are:
Number of Users
Ramp-up Period
Loop count
Some people don't quite understand the concept of the 'Ramp-up Period' so instead I wanted to make refer to it as 'Delay' and use it to control how long each thread will wait before starting the test. This would mean that the 'Ramp-up Period' should be equal to (The Number of Users x Delay).
The command I'm using to run the test is below:
jmeter -n -t <myscript>.jmx -l results.jtl -j jmeter.log -JUSERS=10 -JDELAY=1 -JLOOPS=1
and the variables look like this:
USERS = ${__P(USERS)}
RAMPUP = ${USERS}*${__P(DELAY)}
LOOPS = ${__P(LOOPS)}
But unfortunately the value of the RAMPUP variable was not what I expected. It ended up being "${USERS}*1"
Is there a way to do this in JMeter?
JMeter variables and properties are Strings, you can not apply arithmetic operations to them. The behavior you're getting is absolutely expected. Also there is no possibility to dynamically change properties during runtime, you'll have to calculate ramp-up prior to passing it to JMeter.
You can add BSF PreProcessor before you test plan, calculate there values for user defined variables and put values into variables using putObject(String key,Object value)

How to run JMeter failed threads after test stops?

I'm using JMeter to run a functional test to update the password of a lot of users (22K). I've separated the users in 2 scripts and used a Ultimate Thread Group with Start Threads Count = 100, which is the value with which I got less errors, however I still got 1.5% transactions failed, and I need to rerun only this failed threads, because all users need to have the same password.
I've tried to get answers to this specific problems, but I have only found ways to prevent this from happening, like using a While controller with a timer, or logging the full response for failure, but I haven't found if there is a way to specifically rerun the failed threads.
Does anyone know if this is possible?
You will have to do following.
Use JSR223 sampler to set the rescode=0
While controller with (if rescode!=200)
HTTP Sampler
JSR223 post processor as javascript as the scripting language.
Store response code using prev.getResponseCode()
e.g. vars.put("rescode", prev.getResponseCode());
You might have to add some more intelligence to the script to avoid infinite loop.
Another approach to solving the problem would be to anticipate errors on some of the password update calls and build a data file upon failure with the information you need.
For Example:
Create a regular expression post processor that has default value of false, and template value of true. Make the expression match the expected response, and fail if the sample fails.
Then, after that sampler, you can add an if statement based on the new true/false variable. If it is false, you know the previous password update failed. Inside the if statement, add a dummy sampler with response data containing all the information you need to know which accounts you must retry.
Then, add a simple file writer to this dummy sampler, and log the dummy sampler response data to a file. At the end of a test run this data file would contain all the information you need to re-try all failed accounts.
Sadly this is a slightly manual process, but I'm sure with a little creativity you could automate recursive test runs until the re-try file is empty. Beanshell file IO might let you handle it all inside a single test run.
-Addled

Resources