Error while processing a beanshell preprocessor - jmeter

I am new to the beanshell scripting.So my query might have basic syntactical issue.
I am getting "DocConnectionId" from regular expression extractor which is the number of elements in app screen. I have GetNewReferralId which the variablevalue i want to match with DocConnectionId.
I have written the below code:
int DocConnectionId = Integer.parseInt(vars.get("connectionIDWithDoc_matchNr"));
int GetNewReferralId = Integer.parseInt(vars.get("GetNewReferral"));
for(int i = 1;i<=DocConnectionId;i++)
{
if(GetNewReferralId.equals(vars.get("connectionIDWithDoc_"+i))){
Integer.parseInt(vars.put("ConnectionWithDoc"));
break;
}
}
But I am getting the below error in error log.
jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``int DocConnectionId = Integer.parseInt(vars.get("connectionIDWithDoc_matchNr")); . . . '' : Typed variable declaration : Method Invocation Integer.parseInt

Integer.parseInt(vars.put("ConnectionWithDoc"));
This line is wrong, and is guaranteed to generate a Integer parse exception. vars.put returns void value, so you're effectively trying to parse an integer from void, which will throw an exception.
I cant really tell from your code, but are you trying to store the value of i in variable ConenctionWithDoc? In which case, you should do:
vars.put("ConnectionWithDoc", Integer.toString(i));

Most probably connectionIDWithDoc_matchNr is not defined or you made a mistake in its case.
Could you show you full test plan.

Your code does not make a lot of sense, try elaborating what needs to be done so we could come up with more elegant solution in explanations.
Till that time here is a piece of advice:
If you add debug(); line at the very beginning of your Beanshell script - you'll get extra debug output to STDOUT (console, where you launched JMeter from)
If you surround your code in try/catch block like:
try {
//your code here
}
catch (Throwable ex) {
log.error("Error in script", ex);
}
you'll be able to see more readable and understandable stacktrace in jmeter.log file (usually being generated in the folder, you launch JMeter form)
Familiarize yourself with JMeter API w.r.t. classes you're targeting to use. Copy-pasting from stackoverflow without understanding what does the code do can lead to undefined results
See How to Use BeanShell: JMeter's Favorite Built-in Component article for a little bit more detailed explanations and several real-life examples of using Beanshell in JMeter test scripts.

Related

Jmeter : validating a log viewer result with sampler

I am executing a jp#gc - WebDriver Sampler script in which console - log view i am getting a result in text for example check the below image INFO c.g.j.p.w.s.WebDriverSampler: Result1:Image not present
I need to validate the webdriver sample from that result . Any suggestion pls
If you really want to read jmeter.log file and look for the specific message in there you could do something like:
def log = org.apache.commons.io.FileUtils.readFileToString(new File('jmeter.log'), 'UTF-8')
if (org.apache.commons.lang3.StringUtils.containsIgnoreCase('Banner not present', log)) {
WDS.sampleResult.setSuccessful(false)
WDS.sampleResult.setResponseMessage('Failed to locate message "Banner not present" in the log')
}
where WDS.sampleResult stands for SampleResult implementation and you can amend response code, message, mark the sampler as passed or failed and so on.
however it's better to do it on Groovy variable level, i.e.
if (!k) {
WDS.sampleResult.setSuccessful(false)
}
you can also consider relying on Groovy Truth, there is no need to declare booleans
More information on Groovy scripting in JMeter: Apache Groovy: What Is Groovy Used For?

Displaying DigestEncodeFunction Error in JMeter

When I am trying to execute my created script on another system then it's throwing this error like "Displaying DigestEncodeFunction Error in JMeter". PFA Screenshot for the same.enter image description here
Please don't post jmeter.log file in form of a screenshot
You forgot to include your __digest() function call itself
The first problem is that you're using wrong algorithm name, it should be SHA-256, for possible algorithms check out Algorithms section of MessageDigest class JavaDoc
Just in case here how it looks now for Java 8:
If you have troubles when it comes to coming up with proper JMeter Function syntax - go for the Functions Helper Dialog
Here is the function which generates SHA-256 hash of string foo using bar as the salt:
${__digest(SHA-256,foo,bar,,)}
More information on JMeter Functions concept: Apache JMeter Functions - An Introduction

How to create simple counter using Beanshell?

I'm trying to create a simple counter that will print the iteration number to the log.
the problem is that I didn't find a way to initialize the int value of i to 0.
if I'll do it inside the Beanshell script it will keep initializing, I need it to run only once at the beginning of the test.
My code:
int i=0;
log.info(string.valueOf(i));
i=i+1;
Add Once Only Controller, under it JSR223 Sampler with the initialization
vars.putObject("i", 0);
Then you can increment it after it (not under the Controller) with other JSR223 Sampler:
myI = vars.getObject("i")
log.info(String.valueOf(myI));
vars.putObject("i", ((Integer)myI+1));
It is recommended to avoid scripting where possible, and if you cannot live without scripting you should be using the most performing option which is JSR223 Test Elements and Groovy language.
Particularly your case can be implemented without any scripting, you can use the following JMeter Functions:
__log() - which prints an arbitrary message to jmeter.log file
__iterationNum() - which returns the number of current iteration
So if you use the statement like: ${__log(Current iteration is: ${__iterationNum},,,)} JMeter will return it where the function is called and additionally print the corresponding message to the log file.
Demo:
You can install __iterationNum() function as a part of Custom JMeter Functions bundle using JMeter Plugins Manager

Jmeter BeanShell Assertion not failing the tests

I am learning into Jmeter.
I have a BeanShell Assertion which should make the tests fail (failure is hardcoded into the assertion). But all the tests pass. What am I doing wrong?
My understanding is that if the BSA sets
Faliure = true;
the assertion fails.
But in my case it does not fail.
Please see:
You can see the disabled XPath Assertion on the screenshot which is not fulfilled, if I enable that one, that one does fail the test as I expect.
Update: now I see why it didn't fail the tests: Failure has a typo... Then the question: Why did it even run? Isn't this java? Isn't this an undeclared variable?
Thank you!
You have 2 typos, correct statements are:
Failure = true;
FailureMessage = "Here goes the failure message";
Assertion is successful as the code is fine from Beanshell perspective, in Beanshell you don't need to explicitly define object class. As long as it is valid code - your assertion is successful.
Here is a couple of troubleshooting techniques:
Adding debug(); as a first line of your Beanshell script will trigger debugging output to stdout
By surrounding your code in try/catch block like:
try {
//your code here
}
catch (Throwable ex) {
log.error("Failure", ex);
throw ex;
}
you will have the relevant stacktrace printed to jmeter.log file
See How to Use BeanShell: JMeter's Favorite Built-in Component article for comprehensive information on using Beanshell test elements in JMeter

Find who's calling the method

I'd like to somehow find out which CFC is calling my method.
I have a logging CFC which is called by many different CFC's. On this logging CFC there's a need to store which CFC called for the log.
Whilst I could simply pass the CFC name as an argument to my log.cfc, I find this to be a repetitive task, that might not be necessary, if I somehow could find out "who's" calling the method on log.cfc
Is there any programmatic way of achieving this?
Thanks in advance
Update: As Richard Tingle's answer points out, since CF10 you can use CallStackGet(), which is better than throwing a dummy exception.
Original answer: The easiest way is to throw a dummy exception and immediately catch it. But this has the downside of making a dummy exception show up in your debug output. For me, this was a deal-breaker, so I wrote the following code (based off of this code on cflib). I wanted to create an object that is similar to a cfcatch object, so that I could use it in places that expected a cfcatch object.
Note: You may have to adjust this code a bit to make it work in CF8 or earlier. I don't think the {...} syntax for creating object was supported prior to CF9.
StackTrace = {
Type= 'StackTrace',
Detail= '',
Message= 'This is not a real exception. It is only used to generate debugging information.',
TagContext= ArrayNew(1)
};
j = CreateObject("java","java.lang.Thread").currentThread().getStackTrace();
for (i=1; i LTE ArrayLen(j); i++)
{
if(REFindNoCase("\.cf[cm]$", j[i].getFileName())) {
ArrayAppend(StackTrace.TagContext, {
Line= j[i].getLineNumber(),
Column= 0,
Template= j[i].getFileName()
});
}
}
From ColdFusion 10 there is now a function to do this callStackGet()
For example the following code will dump the stack trace to D:/web/cfdump.txt
<cfdump var="#callStackGet()#" output="D:/web/cfdump.txt">
One kludgey way is to throw/catch a custom error and parse the stack trace. Here are some examples
http://www.bennadel.com/blog/406-Determining-Which-Function-Called-This-Function-Using-ColdFusion-.htm
http://coldfusion.dzone.com/news/what-function-called-my-functi
I don't know of a method to do directly what you are asking, maybe someone else does.
However, I believe you could get the stack trace and create a function to parse the last method call.
This function on cflib will get you the stack trace.

Resources