Jmeter:如何使用 csv 文件中的字段名称构造 JSON 路径,以将来自 API 响应的数据与来自数据库的数据进行比较
Jmeter: how to construct JSON Path using field names from csv file to compare data from API response with data from DB
我有一个 API returns 以下回复:
{
"data": {
"response": {
"employee":
{
"firstName": "Frank",
"lastName": "Porter",
"employeeNumber": "11102"
}
}
}
}
在 JMeter 中,我需要执行以下操作:
- 查询数据库并从表中获取数据。将其存储在变量中以与 API 响应进行比较。
- 编写断言,将数据库中的数据与 API 响应进行比较。为此,我需要断言从 CSV 文件中读取要比较的字段名称。
我能够构建一个包含字段列表的 csv - firstName,lastName,employeeNumber
在我的断言中,我正在使用 JSONSlurper 解析 API 响应,然后尝试比较数据。
如果我对字段名称进行硬编码,则比较工作正常 - 所以像下面这样的工作正常:
import groovy.json.JsonSlurper;
def failureMessage = "";
def jsonResponse = null;
JsonSlurper JSON = new JsonSlurper ();
//compare data from db with API response
if (!jsonResponse.data.response.employee.firstName.equals(vars.getObject("datafromDB").get(0).get("firstName")))
{
failureMessage += "firstName does not match \n\n";
}
if (failureMessage?.trim()) {
AssertionResult.setFailureMessage(failureMessage);
AssertionResult.setFailure(true);
}
// Print error messages if any
if (failureMessage?.trim()) {
failureMessage += "URL: " + SampleResult.getURL() + "\n\n";
failureMessage += "JSON RESPONSE: " + jsonResponse + "\n\n";
AssertionResult.setFailureMessage(failureMessage);
AssertionResult.setFailure(true);
}
但我找不到使用 csv 文件中的字段名称的方法。我已经在下面尝试过,但它不起作用。
String[] basefields = vars.getObject("getEmployeeFields").split(',');
for(String t : basefields) {
log.info("validating "+t);
for (int i; i < vars.getObject("dataFromDB").size(); i++) {
if (!jsonResponse.data.GetClientById.t.equals(vars.getObject("datafromDB").get(0).get("t"))) //--this is where i need to construct the path using the value from csv. Field names are same between API response and DB. So, I am using t in both places
{
failureMessage += "Cli_no does not match \n\n";
}
}
谁能指导我如何实现这一点?我正在使用 groovy
的 JSR 223 断言
最简单的方法 - Eval.me
def jsonResponse = new JsonSlurper().parse(...)
def jpath = 'BODY.data.response.employee.firstName' // get it from where you want
assert Eval.me('BODY', jsonResponse, jpath)=='Frank'
试试这样的东西:
data.response.employee.get('t')
因为这些JSON Objects are translated to Groovy's LazyMap
更多信息:
我有一个 API returns 以下回复:
{
"data": {
"response": {
"employee":
{
"firstName": "Frank",
"lastName": "Porter",
"employeeNumber": "11102"
}
}
}
}
在 JMeter 中,我需要执行以下操作:
- 查询数据库并从表中获取数据。将其存储在变量中以与 API 响应进行比较。
- 编写断言,将数据库中的数据与 API 响应进行比较。为此,我需要断言从 CSV 文件中读取要比较的字段名称。
我能够构建一个包含字段列表的 csv - firstName,lastName,employeeNumber 在我的断言中,我正在使用 JSONSlurper 解析 API 响应,然后尝试比较数据。 如果我对字段名称进行硬编码,则比较工作正常 - 所以像下面这样的工作正常:
import groovy.json.JsonSlurper;
def failureMessage = "";
def jsonResponse = null;
JsonSlurper JSON = new JsonSlurper ();
//compare data from db with API response
if (!jsonResponse.data.response.employee.firstName.equals(vars.getObject("datafromDB").get(0).get("firstName")))
{
failureMessage += "firstName does not match \n\n";
}
if (failureMessage?.trim()) {
AssertionResult.setFailureMessage(failureMessage);
AssertionResult.setFailure(true);
}
// Print error messages if any
if (failureMessage?.trim()) {
failureMessage += "URL: " + SampleResult.getURL() + "\n\n";
failureMessage += "JSON RESPONSE: " + jsonResponse + "\n\n";
AssertionResult.setFailureMessage(failureMessage);
AssertionResult.setFailure(true);
}
但我找不到使用 csv 文件中的字段名称的方法。我已经在下面尝试过,但它不起作用。
String[] basefields = vars.getObject("getEmployeeFields").split(',');
for(String t : basefields) {
log.info("validating "+t);
for (int i; i < vars.getObject("dataFromDB").size(); i++) {
if (!jsonResponse.data.GetClientById.t.equals(vars.getObject("datafromDB").get(0).get("t"))) //--this is where i need to construct the path using the value from csv. Field names are same between API response and DB. So, I am using t in both places
{
failureMessage += "Cli_no does not match \n\n";
}
}
谁能指导我如何实现这一点?我正在使用 groovy
的 JSR 223 断言最简单的方法 - Eval.me
def jsonResponse = new JsonSlurper().parse(...)
def jpath = 'BODY.data.response.employee.firstName' // get it from where you want
assert Eval.me('BODY', jsonResponse, jpath)=='Frank'
试试这样的东西:
data.response.employee.get('t')
因为这些JSON Objects are translated to Groovy's LazyMap
更多信息: