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

时间:2015-05-22 06:29:28

标签: groovy soapui

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

  1. 有效的HTTP状态代码断言和
  2. XQuery Match Assertion
  3. 现在我需要使用groovyscript打印这些断言中包含的值。对于XQuery Assertion,我需要打印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: []
    

    请建议我在这里使用哪种方法..

    先谢谢。

1 个答案:

答案 0 :(得分:0)

使用getPath()方法获取断言的XQuery Expression。考虑到此方法特定于XQueryContainsAssertion类的断言,因此如果您在其他断言对象中调用,则会得到groovy.lang.MissingMethodException。还要考虑使用您的代码,将testCase中的每个testStep转换为RestTestRequestStepRestTestRequestStep 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
          }
        }
  }
}

希望这有帮助,