如何使用 groovy 脚本获取 xquery 断言值
How to get xquery assertion value using groovy script
我在 SOAPUI 工具中创建了一个带有两个断言的测试步骤,即
- 有效的 HTTP 状态代码断言和
- XQuery 匹配断言
现在我需要使用 groovyscript 打印这些断言中包含的值。对于 XQuery 断言,我需要打印 xquery 表达式。我尝试使用 getToken() 方法。
下面是我的代码
for(int k=0;k<tc.getTestStepCount();k++)
{
RestTestRequestStep rr= tc.getTestStepAt(k);
RestTestRequest rrprop=rr.getTestRequest();
int astcount=rr.getAssertionCount();
for(int z=0;z<astcount;z++)
{
WsdlMessageAssertion tassert=rr.getAssertionAt(z);
String assertname=tassert.getName();
log.info "Assertion Name= "+assertname
String assertvalue=rr.getAssertionAt(z).getToken();
log.info "Assertion Value= "+assertvalue
}
}
但它抛出以下错误。
Fri May 22 11:11:58 IST 2015:INFO:groovy.lang.MissingMethodException: No signature of method: com.eviware.soapui.impl.wsdl.teststeps.assertions.basic.XQueryContainsAssertion.getToken() is applicable for argument types: () values: []
请建议我这里应该使用哪种方法..
提前致谢。
使用 getPath()
方法在您的断言中获取 XQuery Expression
。考虑到此方法特定于 XQueryContainsAssertion
class 的断言,因此如果您在其他断言对象中调用,您将获得 groovy.lang.MissingMethodException
。还请考虑使用您的代码将 testCase 中的每个 testStep 转换为 RestTestRequestStep
(RestTestRequestStep rr= tc.getTestStepAt(k);
) 并且 groovy testStep
本身是 testCase 的一部分并且不能转换为这种类型,因此最好对对象使用 def
以避免转换错误。
考虑到您只想将代码应用于此类断言,因此考虑到所有这些因素,您可以拥有如下内容:
import com.eviware.soapui.impl.wsdl.teststeps.assertions.basic.XQueryContainsAssertion
def tc = testRunner.testCase
for(int k=0;k<tc.getTestStepCount();k++)
{
def rr= tc.getTestStepAt(k)
// check that the testStep really contains assertions (it's not a groovy TestStep for example)
if(rr.metaClass.respondsTo(rr,"getAssertionCount")){
int astcount=rr.getAssertionCount()
for(int z=0;z<astcount;z++)
{
def tassert=rr.getAssertionAt(z)
String assertname=tassert.getName()
log.info "Assertion Name= "+assertname
// check the assert it's a XqueryContainsAssertion
if(tassert instanceof XQueryContainsAssertion){
String assertvalue=tassert.getPath()
log.info "Assertion Value= "+assertvalue
}
}
}
}
根据评论进行编辑
如果你还想得到 http status codes
你可以在你的 ValidHttpStatusCodesAssertion
类型的断言中使用 属性 codes
,我修改了之前的代码以接受考虑两种类型的断言:
import com.eviware.soapui.impl.wsdl.teststeps.assertions.basic.XQueryContainsAssertion
import com.eviware.soapui.security.assertion.ValidHttpStatusCodesAssertion
def tc = testRunner.testCase
for(int k=0;k<tc.getTestStepCount();k++)
{
def rr= tc.getTestStepAt(k)
// check that the testStep really contains assertions (it's not a groovy TestStep for example)
if(rr.metaClass.respondsTo(rr,"getAssertionCount")){
int astcount=rr.getAssertionCount()
for(int z=0;z<astcount;z++)
{
def tassert=rr.getAssertionAt(z)
String assertname=tassert.getName()
log.info "Assertion Name= "+assertname
// check the assert it's a XqueryContainsAssertion
if(tassert instanceof XQueryContainsAssertion){
String assertvalue=tassert.getPath()
log.info "Assertion Value= "+assertvalue
}else if(tassert instanceof ValidHttpStatusCodesAssertion){
String assertvalue=tassert.codes
log.info "Http status codes= "+assertvalue
}
}
}
}
希望这对您有所帮助,
我在 SOAPUI 工具中创建了一个带有两个断言的测试步骤,即
- 有效的 HTTP 状态代码断言和
- XQuery 匹配断言
现在我需要使用 groovyscript 打印这些断言中包含的值。对于 XQuery 断言,我需要打印 xquery 表达式。我尝试使用 getToken() 方法。
下面是我的代码
for(int k=0;k<tc.getTestStepCount();k++)
{
RestTestRequestStep rr= tc.getTestStepAt(k);
RestTestRequest rrprop=rr.getTestRequest();
int astcount=rr.getAssertionCount();
for(int z=0;z<astcount;z++)
{
WsdlMessageAssertion tassert=rr.getAssertionAt(z);
String assertname=tassert.getName();
log.info "Assertion Name= "+assertname
String assertvalue=rr.getAssertionAt(z).getToken();
log.info "Assertion Value= "+assertvalue
}
}
但它抛出以下错误。
Fri May 22 11:11:58 IST 2015:INFO:groovy.lang.MissingMethodException: No signature of method: com.eviware.soapui.impl.wsdl.teststeps.assertions.basic.XQueryContainsAssertion.getToken() is applicable for argument types: () values: []
请建议我这里应该使用哪种方法..
提前致谢。
使用 getPath()
方法在您的断言中获取 XQuery Expression
。考虑到此方法特定于 XQueryContainsAssertion
class 的断言,因此如果您在其他断言对象中调用,您将获得 groovy.lang.MissingMethodException
。还请考虑使用您的代码将 testCase 中的每个 testStep 转换为 RestTestRequestStep
(RestTestRequestStep rr= tc.getTestStepAt(k);
) 并且 groovy testStep
本身是 testCase 的一部分并且不能转换为这种类型,因此最好对对象使用 def
以避免转换错误。
考虑到您只想将代码应用于此类断言,因此考虑到所有这些因素,您可以拥有如下内容:
import com.eviware.soapui.impl.wsdl.teststeps.assertions.basic.XQueryContainsAssertion
def tc = testRunner.testCase
for(int k=0;k<tc.getTestStepCount();k++)
{
def rr= tc.getTestStepAt(k)
// check that the testStep really contains assertions (it's not a groovy TestStep for example)
if(rr.metaClass.respondsTo(rr,"getAssertionCount")){
int astcount=rr.getAssertionCount()
for(int z=0;z<astcount;z++)
{
def tassert=rr.getAssertionAt(z)
String assertname=tassert.getName()
log.info "Assertion Name= "+assertname
// check the assert it's a XqueryContainsAssertion
if(tassert instanceof XQueryContainsAssertion){
String assertvalue=tassert.getPath()
log.info "Assertion Value= "+assertvalue
}
}
}
}
根据评论进行编辑
如果你还想得到 http status codes
你可以在你的 ValidHttpStatusCodesAssertion
类型的断言中使用 属性 codes
,我修改了之前的代码以接受考虑两种类型的断言:
import com.eviware.soapui.impl.wsdl.teststeps.assertions.basic.XQueryContainsAssertion
import com.eviware.soapui.security.assertion.ValidHttpStatusCodesAssertion
def tc = testRunner.testCase
for(int k=0;k<tc.getTestStepCount();k++)
{
def rr= tc.getTestStepAt(k)
// check that the testStep really contains assertions (it's not a groovy TestStep for example)
if(rr.metaClass.respondsTo(rr,"getAssertionCount")){
int astcount=rr.getAssertionCount()
for(int z=0;z<astcount;z++)
{
def tassert=rr.getAssertionAt(z)
String assertname=tassert.getName()
log.info "Assertion Name= "+assertname
// check the assert it's a XqueryContainsAssertion
if(tassert instanceof XQueryContainsAssertion){
String assertvalue=tassert.getPath()
log.info "Assertion Value= "+assertvalue
}else if(tassert instanceof ValidHttpStatusCodesAssertion){
String assertvalue=tassert.codes
log.info "Http status codes= "+assertvalue
}
}
}
}
希望这对您有所帮助,