通过电子邮件发送JMeter断言结果时出现JSON解析错误

问题描述

在我的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并发送电子邮件。我该如何解决这个问题?

解决方法

您的脚本失败,因为您没有获得有效的JSON,正确的JSON对象以{[开头,而您得到的是j,请尝试使用类似{{ 3}},它将突出显示您的回复中所有有问题的地方

JSONLint,所以我相信您可以将Beanshell代码放入Since JMeter 3.1 you should not be using Beanshell,它无需更改即可工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...