在groovy脚本中运行groovy字符串作为不同的脚本

时间:2016-09-01 14:43:10

标签: xml groovy soapui

有一个项目要求,我试图将现有的SOAP UI测试套件移植到maven java项目中,测试与groovy断言一起编写的休息服务到一个groovy测试用例。

方法是使用 XmlSlurper 解析 SOAP UI项目xml 文件以获取请求以及其他所需的详细信息,以使用http客户端触发休息服务并从服务中接收响应,然后使用 已经嵌入SOAP UI套件中的groovy断言 ,以使用groovy脚本断言收到的响应。

这种方法的确定是因为已经有数千个用SOAP UI编写的测试用例,我们希望利用相同的功能,而不是在重写测试数据时付出额外的努力。

在解析xml时,我们可以轻松地将变量中的xml中的断言作为字符串或 GPathResult 更具体。

我无法弄清楚的是如何让'断言字符串'作为从我的服务收到的响应的'断言脚本'运行。

以下是我尝试的代码:

  

DemoTest.groovy

package somepackage.groovy

import groovyx.net.http.ContentType
import groovyx.net.http.RESTClient

class Demotest extends GroovyTestCase {

    void testFail() {
        def client = new RESTClient('http://localhost:8080')
        def xmlfile = new XmlSlurper().parse(new File('/path/to/soap-ui.xml'))
        def endpoint = (xmlfile.testSuite.testCase[0].testStep[0].config.@service)
        def resourcePath =(xmlfile.testSuite.testCase[0].testStep[0].config.@resourcePath)
        def request = (xmlfile.testSuite.testCase[0].testStep[0].config.restRequest.request).text()
        def assertion = (xmlfile.testSuite.testCase[0].testStep[0].config.restRequest.assertion).text()
        def bodyMap = new groovy.json.JsonSlurper().parseText(request)
        try {
            def resp = client.post(
                    path: resourcePath,
                    body: bodyMap,
                    requestContentType: ContentType.JSON
            )
            println( resp.data )
    //            def jsonSlurper = resp.data
            def asserts = assertion.substring(assertion.indexOf('assert').intValue())
            String script = asserts
    //                    .replaceAll('jsonSlurper','resp.data')
            GroovyScriptEngine gse = new GroovyScriptEngine()
            Binding binding = new Binding();
            binding.setVariable('jsonSlurper', resp.data )
            Object result = gse.run(script, binding)
            println( result )
        } catch (ex){
            println( ex.printStackTrace() )
        }
    }
}
  

Soap UI断言

//imports
import groovy.json.JsonSlurper
//grab the response
def ResponseMessage = messageExchange.response.responseContent
//define a JsonSlurper
def jsonSlurper = new JsonSlurper().parseText(ResponseMessage)
//asserts
assert jsonSlurper.someValue == expectedValue
assert jsonSlurper.someValue.someOtherValue == expectedOtherValue
assert jsonSlurper...

1 个答案:

答案 0 :(得分:0)

我认为对于您的情况,最好使用GroovyShell而不是GroovyScriptEngine,因为使用Strings运行脚本更容易。

假设您在def assertions变量中正确使用脚本断言,您可以使用以下代码运行脚本:

import groovy.json.JsonSlurper

...
...

def assertion = '''//imports
 import groovy.json.JsonSlurper
//grab the response
 def ResponseMessage = messageExchange.response.responseContent
//define a JsonSlurper
 def jsonSlurper = new JsonSlurper().parseText(ResponseMessage)
//asserts
assert jsonSlurper.field == 'value'
assert jsonSlurper.otherField == 'secondValue' '''

def script = assertion.substring(assertion.indexOf('//asserts').intValue())

Binding binding = new Binding(); 
def shell = new GroovyShell(binding)
binding.setProperty('jsonSlurper', new JsonSlurper().parseText('{"field":"value", "otherField" : "secondValue"}') )
shell.evaluate(script)

另请注意,我更改了您的substring条件以获取脚本的一部分;因为在问题中它与评论//asserts而不是assert直接匹配,并且它返回错误的脚本。所以我将条件更改为substring(//asserts)以获得正确的脚本。

此外,由于您没有显示您的断言如何,我假设样本只有一个简单的json,但在您的代码中,您必须更改它:

binding.setProperty('jsonSlurper', new JsonSlurper().parseText('{"field":"value", "otherField" : "secondValue"}') )

代替:

binding.setProperty('jsonSlurper', new JsonSlurper().parseText(resp.data) )

希望它有所帮助,