How to use csv to provide different values for json assertion for different inputs in Jmeter? - json

I am relatively new to API Testing.
Currently I have a setup where I am having different request jsons and for each request json there is different repsonse json assertion configuration provided with the appropriate values in Jmeter.
Since my json structure will be same and only the input values will be different, I am thinking to generalize the input values using csv and keep only one request configuration.
But would I be able to provide different values(like jsonpath and expected value) to one response json assertion configuration using csv? Because the jsonpath and expected value both will depend upon the input provided and it can have major difference as per the case.
If yes, then how to do it please let me know.
Also if I can achieve my use case using other free API Testing Tool like Postman then also let me know.

You can normally parameterize any JMeter Test Element using CSV Data Set Config
For example you have the following response:
{ "name":"John" }
And the following CSV file:
$.name,John
$.name,Jane
Add CSV Data Set Config to your Test Plan and configure it like:
Add JSON Assertion as a child of the request which returns the above JSON and configure it like:
That's it, each virtual user and/or iteration will pick up the next line from the CSV file and the ${jsonPath} and ${name} placeholders will be replaced with their respective values:
as you can see, the first request passed because name matched John and the second failed because the assertion expected name to be Jane and got John

Related

I am trying to assert if two strings of a response are same or not using response assertion in jmeter but it's showing an error

In response assertion I have given field to test as text response and pattern matching as contains
Pattern to test is
${bookmark_ALL}${value}=${value}${other_bookmark_ALL}
I have taken those bookmark values using json extractor given match -1 for it as well, both bookmark values are in string format
If you want to compare 2 JMeter Variables using Response Assertion the correct setup would be something like:
You can check JMeter Variables values using Debug Sampler
Also contains mode assumes regular expression, most probably you were looking for substring
More information: How to Use JMeter Assertions in Three Easy Steps

Jmeter JSR223 Assertion - How to compare fieldnames and values from csv with API response data

I am very new to Jmeter and was hoping to get some direction on how to achieve this task.
I am supposed to write a Jmeter which does following:
Read test data from csv file and calls a GraphQL API using the test data
Compares response from the API with values from the CSV file.
I have achieved #1 using CSV Data Set Config. But really need help with #2.
My csv file has following format:
fieldname 1,fieldname 2, fieldname 3
value1,value2, value3
I can have multiple csv files to compare the results with. I want to use JSR223 assertion to dynamically check fieldnames from csv and compare value for that fieldname with value returned in API response. fieldname in API response will be same as fieldname in the csv.
So, if I can write a generic code that picks fieldname from csv and then compares its value with fieldname from API response, it will work as long as fieldnames are set properly in the csv file.
Can anyone point me to a sample code that does this or Guide me on how to approach this.
Any help will be much appreciated.
We cannot give you the "sample" code because your question doesn't have any API response details.
So far I can only provide the following "samples"
CSV file can be read in Groovy into an array of lines like:
new File('/path/to/your/csv/file').readLines()
JavaDoc: File.readLines()
API response can be obtained within the JSR223 assertion as follows:
prev.getResponseDataAsString()
JavaDoc: SampleResult.getResponseDataAsString()
You may find Scripting JMeter Assertions in Groovy - A Tutorial article useful.

Jmeter : I am using Json extractor to pass value from the Json response but I am not seeing the value in the debug sampler

I am trying to pass the values of the basketId and basketItemId from the Create Basket Json response to Jmeter variable so that I can use these values in the next requests. I set up everything according to the documentation, however I am not able to see the values in the debug sampler in the Tree - Response Data area. Any help is appreciated?
You're not seeing your values because your sampler hasn't been executed
It has not been executed because you need to provide the same number of the "Default Values" as the variables you declared. If you look at jmeter.log file you will see something like:
Mismatch between number of variables, json expressions and default values
The solution would be adding the default values like:
null;null
And assuming your Json Path expression matches something in the response you will see both values.
More information: API Testing With JMeter and the JSON Extractor

How do I parse a JSON from Azure Blob Storage file in Logic App?

I have a JSON file in Azure Blob storage that I need to parse and insert rows into SQL using the Logic App.
I am using the "Get Blob Content" and my first attempt was to then pass to "Parse JSON". It returns and error": InvalidTemplate. Unable to process template language expressions in action 'Parse_JSON' inputs at line '1' and column '2856'"
I found some discussion that indicated that the content needs to be converted to a string so I used "Compose" and edited the code as suggested to
"inputs": "#base64ToString(body('Get_blob_content').$content)"
This works but then the InvalidTemplate issue gets pushed to the Parse function and I get the InvalidTemplate error there. I have tried wrapping the output in JSON expression and a few other things but I just can't get it to parse.
If I take a sample or even the entire JSON and put it into the INPUT of the Parse function it works without issue but it will not accept the blob content as JSON.
The only thing I have been able to do successfully from blob content is to take it as a string and update a row in SQL to later use the OPENJSON in SQL...but I run into an issue there that is for another post.
I am at a loss of what to do.
You don't post much information about your logic app actions, so maybe you could refer to my flow design. I test with a json data with array.
The below is my flow picture. I'm not using compose action, and use decodeBase64(body('Get_blob_content')['$content']) as the Parse Json content.
And if select property from the json, you need set the array index. I set a variable to get a value 'body('Parse_JSON')1['name']'.
you could have a try with this, if still fail, please provide more information or some sample to let us have a test.

Verify whole json response in jmeter by value or sort Json

I'm not using JMeter too often, and I've run into very specific issue.
My REST response is always "the same", but nodes are not in the same order due to various reasons. As well, I can't put here whole response due to sensitive data, but let's use these dummy one:
First time response might be:
{
"properties":{
"prop1":false,
"prop2":false,
"prop3":165,
"prop4":"Audi",
"prop5":true,
"prop6":true,
"prop7":false,
"prop8":"1",
"prop9":"2.0",
"prop10":0
}
}
Then other time it might be like this:
{
"properties":{
"prop2":false,
"prop1":false,
"prop10":0,
"prop3":165,
"prop7":false,
"prop5":true,
"prop6":true,
"prop8":"1",
"prop9":"2.0",
"prop4":"Audi"
}
}
As you can see, the content it self is the same, but order of nodes it's not. I have 160+ nodes and thousand of possible response orders.
Is there an easy way to compare two JSON responses comparing matching key - values, or at least to sort the response, and then compare it with sorted one in assertion patterns?
I'm not using any plugins, just basic Apache JMeter.
Thanks
I've checked using Jython, you need to download the Jython Library and save to your jmeter lib directory.
I've checked 2 JSONs with Sampler1 and Sampler2, on Sampler1 I've add a BeanShell PostProcessor with this code:
vars.put("jsonSampler1",prev.getResponseDataAsString());
On Sampler2 I've add a BSF Assertion, specifying jython as the language and with the following code:
import json
jsonSampler1 = vars.get("jsonSampler1")
jsonSampler2 = prev.getResponseDataAsString()
objectSampler1 = json.loads(jsonSampler1)
objectSampler2 = json.loads(jsonSampler2)
if ( objectSampler1 != objectSampler2 ):
AssertionResult.setFailure(True)
AssertionResult.setFailureMessage("JSON data didn't match")
Yoy can find the whole jmx in this GistHub
You will most probably have to do this with a JSR223 Assertion and Groovy.
http://jmeter.apache.org/usermanual/component_reference.html#JSR223_Assertion
http://docs.groovy-lang.org/latest/html/api/groovy/json/JsonSlurper.html
Note that if you know Python, you might look at using Jython + JSR223.
I would just set up 10 jp#gc - JSON Path Assertions. Documentation for figuring out JSON Path format is here and you can test how it would work here.
For your example you would the assertion (Add > Assertion > jp#gc - JSON Path Assertions), then to test the prop 1 put:
$.properties.prop1
in the JSON Path field, click the Validate Against Expected Value checkbox, and put
false
in the expected value field. Repeat those steps for the other 9 changing the last part of the path to each key and the value you expected back in the expected value field.
This extractor is jmeter add on found here.