0

在我的 JMeter 测试计划中,我在下面添加了 JSR223 断言来格式化 JSON 响应。

import groovy.json.JsonSlurper;

def failureMessage = "";
def jsonResponse = null;
def headers = null;
def responseTime = null;

JsonSlurper JSON = new JsonSlurper();
prev.setResponseData(groovy.json.JsonOutput.prettyPrint(prev.getResponseDataAsString()))

try {
    jsonResponse = JSON.parseText(prev.getResponseDataAsString());
    log.info("Wards response: "+jsonResponse);
    headers = SampleResult.getRequestHeaders();
    responseTime = SampleResult.getTime();
   
} catch (Exception e) {
    failureMessage += "Invalid JSON.\n"
}
if (!"200".equals(prev.getResponseCode())) {
    failureMessage += "Expected <response code> [200] but we got instead [" + prev.getResponseCode() + "]\n\n";
}
if (!"OK".equals(prev.getResponseMessage())) {
    failureMessage += "Expected <response Message> [OK] but we got instead [" + prev.getResponseMessage() + "]\n\n";
}

if (!jsonResponse.keySet().containsAll(["wards"])) {
    failureMessage += "The json config element has wrong structure. No wards key\n\n";
}
if (!jsonResponse.wards.getAt(0).keySet().containsAll(["id","name","shortName"])) {
    failureMessage += "The wards element has wrong structure. Key(s) are missing or wrong \n\n";
}

if (!jsonResponse.wards.size==95) {
    failureMessage += "Wards count is wrong..! :[" + jsonResponse.wards.size + "]\n\n";
}
if (!(headers.contains("ticketheader") && headers.contains("Content-Type") && headers.contains("Host") && headers.contains("User-Agent"))) {
    failureMessage += "Headers are not correct..!";
}

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";
    failureMessage += "REQUEST HEADERS: " + SampleResult.getRequestHeaders() + "\n\n";

    AssertionResult.setFailureMessage(failureMessage);
    AssertionResult.setFailure(true);
}

然后我在 Beanshell 脚本下面添加了完整的电子邮件正文以获取断言测试结果。

import org.apache.jmeter.assertions.AssertionResult;

AssertionResult[] results = prev.getAssertionResults();
StringBuilder body = new StringBuilder();
for (AssertionResult result : results) {
    body.append(result.getFailureMessage());
    body.append(System.getProperty("line.separator"));
}
vars.put("body", body.toString());

但是在结果电子邮件中,我遇到了错误。

*javax.script.ScriptException: groovy.json.JsonException: Lexing failed on line: 1, column: 1, while reading 'j', no possible valid JSON value or punctuation could be recognized.*

在我的测试计划中,我需要使用这两个脚本来格式化 JSON 并发送电子邮件。我该如何解决这个问题?

4

1 回答 1

0

您的脚本失败,因为您没有获得有效的 JSON,正确的 JSON 对象以{or开头[并且您正在获得j,尝试使用JSONLint 之类的服务,该服务将突出显示响应中所有有问题的地方

从 JMeter 3.1 开始,您不应该使用 Beanshell,因此我相信您可以将 Beanshell 代码放入JSR223 Assertion,它无需更改即可工作。

于 2020-10-12T10:37:37.260 回答