How to compare JSON data against DB data in JMeter - jmeter

I want to compare JSON response with DB data in JMeter. Below is Db table structure (Oracle database):
Table Structure
Below is the JSON
{
"page": 2,
"per_page": 6,
"total": 12,
"total_pages": 2,
"data": [
{
"id": 7,
"email": "michael.lawson#reqres.in",
"first_name": "Michael",
"last_name": "Lawson",
"avatar": "https://reqres.in/img/faces/7-image.jpg"
},
{
"id": 8,
"email": "lindsay.ferguson#reqres.in",
"first_name": "Lindsay",
"last_name": "Ferguson",
"avatar": "https://reqres.in/img/faces/8-image.jpg"
},
{
"id": 9,
"email": "tobias.funke#reqres.in",
"first_name": "Tobias",
"last_name": "Funke",
"avatar": "https://reqres.in/img/faces/9-image.jpg"
},
{
"id": 10,
"email": "byron.fields#reqres.in",
"first_name": "Byron",
"last_name": "Fields",
"avatar": "https://reqres.in/img/faces/10-image.jpg"
},
{
"id": 11,
"email": "george.edwards#reqres.in",
"first_name": "George",
"last_name": "Edwards",
"avatar": "https://reqres.in/img/faces/11-image.jpg"
},
{
"id": 12,
"email": "rachel.howell#reqres.in",
"first_name": "Rachel",
"last_name": "Howell",
"avatar": "https://reqres.in/img/faces/12-image.jpg"
}
],
"support": {
"url": "https://reqres.in/#support-heading",
"text": "To keep ReqRes free, contributions towards server costs are appreciated!"
}
}
Below is the configuration I have made in JMeter
JDBC Request
JSON Extractor
Response Assertion
But I am getting null response:
Assertion Result
what mistake am I making?
I want to compare each cell data with JSON data. For example ID=7 with JSON and ID=9 with JSON and so on.
Is this possible to do this with any scripting language in JMeter, if yes please suggest the code for the same.

There are multiple problems with your setup:
You need to change your SQL query to SELECT ID from HHDIXI.Data, otherwise you will get LAST_NAME entries in the ID variable
You need to change your JSONPath query to $..data[*].id and set "Match No" to -1 otherwise you will get only first ID into idfromAPI variable
Use Debug Sampler and View Results Tree listener combination to see what variables are being generated by the HTTP and JDBC request samplers.
If you want to compare each ID from API to each ID from the DB in one shot the only option is JSR223 Assertion
Example code:
1.upto(vars.get('ID_#') as int, { index ->
def expected = vars.get('ID_' + index)
def actual = vars.get('idfromAPI_' + index)
if (expected != actual) {
AssertionResult.setFailure(true)
AssertionResult.setFailureMessage('Data mismatch, in the database: ' + expected + ', in the API: ' + actual)
}
})
and demo:

Related

JMETER - response assertion -> Response was null

I have checked several options how to validate response and it still not works in my case.
As you can see (Debug sampler), for last_name regex works and I receive some values, but if I want to reuse this response as "Response assertion", test failed, because I receive "Response was null".
JSON Extractor for last_name
Response assertion
Test failed
Also, I would like to count objects in "data", so I used http://jsonpath.herokuapp.com/?path=$..book[0,1] to make sure, the JSON file is correct. But "Debug sampler" shows me nothing :( so test failed again
Count of objects
Result
Any idea how to solve this problem please ?
JSON:
{
"page": 2,
"per_page": 6,
"total": 12,
"total_pages": 2,
"data": [
{
"id": 7,
"email": "michael.lawson#reqres.in",
"first_name": "Michael",
"last_name": "Lawson",
"avatar": "https://reqres.in/img/faces/7-image.jpg"
},
{
"id": 8,
"email": "lindsay.ferguson#reqres.in",
"first_name": "Lindsay",
"last_name": "Ferguson",
"avatar": "https://reqres.in/img/faces/8-image.jpg"
},
{
"id": 9,
"email": "tobias.funke#reqres.in",
"first_name": "Tobias",
"last_name": "Funke",
"avatar": "https://reqres.in/img/faces/9-image.jpg"
},
{
"id": 10,
"email": "byron.fields#reqres.in",
"first_name": "Byron",
"last_name": "Fields",
"avatar": "https://reqres.in/img/faces/10-image.jpg"
},
{
"id": 11,
"email": "george.edwards#reqres.in",
"first_name": "George",
"last_name": "Edwards",
"avatar": "https://reqres.in/img/faces/11-image.jpg"
},
{
"id": 12,
"email": "rachel.howell#reqres.in",
"first_name": "Rachel",
"last_name": "Howell",
"avatar": "https://reqres.in/img/faces/12-image.jpg"
}
],
You need to tick Compute concatenation var in JSON Extractor, otherwise you will get 2 separate JMeter Variables:
lastName_1=Lawson
lastName_2=Ferguson
In addition to point 1 you need to use lastName_ALL in the Response Assertion
You need to switch from Matches to Substring in "Pattern Matching Rules" of the Response assertion
Demo:
More information: How to Use the JSON Extractor For Testing

django make a request based on the data received

opening a task by uuid
{
"id": 4,
"userInfo": 1,
"uuid": "5a722487",
"title": "Comparing numbers"
}
how to save the id and userinfo to pass to another request without specifying in the url /<'userInfo'>/<'id'> and get recommendations for the received task
[
{
"id": 16,
"userInfo": 1,
"uuid": "1e6a7182",
"title": "The opposite number"
},
{
"id": 11,
"userInfo": 1,
"uuid": "9de9f5d0",
"title": "Your order, please"
},
]
Concider using custom serializer for you objects

How to extract JSON values into string variable to validate for mandatory fields using beanshell assertion

I have written below script in Beanshell assertion to validate some specific value:
import org.json.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
String jsonString = prev.getResponseDataAsString();
JSONObject responseJson = new JSONObject(jsonString);
String lastName = responseJson.getString("$data[0]."{last_name}"");
String Message= "";
if (lastName== "lawson")
{
Failure= false;
Message= Message+"Correct value";
FailureMessage= Message;
}
else if (lastName != "lawson")
{
Failure= true;
Message= Message+"Incorrect value"+lastName;
FailureMessage= Message;
}
Below is the Json:
{
"per_page": 6,
"total": 12,
"data": [
{
"last_name": "Lawson",
"id": 7,
"avatar": "https://reqres.in/img/faces/7-image.jpg",
"first_name": "Michael",
"email": "michael.lawson#reqres.in"
},
{
"last_name": "Ferguson",
"id": 8,
"avatar": "https://reqres.in/img/faces/8-image.jpg",
"first_name": "Lindsay",
"email": "lindsay.ferguson#reqres.in"
},
{
"last_name": "Funke",
"id": 9,
"avatar": "https://reqres.in/img/faces/9-image.jpg",
"first_name": "Tobias",
"email": "tobias.funke#reqres.in"
},
{
"last_name": "Fields",
"id": 10,
"avatar": "https://reqres.in/img/faces/10-image.jpg",
"first_name": "Byron",
"email": "byron.fields#reqres.in"
},
{
"last_name": "Edwards",
"id": 11,
"avatar": "https://reqres.in/img/faces/11-image.jpg",
"first_name": "George",
"email": "george.edwards#reqres.in"
},
{
"last_name": "Howell",
"id": 12,
"avatar": "https://reqres.in/img/faces/12-image.jpg",
"first_name": "Rachel",
"email": "rachel.howell#reqres.in"
}
],
"page": 2,
"total_pages": 2,
"support": {
"text": "To keep ReqRes free, contributions towards server costs are appreciated!",
"url": "https://reqres.in/#support-heading"
}
}
But I am getting below error:
Assertion failure message:org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval In file: inline evaluation of: ``import org.json.*; import org.json.JSONArray; import org.json.JSONException; imp . . . '' Encountered "( "$data[0]." { last_name } """ at line 9, column 41.
Can someone please help me what mistake I am making in my script?
There are multiple problems with your code like:
I don't think JSONObject.getString() accepts JsonPath, it accepts JSON Object key name only
You should be comparing strings using equals() function
Strings are case sensitive, lawson and Lawson are different entities
Since JMeter 3.1 you should be using JSR223 Test Elements and Groovy language for scripting
So if you want to continue with code-based approach minimal equivalent code for the JSR223 Assertion would be something like:
def responseJson = new groovy.json.JsonSlurper().parse(prev.getResponseData())
def lastName = responseJson.data[0].last_name
if (lastName != 'Lawson') {
AssertionResult.setFailure(true)
AssertionResult.setFailureMessage("Incorrect value" + lastName)
}
Be informed that you can achieve the same using JSON Assertion:

How to extract multiple json values from a Json response

I am trying to extract multiple values from a JSON response on my jmeter script. Below is sample of my response:
{
"startDate": "2018-12-10T15:36:34.400+0000",
"userId": "7211111-2fa90",
"createdBy": "TEST",
"note": {
"content": "Application Submitted "
},
"Type": "SUBMITTED"
},
"currentEventState": "CLOSED",
{
"Xxxx": "test",
"Loc": null,
"Zipcode": [],
"Locality": 82,
"Address": {
"Add": 12302,
"Add2": "place",
"Zip": {
"Phone": "home",
"Email": "test#test.com"
}
},
"state": "MD",
"Cost": "E "
},
"AppID": "cd8d98e6-c2a79",
"Status": "CLOSED",
}
I am trying to extract userid and AppID for the case if the TYPE is Submitted and Status is Closed.I tried using the Json extractor with $.[?(#.Type=="SUBMITTED")].[*].?(#.Status=="CLOSED").userid,APPID, but couldn't get the expected result. Could anyone guide me on this.
You need to use an inline predicate to combine 2 clausees and a semicolon in order to store results into 2 separate JMeter Variables.
Add JSON Extractor as a child of the request which returns above JSON
Configure it as follows:
Names of created variables: userid;appid
JSON Path Expressions: $..[?(#.Type=='SUBMITTED' && #.Status == 'CLOSED')].userId; $..[?(#.Type=='SUBMITTED' && #.Status == 'CLOSED')].AppID
Default values: NA;NA
Here is the demo of single expression working fine:
And here are extracted values reported by the Debug Sampler:

Jmeter : How to extract first element from json array

I am trying to extract first element from a json array. Below mentioned is json array
[
{
"cohortDefinition": {
"Key": 1151,
"id": 1798,
"srcId": "3526",
"pcKey": -1,
"userName": "CHROME_USER",
"name": "JMeter2017-01-06-1483749546167",
"Type": "SUBJECT",
"tool": "CB",
"count": 32757,
"extractionStatus": "",
"dateCreated": "2017-05-10T17:48:45Z"
},
"datasource": {
"id": 2,
"name": "health",
"subjectCount": 116352
},
"project": {
"id": 747,
"name": "Jmeter Project"
}
},
{
"cohortDefinition": {
"Key": 1150,
"id": 1796,
"srcId": "3525",
"pcKey": -1,
"userName": "CHROME_USER",
"name": "JMeter2016-10-27-1477620919644",
"Type": "SUBJECT",
"tool": "CB",
"count": 32757,
"extractionStatus": "",
"dateCreated": "2017-05-10T16:57:11Z"
},
"datasource": {
"id": 2,
"name": "health",
"subjectCount": 116352
},
"project": {
"id": 747,
"name": "Jmeter Project"
}
}
]
From above json i would like to extract first value ie. srcId": "3526".
I tried doing following expression in Jmeter extractor
$..cohortDefinition.srcId[1]
However it is not working. If anyone know how to do this please do let me know.
After JMeter 3.0, you can use JSON Extractor, see:
https://stackoverflow.com/a/47043204/460802
Before JMeter 3.0:
Please follow the below steps to retrieve srcId.
Add a JSON Path Extractor to your request and configure below values.
Destination Variable Name - myVar
JSON Path Expression - $..cohortDefinition.srcId - this will extract all the srcIDs from the JSON.
Default Value - Not Found or Err
Add a Debug Sampler and View Results Tree to your test plan.
Save it and execute.
In Debug Sampler, you can view all the srcId as shown below.
You can now use myVar_1 and myVar_2 in your test plan
using ${myVar_1} ${myVar_2}
No need for Plugin, JMeter has a JSON Extractor that will provide this feature:
Notice:
JSON Path Expression is: $..cohortDefinition.srcId
Match No : 1

Resources