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 中,我需要执行以下操作:

  1. 查询数据库并从表中获取数据。将其存储在变量中以与 API 响应进行比较。
  2. 编写断言,将数据库中的数据与 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

更多信息: