在Java中运行时,不允许在序言中获取内容

时间:2018-10-24 20:49:38

标签: jmeter

从Java(Jmeter 5.0)运行我的xxx.jmx文件时,我面临 序言中不允许内容

我在GUI模式下测试了jmx,一切正常,在Java中,我只是遵循调用jmx文件并执行它的标准方法。

jmx仅包含一些常规内容。发送HTTP请求并验证预期和接收的XML(我正在使用此代码片段进行验证):

import org.apache.commons.io.FileUtils

expect = FileUtils.readFileToString(new File('some_path'))

XmlParser parser = new XmlParser()

expectedXML = new XmlSlurper().parseText(expect) 

actualXML = new XmlSlurper().parseText(prev.getResponseDataAsString()) 

if (expectedXML != actualXML) {
    AssertionResult.setFailure(true)
    AssertionResult.setFailureMessage('Mismatch between expected and actual XML \n'+ prev.getResponseDataAsString())

和堆栈跟踪:

2018/10/24 15:18:03,386 12675 [ERROR ] [Thread Group 1-1] (JSR223Assertion.java:52) – Problem in JSR223 script: Validate resposne
javax.script.ScriptException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320)
    at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72)
    at javax.script.CompiledScript.eval(CompiledScript.java:92)
    at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:221)
    at org.apache.jmeter.assertions.JSR223Assertion.getResult(JSR223Assertion.java:49)
    at org.apache.jmeter.threads.JMeterThread.processAssertion(JMeterThread.java:901)
    at org.apache.jmeter.threads.JMeterThread.checkAssertions(JMeterThread.java:892)
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:565)
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:486)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:253)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at groovy.util.XmlSlurper.parse(XmlSlurper.java:207)
    at groovy.util.XmlSlurper.parse(XmlSlurper.java:260)
    at groovy.util.XmlSlurper.parseText(XmlSlurper.java:286)
    at groovy.util.XmlSlurper$parseText.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at Script1.run(Script1.groovy:9)
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:317)
    ... 10 more

更新1 : 使用 响应声明 的问题是它不能忽略空格或制表符。因此,如果在使用equal时格式不完全相同,则总是会失败。任何想法如何通过使用响应断言忽略这些事情?

更新2 : 我发现该问题与BOM表无关。因为如果我从Java应用程序运行jmx:

 prev.getResponseDataAsString()

以上功能始终返回:

${__FileToString(${inputFilePath},,)}

,但不是实际响应。此功能来自HTTP Request采样器的主体数据!如果我在其中提供了人工身体,那么我就可以运行jmx……任何想法如何处理这种动态身体数据?

1 个答案:

答案 0 :(得分:1)

您的“预期” XML文件可能包含BOM,可能会导致代码失败。

BOM基本上是前3个字节,因此您可以使用以下代码将其删除:

def expect = FileUtils.readFileToString(new File('some_path')).getBytes().flatten()

1.upto(3) {
    expect.remove(0)
}

XmlParser parser = new XmlParser()

def expectedXML = parser.parseText(new String(expect.toArray(new Byte[0])))

其余的代码应该可以正常工作。

查看The Groovy Templates Cheat Sheet for JMeter文章,以了解更多Groovy技巧和窍门。


还要了解到,在大多数情况下,使用Response Assertion更容易,或者在涉及XML-XPath Assertion时,在任何情况下Java代码的运行速度都比Groovy快。