Jmeter: validating Code in Beanshell Sampler - variables

Here is the simple code
vars.put("str" , "${__time(dd/mm/yyyy HH:MM:SS)}");
log.info("${str}");
I am expecting to see the value of str in logs but I am getting ${str}. I am validating it because I have to assign the current time to a variable and later want to use it in script. But I am not getting the value stored in str.

try as follows using vars.get:
vars.put("str" , "${__time(dd/mm/yyyy HH:MM:SS)}");
log.info("str " + vars.get("str"));

I wouldn't recommend inlining functions and/or variables into Beanshell script as you may face syntax error issues, i.e. type mismatch if the value has quotation marks.
So either use log.info(vars.get("str")); or use Debug Sampler and View Results Tree listener combination to see JMeter variables values.
More information: How to Debug your Apache JMeter Script

Related

How to save result from OS Process Sampler to a variable?

JMeter OS Process Sampler is set up, works fine and saves result (a token as result of powershell srcipt execution) to a file.
Is it possible somehow to save result from powershell script directly into a JMeter variable instead?
What should I add for that?
Normally you should be using JMeter Post-Processors in order to extract data from Sampler's responses
If the token is the only thing that your powershell script returns you can extract it using i.e. Boundary Extractor, just provide desired variable name and leave everything else empty
Demo:
If there is some other text surrounding the token - adjust the boundaries accordingly or go for Regular Expression Extractor

Parameterizing Header manager in Jmeter for API testing

In J meter I have 2 Thread from Ist thread I am getting token value and I have to use that into 2nd thread header manager. The value generated is in JSON so, I have used JSON extractor to extract the value of that token but I am not able to use that value into Next(2nd Thread)
Thread 1: JSON extractor I have used $..token to extract my token value and stored into a variable 'X' as in JSON Extractor there are one field names of created variables.
Thread 2: Header manager -->> I want to use that value with one word 'YY' so it should be like 'YY (token value)'
For the above one I have tried YY+{X} it's not working for me and also YY {X} it is also not working.
SO kindly help me in this.
First at all, ensure you're running your threads consecutively (Check 'Run Threads Consecutively' in Test Plan properties)
Easiest way to share variables between threads is to use 'Properties', In your example after you have extracted the variable 'X' create an assertion or post processor of your preference(i use beanshell assertion), and copy this: ${__setProperty(paramToAnotherThread,${X})}.
Then in the other thread use ${__property(paramToAnotherThread)} to invoque it.
Hope it works.
Here you can see explained: https://www.blazemeter.com/blog/knit-one-pearl-two-how-use-variables-different-thread-groups

How to set variables to custom function in Jmeter?

I have a basic function in BeanShellSampler.bshrc at Jmeter 4.0
String getMyString(String strParam) {
return "MyString: "+strParam;
}
I called in BeanShell Sampler as below
String N = "123123";
log.info("${__BeanShell(getMyString("${__V(Var${N})}"),)}");
When I run Sampler output is somthing like that.
2018-06-18 15:25:40,080 INFO o.a.j.u.BeanShellTestElement: MyString: Var${N}
How can I set string variable to my function?
I read function articles in Jmeter web site
Thank you.
Add the next line to user.properties file:
beanshell.sampler.init=BeanShellSampler.bshrc
Amend your code to look like:
String N = "123123";
log.info(getMyString(N));
That's it, you should get MyString: 123123 in jmeter.log file
Be aware that starting from Jmeter 3.1 it is recommended to use Groovy for all forms of scripting as Groovy performance is much better comparing to Beanshell so consider taking the following steps instead:
Create a file, i.e. foo.groovy in "bin" folder of your JMeter installation and put your function there:
String getMyString(String strParam) {
return "MyString: " + strParam;
}
Add the next line to user.properties file:
You should be able to refer your custom code from __groovy() function like:
${__groovy(log.info(getMyString("123123")),)}
functions can be used anywhere in the Test Plan
For each BeanShell Program type there are different beanshell.*.init properties defined in bin/user.properties
beanshell.function.init=BeanShellFunction.bshrc
beanshell.preprocessor.init=BeanShellSampler.bshrc
beanshell.postprocessor.init=BeanShellSampler.bshrc
beanshell.assertion.init=BeanShellFunction.bshrc
Hence the same function which needs to be called from any program(preprocessor, postprocessor, etc) we need to copy the function to every .bshrc file OR use same .bshrc file for every program init property.
In your case if you are using local string variable N and passing it along with the script. If you use ${Variable} there must be a JMeter variable defined so that JMeter can pick its value. To do that you can use vars.put , write N value to JMeter variables and use ${N} .
I have defined Var123123 value as FinalValue as shown below
And 2 beanshell samplers one is to put String variable N to Jmeter variable and one is beanshell script as shown below
You can see in the log its printed VAR123123's value which is FinalValue
The reason why i took 2 beashell samplers is if i write N to JMeter variables and use it in same script its not updating N value until the sampler executed..
References :
Configuring JMeter
JMeter Beanshell
Please let me know if it helps

Pass large parameters to browser

I created more than 20 reports using crystal report. Now I am integrating them to my API service. One particular report uses the following parameters:
lngCompanyId=1
szITSfromCompany=Sample
strGroupBy=Region
strGroupBy1=Greater Accra
strQuery1='and #tblRetOutletSumm.iRegionID=4'
strQuery2='and #tblRetOutletSumm.iDistrictID=8'
strQuery3='2016-10-27'
strQuery4='2016-10-27'
strPicHeight=1
strPicWeight=1
Now i have to pass them to my web browser to generate the report. I tried the following URL after running the project:
http://localhost:20010/Home/CreateSummaryReport?lngCompanyId=1&szITSfromPersol=Sample&strGroupBy=Region&strGroupBy1=Greater Accra&strQuery1=and #tblRetOutletSumm.iRegionID=4&strQuery2=and #tblRetOutletSumm.iDistrictID=8&strQuery3=2016-10-27&strQuery4=2016-10-27&strPicHeight=1&strPicWeight=1
It broke the code. It passed up to strGroupBy1 which is Greater Accra but when it came to strQuery1, it only showed me the first word which is and instead of and #tblRetOutletSumm.iRegionID=4 and all the remaining parameters threw null values.
I know the '#' tag causes the problem, so how do I pass the parameter? Or should I change a the database procedure?
Changing the '# tag' by ascii symbol solved the issue.
I changed the '#' tag by '%23' and the issue is solved.
Somad

BeanShell PreProcessor updates User define variables

I'm very new at JMeter issues.
In a test script i have a BeanShell PreProcessor element that updates some variables previously defined at a "User Defined Variables" element.
Latter those variables are used in "Http Requests". However, the value that is used in the http request is the default one.
The scripts seems to be working due to some debug print();
My question is if it's necessary to delay the script to be sure that the BeanShell finishes?
Thanks a lot for your attention
There is no need to put any delay to Beanshell Pre-Processor as it's being executed before request. I'd recommend to check your jmeter.log file to see if there are any scripting issues as Beanshell Pre-Processor does not report errors anywhere including View Results Tree listener.
There are at least 2 ways to assure that everything is fine with your Beanshell script:
Put your debug print code after variables replace logic to see if it fires
Use JMeter __Beahshell function right in your HTTP request. If it's ok - View Results Tree will demonstrate beanshell-generated value. If not - the field will be blank and relevant error will be displayed in the log.
Example test case:
Given following Test Plan structure:
Thread Group with 1 user and 1 loop
HTTP GET Request to google.com with path of / and parameter q
If you provide as parameter "q" following beanshell function:
${__BeanShell(System.currentTimeMillis())}
and look into View Results Tree "Request" tab you should see something like:
GET http://www.google.com/?q=1385206045832
and if you change function to something incorrect like:
${__BeanShell(Something.incorrect())}
you'll see a blank request.
The correct way of changing existing variable (or creating new if variable doesn't exist) looks like
vars.put("variablename", "variablevalue");
*Important: * JMeter Variables are Java Strings, if you're trying to set something else (date, integer, whatever) to JMeter Variable you need to cast it to String somehow.
Example:
int i = 5;
vars.put("int_i", String.valueOf(i));
Hope this helps.
You can update the vale of a "user defined variable".
You have to create a bean shell sampler
vars.put("user_defined_variable", "newvalue");
#theINtoy got it right.
http://www.blazemeter.com/blog/queen-jmeters-built-componentshow-use-beanshell
I'm new to jmeter too but as I know variables defined in "User defined variables" are constants, so you can't change them. I recommend to use "User Parameters" in preprocessors or CSV Data Set Config.