Jmeter - query, store in variable. Now use that variable in post-processing - jmeter

Looking to utilize jmeter for some automated testing but facing a problem. preliminary to my tests I want to run a query on my DB and then store the result in a text file.
I thought I'd do it via a JDBC request as such:
Then immediately after I want to do some post-processing that writes the result to our file:
I've tried, too, putting the paramater passed to vars.get in quotation marks, but I get no such luck. Jmeter does write a file, but that file is empty, and if I run the query independently, it does return results.
Does anybody know how to get this desired behavior?

If you look into jmeter.log file you should see a Beanshell Related error.
This is due to "Result Variable Name" being an ArrayList, not String, hence
You need to use vars.getObject() method instead of vars.get();
Ensure you quote the variable name
Remove the ";" at end of SQL Query
You need to iterate the ArrayList somehow or serialize it to file.
If result set is large it's better to consider doing it via JSR223 Sampler using "groovy" as a language as Beanshell has some performance limitations. See Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For! guide for benchmarking results and instructions on how to setup groovy scripting engine support.
To write the output to a file , see :
Append data into a file using Apache Commons I/O
If you decide to use Groovy it will be even easier :
http://grails.asia/groovy-file-examples

Related

how can we increase the string limit or size for base64Encode

[Error](https://i.stack.imgur.com/iqUDy.png)
I tried to pass a string from csv file to ${__base64Encode()} function but in result my API request is getting failed. When I checked my jmeter logs then in that I found that base64Encode function is unable to encode the string because it is too long and limit is 65535. So, is there any way by which I can increase the string limit to encode my string or is there other way because I need to pass that string to initially encode the data to make my script work.
Please find the attached screenshot for the error in mentioned link and let me know if there is any solution to resolve this issue.
Don't inline JMeter Functions or Variables in Groovy scripts, as per JSR223 Sampler documentation:
The JSR223 test elements have a feature (compilation) that can significantly increase performance. To benefit from this feature:
Use Script files instead of inlining them. This will make JMeter compile them if this feature is available on ScriptEngine and cache them.
Or Use Script Text and check Cache compiled script if available property.
When using this feature, ensure your script code does not use JMeter variables or JMeter function calls directly in script code as caching would only cache first replacement. Instead use script parameters.
Amend your code to look like:
vars.put('token', vars.get('token1').bytes.encodeBase64().toString())
and the error should go away
More information on Groovy scripting in JMeter: Apache Groovy: What Is Groovy Used For?
Alternatively just use ${__base64Encode(${token1},token)} function where required, but not in the JSR223 Test Element script

Using flexible file writer in Jmeter produces unwanted results in the output csv

I am using the flexible file writer in Jmeter to write the four variables that I have captured and defined in the properties file. I have used the debug sampler to verify and view results of the values of each of the 4 variables that I have used.
But when I am trying to use number of threads as more than 3 or 5, I am getting garbled and multiple values of the variables in the same column of the output csv as:
But ideally I am expecting the result to be like:
Timestamp_Queued|Timestamp_Download_Started|Timestamp_Download_Completed|Timestamp_Completed
1623596826050 1623596829514 1623596829868 1623596830045
1623596826195 1623596826434 1623596826840 1623596827071
1623596826427 1623596827736 1623596828138 1623596828319
1623596826629 1623596830096 1623596830417 1623596830600
1623596826809 1623596827113 1623596827514 1623596827692
Can someone help please. I have tried using other JS to capture the data one below the other but I am not able to capture the data in the above way. I am sure Jmeter must have an easy way to accomplish this.
Thanks!
We cannot help you by looking at the screenshot of the result file, we need to see your configuration of the flexible file writer, know how do you launch your JMeter script, is there any suspicious entries in jmeter.log file, etc.
Given that:
You declare your variables as Sample Variables
Configure the Flexible File Writer to save these variables as variable#0,variable#1,etc
Run JMeter in command-line non-GUI mode
You should get the anticipated results
More information: Using the JMeter Flexible File Writer Plugin

How set a variable as a parameter value in JMeter

I'm trying to set a variable as a parameter value in a Backend Listener. I tried to add the variable as
${"testname"}
and also as
$["testname"]
but both options didn't work. JMeter consider them as a string and not as a variable. Any ideas how I can do that ?
The correct syntax for JMeter Variables is ${variable_name_here} so you need to change it to ${testname} and it should start working as expected.
If there will still be problems make sure that the variable is defined and has its respective value, it can be done using Debug Sampler and View Results Tree listener combination
P.S. Since JMeter 3.1 it's recommended to use JSR223 Test Elements and Groovy language for scripting instead of Beanshell (and in fact any other languages) so while your script is relatively small maybe it's a good time for migration.

How can I embed a test data set in my JMeter test plan?

At the moment, my JMeter test uses a CSV Data Set Config to iterate through a limited set of input data for each HTTP request that I do.
But I don't want to deal with the hassle of an external file (uploading it to my test runner, etc.) - I'd like to just embed the data into the jmx file itself.
I was hoping for something like a "test data" node, that would work similarly to a CSV data set (with Recycle on EOF especially) and I'd just copy/paste the data into the test plan instead of working with an external file.
I'm thinking I might be able to work around it with a JSR223 preprocessor - but is there a better built-in way?
Edit: As per comment: the data cannot be generated.
If you want to do this via JSR223 Test Elements and Groovy language correct syntax would be
vars.put("messageId", "wibble");
vars is a shorthand for JMeterVariables class instance, see the JavaDoc for available functions and properties.
Easier way would be going for User Defined Variables or User Parameters or even better Set Variables Action
You can create a text contains keys and values separated with tab, copy all text
Notice if you have property file you can replace = with tab
Add to JMeter GUI User Defined Variables and click Add from Clipboard
It'll load all your variables to JMeter without "do that by hand using JMeter's GUI"
.
This is my first go at a script based approach using a JSR223 preprocessor node:
// This is where the data is embedded. Up to a couple of hundred entries
// is probably fine, more than that will likely be a bad idea.
def messageIdList = ["graffle", "wibble", "wobble", "flobble", "gibble", ...]
def messageIndex = (vars.getIteration() -1) % (messageIdList.size() -1)
println "iteration ${vars.iteration}, size ${messageIdList.size()}, index: ${messageIndex}"
vars.put("messageId", messageIdList[messageIndex]);
messageIndex++
This appears to do what I want, even when run in a Thread Group with multiple threads.
I'm not sure exactly what the vars.getIteration() represents, and I'm not clear about the precise lifetime / scope of the variables. But it'll do for now.
Any better answers will cheerfully accepted, marked and upvoted.

how to use jmeter to update xml to post later

I have a JMeter job that I'm taking the XML response from, updating the XML, then PUT the XML back to update the record. I have ALL the parts, except the XML update part.
I need to update XML root/Settings/HasRetry from not only "false" to "true", but also add other nodes directly under it. Order matters in this XML.
xml to update
Ideas on the best way to do this? I tried a via a simple java script:
java replace
...but the JS pukes on that b/c of the special characters in the XML string.
Ideas?
You have an error in your script, last line should look like vars.put("ResponceData", res); as your current implementation simply ignores the replacement logic.
Also be aware that it is not recommended to use Beanshell for scripting, since JMeter 3.1 users are encouraged to switch to JSR223 Test Elements and Groovy language.
Groovy is Java compliant hence in majority of cases valid Beanshell code will be a valid Groovy code, however it is not recommended to use JMeter Variables references like ${ResponceData} as it will ruin scripts compilation feature and performance will be a big question mark so switch to vars.get('ResponceData') instead.
Example Groovy code for values replacement will look something like:
def str = vars.get('ResponceData')
def res = str.replace(vars.get('findSearch'), vars.get('findReplaceWith'))
vars.put('ResponceData', res)
Demo:
See Apache Groovy - Why and How You Should Use It to learn more about Groovy scripting in JMeter.

Resources