【问题标题】:Return a value from a SoapUI TestCase从 SoapUI 测试用例返回一个值
【发布时间】:2015-03-24 05:01:32
【问题描述】:

我正在尝试模块化我的测试用例,因此我正在运行一个共享测试用例(作为一个过程),它会做一些有用的事情并返回一个结果值。由于我需要传入非字符串输入属性,我必须从 groovy 运行测试用例:

def findLoopEndTC = testRunner.testCase.testSuite.testCases["TestCase - Find Loop End"]
assert findLoopEndTC != null, "Referred TC not found"

def runContext = new com.eviware.soapui.support.types.StringToObjectMap()
runContext.put("TestStepContext", context)
def runner = findLoopEndTC.run( runContext, false )
assert runner.status != com.eviware.soapui.model.testsuite.TestRunner.Status.FAILED : runner.reason

我了解到测试用例是使用 SINGLETON_AND_WAIT 模式运行的,该模式可确保 TestCase 本身以线程安全的方式运行。 我的问题是如何以线程安全的方式从运行测试用例返回值

我试过runner.getRunContext().getProperty("Result"),但似乎上下文属性不再存在。所以似乎只有“经典”方式findLoopEndTC.getPropertyValue("Result"),但这显然不是线程安全的。 还有其他可能吗?

我使用免费版的 SoapUI。

【问题讨论】:

  • 我选择了这个方案:在runContext中传入一个Map作为参数,并在map中设置返回值:def results = [:]; runContext.put("results", results);
  • 不幸的是,我发现从负载测试运行时 tc.run() 方法本身不是线程安全的(这是需要线程保存的主要地方)。因此它仅可用于功能测试。查看我的错误报告forum.soapui.org/…

标签: groovy thread-safety soapui


【解决方案1】:

我遇到了同样的问题。如果我理解正确,这就是你想要的:

您已将“调用”上下文放入新上下文“runContext”:

context.get("TestStepContext").put("Results",resultList)

作为要运行的测试用例的上下文(同步)传入。我将调用要运行的测试用例“B”:

def runner = findLoopEndTC.run(runContext, false) //在调用测试用例中

要从“B”中获取有用的信息,您需要在其中的某个位置将一个值放回 TestStepContext,例如:

context.get("TestStepContext").put("Results",resultList) //我的结果恰好是一个列表

在调用测试用例中,调用后运行测试用例需要的行是:

def testResults = runContext.get("TestStepContext").get("Results")

希望这是有道理的。

【讨论】:

    【解决方案2】:

    过去几天我也一直在努力解决这个问题。我还没有弄清楚如何使它成为线程安全的,但我有一种我认为效果很好的替代方法。

    我基于来自 SoapUI 团队的 http://forum.soapui.org/viewtopic.php?f=2&t=4681#p15731 建议。我发现使用上述解决方案它仍然不是线程安全的,99% 的时间它都有效,但我发现有时你可以有两个测试用例同时中断循环。

    为了解决这个问题,我将 runningDeleteCar 设置为当前 testRunner 退出循环时的哈希码。然后我再次检查以确保其他一些测试用例没有进入并更改它,如果它不匹配我就回到 while 循环。这样就阻止了两个测试用例同时爆发的情况。

    这种方法基本上意味着一次只有一个测试用例可以通过共享测试用例。

    【讨论】:

    • 感谢您的回复。 SmartBear 团队在您的链接中提供的解决方案可能在大多数情况下都有效,但如果没有真正的 Java 锁,它有时仍然会失败。我选择了另一种方法,但不幸的是发现 tc.run() 方法本身存在更多实质性问题。请参阅我上面的评论。
    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多