How to move variable from sampler to sampler in groovy Jmeter - groovy

I have a question about variables, in groovy in jmeter.
I want to create a test that in the first step read data via groovy sampler, and put it in variable budget, def = old_budget;
and in the end of the test I want to create another sampler and check if budget is old_budget - 5.
In the parameters of the second sampler I put ${old_budget}, but the sampler not recognized the variable from the previous sampler, what I am missing?
P.S. the variable is not user defined variable it is defined in the first sampler

In order to create a new JMeter Variable called old_budget having the value of budget variable you can do it like:
vars.put('old_budget', vars.get('budget'))
Looking into your screenshots it seems you're misusing the Parameters feature,
You need to separate variables you pass through "Parameters" section by spaces, not by commas
You can refer them individually using args[] shorthand like:
- `args[0]` - for "budget"
- `args[1]` - for RedisIP
- etc.
Demo:
More information:
JSR223 Sampler
Groovy is the New Black

Related

How to set values of variable using postprocessor in Jmeter and use it in Preprocessor for same sampler?

My scenario is to pass different time (15 mins gap) till the script runs for each sampler run.
I am using preprocessor and postprocessor in the same step and now i want to use the the variable changed in postprocessor step, in side post processor step.
Below is the screenshot of code and script.
According to JMeter Test Elements Execution Order PreProcessor is executed before the PostProcessor therefore you cannot access the variables set in the PostProcessor in the PreProcessor
There is __timeShift() function which can generate the date in the given format with the given offset, for example you can add 15 minutes to current time as simple as:
${__timeShift(yyyy-MM-dd'T'HH:mm:ss.SSS'Z',,PT15M,,)}
There is no need to use these SimpleDateFormat/Calendar in Groovy, there is TimeCategory class which makes dates manipulation very easy. Moreover, Groovy's Date class provides format() function therefore you can add 15 minutes to the current date like:
use(groovy.time.TimeCategory) {
15.minutes.from.now.format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
}
Demo:
Just found out the solution. I don't need to add preprocessor here. instead just using jsr223 sampler will work fine with onceonly controller.
preprocessor was resetting the starttime and endtime value here.

JMeter - User defined counter not incrementing for a Loop

I am quite new to JMeter and I was trying to increment a counter variable pre-defined in User Defined Variables using a Loop Controller and a JSR223 PostProcessor and it seems not working well. I looked at various examples on JMeter loop and counter examples to work this out but the config element Counter was also not incrementing with the loop.
Could anybody please let me know what I am doing wrong?
This is the user defined variable counter:
This is how I do loop:
And this is how I am trying to increment the counter using post processor and the log displays that the counter is not incrementing for each loop. I want to get the counter upto 5:
[EDIT]
I guess I wasn't clear on why I used ${counter} to test out. I was trying to evaluate the counter variable within another variable as '${__V(transaction_${counter})}' because this needs to be appended to a text file. For example, if transaction_3 has a value "110001", if I do '${__V(transaction_'+vars.get('counter')+')}' to append, the text stored shows "transaction_3" and if I do '${__V(transaction_${counter})}' then I get the correct value "110001" stored in the text file while in next iteration the counter does not increment. Is there a possible way to solve this problem?
This is how I was using the variable within variable and it shows that the values are not changing because the counter is not changing.
And this image is how I am trying to do with vars.get() and it shows that it is just putting the variable name instead of evaluating the value of each item.
According to JSR223 Sampler documentation:
JMeter processes function and variable references before passing the script field to the interpreter, so the references will only be resolved once. Variable and function references in script files will be passed verbatim to the interpreter, which is likely to cause a syntax error. In order to use runtime variables, please use the appropriate props methods, e.g.
props.get("START.HMS");
props.put("PROP1","1234");
So amend the last line of your script to look like:
log.info(vars.get('counter'))
Demo:
Also be aware that it's much easier to use:
Counter test element or __counter() function, check out How to Use a Counter in a JMeter Test article for more details
Loop Controller exposes ${__jm__Loop Controller__idx} JMeter Variable which holds current iteration number
According to the JMeter Manual Best Practices -> 16.12 JSR223 Elements
When using JSR 223 elements, it is advised to check Cache compiled script if the available property to ensure the script compilation is cached if the underlying language supports it. In this case, ensure the script does not use any variable using ${varName} as caching would take only the first value of ${varName}. Instead use: vars.get("varName")`
If you change log.info('${counter}') to log.info('${vars.get("counter")}') that should do the trick!
Or uncheck this:

Counter variable not incrementing when accessing it in Groovy JSR223 Sampler

I have a simple loop controller and within it, a Counter config element, and a JSR223 Sampler running Groovy code. My Counter is set to begin at 0, increment by 1 up to a max of 3, and is set to a variable named 'idx'.
In my JSR223 Sampler, I log the value of idx using log.info(${idx}); -- it always prints the first iteration value (in my case 0), for every loop iteration.
I disabled this JSR223 sampler and added a BeanShell sampler, doing the same log statement, log.info(${idx});, and it is incrementing properly -- I get the values 0, 1, 2 for the iteration.
I need to take some JSON, map them to objects, do some tweaking, then map them back to JSON. There are JSONParser, JSONObject, and JSONArray classes that seem to be working in the BeanShell Sampler, but I'm much more comfortable with Groovy's JsonSlurper and JsonBuilder classes and would prefer to use these.
All of these steps are within a Test Fragment, if that makes a difference. Anyone have any ideas? Is this a bug?
Never refer JMeter Function or Variables directly in scripts, either use "Parameters" section for this like:
Or use vars shorthand which stands for JMeterVariables class instance like:
log.info(vars.get('idx'))
The reasons are in:
Function or variable may resolve into something which will cause compilation failure or unexpected behaviour
Referencing variables and/or functions prevents caching compiled Groovy scripts so it negatively impacts performance
Referencing functions and/or variables might conflict with Groovy GString Template
See Apache Groovy - Why and How You Should Use It article for more information on using Groovy scripting with JSR223 Elements in JMeter tests.

Passing a parameter from one thread to another in Jmeter

In Jmeter ,When logging in an application, Parameters like Viewstate are generated. I need to use this parameter in my next thread. ( I am not passing a variable but a parameter that has a "NAME" and "Value"). Can someone help please?!!
You can extract the parameter using regular expression extractor as :
Then use BeanShell Assertion to make that variable global.
use the variable wherever you want using __property function.
${__property(devicegroup_id)}

Format the stirng value

I have the following value in a variable.
9.2.345.113619.2-218.98721247546.30582.1191562771895.2
I want to change the format of this value to 9-2-345-113619-2-218-98721247546-30582-1191562771895-2 and store it in another variable. Is there any function in JMeter that can do this?
Suppose your value is stored in Jmeter_variable
Then place one bean-shell sampler and write below mentioned code
value=vars.get("Jmeter_variable").replaceAll("\\.","-");
vars.put("Updated_variable",value);
Now use ${updated_variable}, where you want to use
Inline, using __javaScript() function
${__javaScript("9.2.345.113619.2-218.98721247546.30582.1191562771895.2".split(".").join("-");,)}
Against variable using __Beanshell function
${__BeanShell(vars.put("newStudyID"\, vars.get("").replaceAll("\\\\."\,"-")),)}
In any Beanshell Test Element:
vars.put("newStudyID", vars.get("").replaceAll("\\\\.","-"));
See How to Use BeanShell: JMeter's Favorite Built-in Component guide for more information on using scripting in your JMeter test.

Resources