0

我正在尝试模块化我的测试用例,所以我正在运行一个共享测试用例(作为一个过程),它做一些有用的事情并返回一个结果值。由于我需要传入非字符串输入属性,我必须从 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。

4

2 回答 2

1

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

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

context.get("TestStepContext").put("结果",resultList)

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

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

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

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

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

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

希望这是有道理的。

于 2015-03-23T21:01:32.013 回答
0

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

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

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

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

于 2013-10-28T16:07:42.743 回答