无法用jmeter运行groovy脚本

时间:2017-05-15 15:48:50

标签: groovy jmeter

我断言回复的代码:

import groovy.json.JsonSlurper

sleep(5000)
def ResponseMessage = messageExchange.response.responseContent
def jsonString = new JsonSlurper().parseText(ResponseMessage)


assert !(jsonString.isEmpty())
assert jsonString.code == 200

Jmeter的错误:

> 2017/05/15 21:37:20 ERROR - jmeter.timers.JSR223Timer: Problem in
> JSR223 script JSR223 Timer javax.script.ScriptException:
> javax.script.ScriptException: groovy.lang.MissingPropertyException: No
> such property: messageExchange for class: Script19    at
> org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:155)
>   at javax.script.AbstractScriptEngine.eval(Unknown Source)   at
> org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:220)
>   at org.apache.jmeter.timers.JSR223Timer.delay(JSR223Timer.java:42)
>   at
> org.apache.jmeter.threads.JMeterThread.delay(JMeterThread.java:806)
>   at
> org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:458)
>   at
> org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:418)
>   at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:249)
>   at java.lang.Thread.run(Unknown Source) Caused by:
> javax.script.ScriptException: groovy.lang.MissingPropertyException: No
> such property: messageExchange for class: Script19    at
> org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:346)
>   at
> org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:152)
>   ... 8 more Caused by: groovy.lang.MissingPropertyException: No such
> property: messageExchange for class: Script19     at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
>   at
> org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:52)
>   at
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307)
>   at Script19.run(Script19.groovy:5)  at
> org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:343)
>   ... 9 more

我已经为常规支持导入了必需品罐,但仍然有关于messageExchange的错误。

3 个答案:

答案 0 :(得分:2)

Soap UI和JMeter在任何方面都不兼容。 Soap UI有一个名为import React from 'react'; import ReactDOM from 'react-dom'; import ReactSoundcloud from 'react-soundcloud-embed'; import ArtistList from '../../data/artistlist.jsx'; let artistlist2017 = ArtistList.data; // Artist Section class Artists extends React.Component{ render(){ var artistPrint = artistlist2017.map(function(artist, index){ return ( <div className="each_artist" key={index}> <img src={artist.src} alt="" /> <h1>{artist.name}</h1> <h3>{artist.description}</h3> <ReactSoundcloud url={"https://soundcloud.com/icebound/dusty-breaks-at-the-bottom-of-the-random-crates"}/> </div> ); }); return ( <div> <div className="artist_block"> <div> <div className="rotate_left_header"> <h2> 2017 Featured Artists </h2> </div> <div className="artists">{artistPrint}</div> </div> </div> </div> ); } }; export default Artists; 的内置对象,JMeter没有。从MessageExchange定义来看,它们似乎在讨论之前的请求结果。所以我的猜测是JMeter中的等价物是一个名为messageExchange的对象。

prev

您还应该将Groovy后处理器用于要从中获取结果的对象,而现在看起来您正在使用计时器。

答案 1 :(得分:1)

您是否可能将JMeter与SOAPUI混淆?

由于您没有在脚本中的任何位置定义messageExchange,因此调用脚本的人应该设置它。情况并非如此,因此出现错误消息。据我记得,SOAPUI设置了messageExchange属性,JMeter显然没有。

答案 2 :(得分:1)

我认为你不需要在这种情况下使用Groovy,可以通过JSON Path Assertion来处理这种情况

所以你可以通过添加JSON Path Assertion作为你请求的子节点并一如既往地配置它来杀死两只鸟:

  • JSON路径:$.code
  • 检查Validate against expected value
  • 200放入&#34;期望值&#34;输入字段

    JMeter JSON Path Assertion[2]

您可以使用JMeter Plugins Manager安装JSON Path Assertion,查找&#34; JSON插件&#34;在&#34;可用插件&#34;标签

JMeter Plugins Manager - JSON Plugin

如果您仍需要在Groovy中执行此操作,获取父样本响应数据的正确方法是:

  1. 切换到JSR223 Assertion而非JSR223定时器,因为定时器在之前执行,因此您无法从中获取当前的采样器结果
  2. 使用以下代码将响应数据作为JSON获取并验证code属性值:

    def ResponseMessage = SampleResult.getResponseData()
    def jsonString = new groovy.json.JsonSlurper().parse(ResponseMessage)
    
    if (!jsonString.code.equals("200")) {
        AssertionResult.setFailure(true)
        AssertionResult.setFailureMessage("Response code was: " + jsonString.code)
    }