从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……任何想法如何处理这种动态身体数据?
答案 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快。