First, let me preface this question that I've only been using JMeter for 36 hours.
I've been able to successfully create a thread that performs a POST (json body) to generate a new record.
{
"id":1257697771,
"displayName":"TERM2",
"functionName":"f_1257697771",
"displayableSourceExpression":"TRUE",
"typeId":200,
"groupId":300,
"clobObjId":1257697772,
"typeCode":5,
..........
}
I need to take the new record's ID (1257697771) value returned in order to perform updates, get by ID, delete, etc. on this record in other threads.
After much reading, I've created a Regular Expression Extractor where:
Apply to: Main Sample Only
Field to Check: Body as Document
Reference Name: newRecord
Regular Expression: "id":(.+?)\,"displayName"
Template: $1$
Match No: 1
Default Value: NONE
At this point, I'm not sure if my Regular Expression is formatted correctly where (.+?) is valid.
Also, I'm confused if I can either just specify the new reference (newRecord) in another thread's HTTP request's Parameters or use a BeanShell Post-Processor, or a Response Assertion, etc....
There a lot of answers for the same function of "Passing". Not being a programmer, I've tried to follow the discussion "how to extract json response data in jmeter using regular expression extractor?", but I'm still not clear.
Any insight is appreciated. Thanks.
JMeter Variables are local to Thread Group, you need to convert your variable to JMeter Property.
Use:
__setProperty() function in the Thread Group where you define your newRecord variable like:
${__setProperty(newRecord,${newRecord},)}
__P() function to access property value like:
${__P(newRecord,)}
See Knit One Pearl Two: How to Use Variables in Different Thread Groups article for more detailed explanation.
Also be aware of the Function Helper Dialog as it looks like JMeter functions syntax was developed by aliens.
To pass a value between threads you need to use the jmeter property function.
In a jsr223 postprocessor using groovy the code to get the value is as follows:
def userProperty = props.get('propertyToGet')
vars.put('userProperty', String.valueOf(userProperty))
You would then access the variable in your thread using:
${userProperty}
Or you can use shorthand directly:
${__P('propertyToGet')}
Variables in jmeter are thread specific.
Thanks everyone. I was able to resolve it with your help!
In the first thread:
set the Reg Expression Extractor Regular Expression = "id":(.+?)\,"displayName"
added a Bean Assertion where Parameters = ${__setProperty(newRecord,${newRecord},)}
In the second thread:
appended the Path url with ${__P(newRecord,)}
Executing the first thread (POST) resulted an new record with a unique ID. (1257698108)
Executing the 2nd thread (GET) shows
GET http://server/.../.../.../.../1257698108
And returns the exact data generated in the first thread.
Thanks everyone for your help!
Related
in one of my steps in the Jmeter script, I'm using json extractor to read a value from a key(address) in the JSON response and store it in a variable called "TypeOfRequest." In the next step, I need to check if the "TypeOfRequest" value is null or not(There can be situations I don't find that key in the JSON response). Then I need to take a different route.
Snippet how I'm getting the TypeOfRequest from Json extractor $.communicationMethods[:1].hTTPS.address
So my question is, how do I check if TypeOfRequest has a value or not in the if controller?
tried using '${__javaScript(vars.get("TypeOfRequest") == null)}(ref https://www.blazemeter.com/blog/jmeter-if-controller and https://sqa.stackexchange.com/questions/32969/how-do-i-check-if-a-variable-is-null-using-a-if-controller) but unable to go through the if condition, can someone help me with this. Thanks in advance
Just use Debug Sampler to see what JMeter Variables are defined and inspect their values, my expectation is that you're "unable to go through the if condition" because your TypeOfRequest variable is not null, i.e. it's present but it's an empty string.
Also the referenced article suggests using __groovy() or __jexl3() function so I believe if you change your condition to something like:
${__groovy(org.apache.commons.lang.StringUtils.isEmpty(vars.get('TypeOfRequest')),)}
you will be able to "go through the if condition"
How to pass parameter (token) to another thread group , i need to use the parameter pass from another threadgroup as dynamic url ( as the image above , i need to use Survey Token as parameter on the next threadgroup)
i already try some tips , but still get stucked
the token passed from the result GETSurveyToken is not successful place after /svap/survey/[token]
hope anyone can help ??
thanks
i try using : regular expression extractor, json extractor, dan using Preprocessor to get the parameter/variable
As per documentation:
Properties are not the same as variables. Variables are local to a thread; properties are common to all threads, and need to be referenced using the __P or __property function.
What Regular Expression Extractor gives to you is a JMeter Variable so in order to be able to use it in other thread in this or other thread group you need to convert it into a JMeter Property using __setProperty() function. Once done you can access the value using __P() function
If your logic is more complex, i.e. you need to "wait" in 2nd thread group until the token is available consider using Inter-Thread Communication Plugin
I have a series of interconnected pages to test using JMeter. The problem is that the initial page has a Javascript variable in source section which is more of a session variable. This variable is passed in the URL for subsequent pages.
So basically I would like to fetch this javascript variable when I load the initial page from the source section and pass it to next URL(s).
Is there a way I can achieve this using JMeter.
Are you able to see the session variable in the response of initial page?
(in view result tree listener)
If yes, then correlate this value and pass the variable in to next request (use regular expression extractor for fetching the value, still if you are finding some issue in correlating the value than please share the response of first request over here so that I can provide you regx for that)
People mostly Regular Expression Extractor to fetch dynamic values from previous responses, in general the process looks like:
Add Regular Expression Extractor as a child of the request which returns desired data
Use Perl5-style regular expression to match what you're looking for
Provide a template to choose match group - ususally $1$ if you looking for a single value
Provide a reference name to refer the extracted value, i.e. foo
Use extracted value as ${foo} where required
You can visualise JMeter Variables using Debug Sampler and View Results Tree listener combination.
The easiest way to debug your regular expressions is using View Results Tree listener in "RegExp Tester mode"
See How to debug your Apache JMeter script article for more information on troubleshooting your JMeter test.
I have created a Test Plan that has two thread groups. Each thread group has a SOAP/XML-RPC Request Sampler. Thread Group A also has a Regular Expression Extractor that contains:
Reference Name : ABC
Regular Expression :<response>([A-Z 0-9]+)</response>
Template: $1$
Moreover, Thread Group A has a BeanShellAssertion with
Name: Extract value
Script: ${__setProperty(ABC, ${ABC})};
What I want to do is modify the ABC variable and then pass it on the SOAP Sampler of the second Thread Group.
So, if ABC equals 1000 (response tag holds an int) I want to get that value divided it by two and then pass it on the second sampler like :
<abcValue>${__P(modifiedABC)}</abcValue>
Any ideas?
EDIT:
I have tried preProcessors(on the second thread group) and postProccessors (on the first thread group) but whatever I tried gave me back errors like:
ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``String value = Integer.toString(Integer.parseInt(72295) /2); props.put("modifiedABC", v . . . '' : Typed variable declaration : Error in method invocation: Static method parseInt( int ) not found in class'java.lang.Integer'
If your response contains anything other than A-Z, ' ', or 0-9, the regex extractor will fail. It may be better to set the match group to (.+), so it collects whatever is in the response and use a separate regex assertion to check the contents are what you expect. That way you will get a sample fail when the results are bad, rather than a subsequent fail, when your next sample is badly formed through bad input.
In the Thread Group A assertion, you need some "s..
${__setProperty("ABC", "${ABC}")}
This sets a property called ABC to the value of variable called ABC, which is what I think you intend.
Easy way to divide your value is with __javaScript() function..
${__javaScript(${ABC}/2)}
You can use this anywhere in jmeter and it will substitute the value you require. Make sure you have retrieved the property at the start of Thread Group B, as the variable (ABC) is in different scope.
Thread Group 1
Please use 'Beanshell Post Processor' for your request. Add this post processor under the sampler where you extract ABC.
Below link will you give you an idea.
http://jmeter.apache.org/usermanual/component_reference.html#BeanShell_PostProcessor
Note that by default everything is String in Jmeter. So you might want to convert it to an Integer before dividing it by 2. You have to add something like this in the Beanshell Post processor.
modifiedABC = Integer.toString(Integer.parseInt(props.get("ABC"))/2);
props.put("modifiedABC",modifiedABC);
Thread Group 2
Now you want to access the modifiedABC in the second thread group.
Simply access it using
${__P(modifiedABC)}
I have created a User Defined Variable with name as "Status" and a default value as "Started".
I got a HTML Response, with following content:
<SPAN id="ApplicationStatus"> Interrupted</SPAN>
I want to get the Span Id value and use in beanshell samplers to process further either in If Controller or Switch Controller.
I used Regular Expression extractor to extract the value needed and its working too.
But when i say vars.get("Status") will always return me the default value "Started".
Is there a way where i can extract the required value "Interrupted" and substitute that to the user defined variable "Status"?
Yes you can get that value of #ApplicationStatus into your User Defined Variable (UDV).
You can use regex but really you shouldn't for this type of parsing I'm not going to get into many reasons why.
Here is how you can do it using alternative (better solution IMHO) :
String html = "<SPAN id=\"ApplicationStatus\"> Interrupted</SPAN>";
Document doc = Jsoup.parse(html);
String value = doc.select("#ApplicationStatus").first().text();
//Put value in UDV Status
vars.put("Status", value);
You can add this to your sampler that does this kind of parsing i.e Beanshell sampler, here are the imports (which go above this code) :
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
Please note that this code is Jsoup dependent so you will need to download jsoup jar and put it in your $JMETER_HOME/lib directory.
Hope this sheds some light on your issue.
Update
If you want to avoid Java, I've written small jmeter post processor component that extracts text value from HTML element. Take a look at :
https://github.com/c0mrade/Html-Extractor
If you go over the steps how to install the post processor from the page above, you would use it as follows :
Right click on your sampler. Add a Post Processors -> Html Extractor , in the jquery selector field write #ApplicationStatus and store result in variable of your choice (Status). Following this add Debug Sampler, if in your Debug sampler there is variable Status with the value Html Extractor is working! you're done!
I can't reproduce your issue.
Here is my plan:
- User defined variables with variable Status
- Thread Group
- HTTP Request
- Regular expression extractor with reference name = Status
- Beanshell Sampler that logs Status variable
Beanshell sampler logs value that was received in Regular Expression Extractor