如何使用 groovy 脚本获取 xquery 断言值

How to get xquery assertion value using groovy script

我在 SOAPUI 工具中创建了一个带有两个断言的测试步骤,即

  1. 有效的 HTTP 状态代码断言和
  2. 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
          }
        }
  }
}

希望这对您有所帮助,