jmeter beanshell call jmeter function - jmeter

I have a HTTP request sampler configured. In the request body, I call out to a beanshell function I wrote:
${__BeanShell(createHeader("GET"\,"Customer"\,"${__UUID}"\,"${__time(yyyy-MM-dd'T'hh:mm:ss)}"))}
The function just builds some request strings with the passed-in parameters. I want to remove the jmeter function calls (__UUID and __time), and call them directly from within the beanshell function. I could not find a way to do that.
Thanks

Don't inline JMeter Functions or Variables into scripts, in your case you will have to go for code-based equivalents instead, to wit:
__UUID() -> UUID.randomUUID().toString()
__time() -> new java.text.SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss").format(new Date())
Since JMeter 3.1 it's recommended to use JSR223 Test Elements and Groovy language for scripting, in your case it would be __groovy() function. If you want to re-use createHeader method - you can put it into a separate .groovy file and define groovy.utilities property pointing to this file.
See Apache Groovy - Why and How You Should Use It article for more information on using Groovy scripting in JMeter tests.

Related

I want to fail Beanshell sampler when my script is not conditions not satisfied

I am using Beanshell sampler with java code to compare the two files line by line. I want to fail the Beanshell sampler if comparison failed at any line. I see always my beanshell sampler is sucess in view results treee even the comparison failed or passed. So any one please give me a idea how to fail the sampler.
Note: I used Beanshell Assertion as well but its not worked.
View Results Tree Image
Beanshell Sampler with Beanshell Assertion
boolean differenceInFile = false;
SampleResult.setSuccessful(differenceInFile);
IsSuccess=differenceInFile;
line #2 and line #3 is what you need in your bean shell sampler to pass / fail depending on your file comparasion
Sample JMX File
It will show you as an xml, try to download it
There is SampleResult pre-defined variable which you can use for setting the sampler passed or failed, define response code, response message, response body, etc.
So something like:
if (there_are_differences) {
SampleResult.setSuccessful(false)
SampleResult.setResponseCode("500")
SampleResult.setResponseMessage("Files are different")
}
In the assertion you have AssertionResult for the same.
Also be aware that you should be using JSR223 Test Elements and Groovy language for scripting since JMeter 3.1 so it might be a good option for migration.
More information on JMeter API shorthands available for the JSR223 Test Elements - Top 8 JMeter Java Classes You Should Be Using with Groovy

Assigning value to the variable based on the request

I have created a jmeter script as below
I am using the user defined variable with function __P() and passing the Url from .sh file
My requirement is, if the url passed is "www.abc.com" then set the value of the variable ${Prefix} to "foo" else set it to "bar"
I tried using JSR223 PostProcessor, but JSR223 PostProcessor has to have a sample associated with it.
Any suggestion how do I achieve it?
Use the following __groovy() function in the HTTP Request sampler directly:
${__groovy(if (vars.get('Url') == 'www.abc.com') {return 'foo'} else {return 'bar'},Prefix)}
For subsequent requests (once the __groovy() function has been run) you will be able to use just ${Prefix}
More information: Apache Groovy - Why and How You Should Use It
If you're not too comfortable with Groovy scripting you can consider using __if() function, it's a part of Custom JMeter Functions bundle, can be installed usign JMeter Plugins Manager

Jmeter JSR223 Function calls from several threads

I have written a function in file BeanShellFunction.bshrc called XYZ which I can use it in several of my BeanShell (pre and post) samplers throughout threads and .jmx files and all over the map.
Now I like to do the same in JSR223 (pre and post) and clearly I cant call that XYZ function because thats for pre and post Bean files (or Java). How do I do the same and write a fucntion called ABC for my pre/post JSR223 functions which I can use in any thread and any .jmx file?
If you want to use some custom Groovy code in __groovy() function you need to "tell" JMeter your Groovy file location via a property, i.e. add the next line to user.properties file:
groovy.utilities=/path/to/your/file.groovy
JMeter restart will be required to pick the property up
For other JSR223 friends you can add Script.evaluate() function to the beginning of your JSR223 Test Elements like:
evaluate(new File('/path/to/your/file.groovy'))
After that you will be able to use the functions from your file.
Also be aware that if your class is in compiled form and under JMeter Classpath you don't even need to take any extra actions.
More information: Apache Groovy - Why and How You Should Use It

JMeter simple BeanShell PreProcessor

I'm new to JMeter BeanShell PreProcessor function.
For a test I'm trying to print sample URL address.
From the tutorial I have the follownig code:
org.apache.jmeter.samplers.SampleResult;
String currentURL = SampleResult.getUrlAsString();
print(currentURL)
But I get error "Attempt to resolve method: getUrlAsString() on undefined variable", how to define this variable first?
This means the SampleResult does not exist.
You need to use prev as per this doc:
http://jmeter.apache.org/usermanual/component_reference.html#BeanShell_PreProcessor
Which references this javadoc:
http://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html#getUrlAsString--
Be aware that since JMeter 3.1 it is recommended to use JSR223 Test Elements and Groovy language for any form of scripting in JMeter tests. So consider migrating to Groovy as soon as possible.
If you are using a PreProcessor it means that you don't have any SampleResult as sampler has not been yet executed. So you need to use sampler shorthand which is resolved into HTTPSamplerProxy like:
sampler.getUrl() as String
Demo:
More information: Apache Groovy - Why and How You Should Use It

Print response json in jmeter using beanshell

I want print my json response in jmeter. I used beanshell but it shows error. Below is the line to print json object extracted in "data":
log.info("========"+${data});
Don't ever inline JMeter Functions or Variables into scripts, they may resolve into something which will cause compilation/interpretation failure, use code-based equivalents instead or pass functions/variables via "Parameters" section.
Exhibit A: using vars shorthand
log.info("========" + vars.get("data"));
Exhibit B: using "Parameters" section
Using Beanshell isn't the best scripting option, consider migrating to JSR223 Elements and Groovy language as Beanshell has known performance problems. Moreover, Groovy has built-in JSON support See Apache Groovy - Why and How You Should Use It for details.
And finally your ${data} variable might not be defined (i.e. your extractor fails), in this case you will get interpretation failure on attempt to refer it as ${data}, double check its value using Debug Sampler and View Results Tree listener combination.

Resources