运行 groovy 脚本中的 groovy 字符串作为不同的脚本
Run a groovy string in a groovy script as a different script
有一个项目要求,我试图将现有的 SOAP UI 测试套件测试与 groovy 断言一起编写的休息服务到 Maven 中的 groovy 测试用例java 项目。
方法是使用解析SOAP UI项目xml文件XmlSlurper 获取 请求 和其他所需的详细信息以触发 rest 服务 使用一个 http 客户端并从该服务接收一个 response,然后使用已经嵌入到 SOAP UI 中的 相同的 groovy 断言suites 断言使用 groovy 脚本收到的响应。
之所以决定采用这种方法,是因为已经有数以千计的用 SOAP 编写的测试用例 UI,我们希望利用相同的方法,而不是在重写测试数据上投入额外的精力。
在解析 xml 时,我们可以轻松地从变量 xml 中获取 assertions 作为字符串或 GPathResult 更具体。
我无法弄清楚的是如何在从我的服务收到的响应中将 'assertions string' 变成 运行 作为 'assert script'。
这是我尝试使用的代码:
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 assertions
//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...
我认为对于你的情况,最好使用 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
并且它 returns 是一个错误的脚本。所以我将条件更改为 substring(//asserts)
以获得正确的脚本。
此外,由于您没有显示您的断言如何,我假设示例是一个简单的 json
,但在您的代码中您必须更改此:
binding.setProperty('jsonSlurper', new JsonSlurper().parseText('{"field":"value", "otherField" : "secondValue"}') )
为此:
binding.setProperty('jsonSlurper', new JsonSlurper().parseText(resp.data) )
希望对您有所帮助,
有一个项目要求,我试图将现有的 SOAP UI 测试套件测试与 groovy 断言一起编写的休息服务到 Maven 中的 groovy 测试用例java 项目。
方法是使用解析SOAP UI项目xml文件XmlSlurper 获取 请求 和其他所需的详细信息以触发 rest 服务 使用一个 http 客户端并从该服务接收一个 response,然后使用已经嵌入到 SOAP UI 中的 相同的 groovy 断言suites 断言使用 groovy 脚本收到的响应。
之所以决定采用这种方法,是因为已经有数以千计的用 SOAP 编写的测试用例 UI,我们希望利用相同的方法,而不是在重写测试数据上投入额外的精力。
在解析 xml 时,我们可以轻松地从变量 xml 中获取 assertions 作为字符串或 GPathResult 更具体。
我无法弄清楚的是如何在从我的服务收到的响应中将 'assertions string' 变成 运行 作为 'assert script'。
这是我尝试使用的代码:
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 assertions
//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...
我认为对于你的情况,最好使用 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
并且它 returns 是一个错误的脚本。所以我将条件更改为 substring(//asserts)
以获得正确的脚本。
此外,由于您没有显示您的断言如何,我假设示例是一个简单的 json
,但在您的代码中您必须更改此:
binding.setProperty('jsonSlurper', new JsonSlurper().parseText('{"field":"value", "otherField" : "secondValue"}') )
为此:
binding.setProperty('jsonSlurper', new JsonSlurper().parseText(resp.data) )
希望对您有所帮助,