【问题标题】:How to pass a two dimensional list/array between groovy scripts in soap ui?如何在soap ui中的groovy脚本之间传递二维列表/数组?
【发布时间】:2017-11-09 08:04:50
【问题描述】:

问题陈述:我们需要一种方法将二维列表(或数组)从一个 groovy 脚本传递到其他脚本(以在其他脚本中断言来自多个 DB2 表的值)。

一些背景: 第 1 步:根据我们的输入 xml 有效负载,我们在二维列表 [][] 中捕获节点(和子元素)列表。 [完毕] 第 2 步:现在我们要使用此列表中的每个值来针对 DB2 表中的值进行断言 [也已完成,但是将第 1 步和第 2 步保持在同一个 groovy 脚本中]。

我们想要的是能够在 step2 中从 step1 传递二维列表。特别重要,因为我们有多个表,并且我们不想在一个大的 groovy 脚本中添加所有表步骤,或者在每个 Db2 验证脚本中复制 step1 代码。

我们阅读了关于在测试用例级别设置列表中的每个元素值,然后重新构建数组,但由于列表元素(以千计)的巨大(变化和)大小,我们犹豫使用该方法。问题是:是否有任何干净的方法来实现这一目标?

谢谢!

【问题讨论】:

    标签: arrays list soap multidimensional-array groovy


    【解决方案1】:

    您知道早期解决方案的局限性,只有在运行测试用例时才有效(在 groovy 脚本之间共享对象),而在运行单个步骤时无效。

    在这里,我想提供一种方法,通过使用 groovy 的元编程来解决这个问题。

    在脚本 1 中,有以下代码:

    import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase
    
    WsdlTestCase.metaClass.myList = [1,2,3,4,5]
    

    在脚本 2中,有以下代码:

    log.info "From script 2: ${context.testCase.myList}"
    assert [1,2,3,4,5] == context.testCase.myList
    

    即使运行单独的步骤,上述方法也有效。 希望这会有所帮助。

    编辑:了解用户需要重复更新列表并且使用 metaClass 用户无法更新列表。这是另一种选择:

    import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase
    WsdlTestCase.metaClass.myObject = new Expando(myList: [1,2,3,4,5])
    log.info "list initialized: ${context.testCase.myObject.myList}"
    WsdlTestCase.metaClass.myObject = new Expando(myList: [1,2,3,4,5,6,7])
    log.info "list updated: ${context.testCase.myObject.myList}"
    

    【讨论】:

    • 感谢@Rao 添加您的回复。这有帮助!
    • 请问您是在哪个版本的 SoapUI 中测试的?我试图在 5.4 中获得它,即使在 1 个脚本中它也不会覆盖该属性。我运行它,在这两种情况下都只打印 1-5 来登录。即使在 1 个脚本中,我也无法获得 1-7,而不是谈论在其他脚本中使用它(仅返回第一次写入)。此外,要清除属性的值,我必须重新启动 SoapUI,如果我分配空数组 [] 它也不起作用。
    • 可以在 4.5.x 上试用。但这不应该是我相信的真正问题。您能否提供示例项目以重现相同的内容?
    【解决方案2】:

    您可以使用context

    这是真正的工作Groovy Script 步骤。

    第一步:

    def array = ['Kyiv', 'Boryspil', 'Kharkiv', "L'Viv", "Odesa"]
    context.setProperty('cities', array)
    log.info( 'script1: '+array )
    

    第二步:

    def array = context.getProperty('cities')
    log.info( 'script2: '+array )
    assert array.size()>0
    

    注意:

    如果你只跑一步,那么绝对会有 独立的上下文。

    但是如果你运行整个测试用例,那么会有上下文共享 整个测试用例。

    您可以在测试用例窗口中使用Run from here 上下文菜单从确切的步骤运行。

    【讨论】:

    • 感谢您的回复,但是当在上下文中我们使用 context.testcase.setpropertyValue('Myarray',inputarray) 并尝试在另一个 groovy 脚本中使用 getpropertyvalue 调用它时,这不起作用。只能在相同的脚本中工作。您能否分享一个包含两个脚本设置和获取值的示例?谢谢!
    • 太棒了!这说明了。非常感谢您抽出宝贵时间帮助我解决这个问题。我昨天发现了另一种使用创建 StringToObject 映射的方法,但是您的方法更干净。我没有足够的分数来为您的回答竖起大拇指,但在这里我说“竖起大拇指”以寻求您的帮助:)。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多