我正在尝试模块化我的测试用例,所以我正在运行一个共享的测试用例(作为一个过程)来做一些有用的事情并返回一个结果值。因为我需要传入非字符串输入属性,所以我必须从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。
答案 0 :(得分:1)
我遇到了同样的问题。如果我理解正确,这就是你想要的:
您已将“调用”上下文放入新的上下文“runContext”:
context.get( “TestStepContext”)。把( “结果”,resultList)
已作为要运行的测试用例的上下文传递(同步)。我将调用测试用例运行'B':
def runner = findLoopEndTC.run(runContext,false)//在调用测试用例
要从'B'获取有用的东西,在其中的某个位置,您需要将值重新放回TestStepContext,例如:
context.get(“TestStepContext”)。put(“Results”,resultList)//我的结果恰好是一个列表
在调用测试用例中,运行测试用例的调用后所需的行是:
def testResults = runContext.get(“TestStepContext”)。get(“Results”)
希望这是有道理的。
答案 1 :(得分:0)
过去几天我一直在努力解决这个问题。我还没有弄清楚如何使它保持线程安全,但我有一种替代方法,我觉得它很好用。
我的基础是来自SoapUI团队的http://forum.soapui.org/viewtopic.php?f=2&t=4681#p15731建议。我发现上面的解决方案仍然不是线程安全的,99%的时间都可以工作,但我发现有时你可能会有两个测试用例同时打破循环。
为了解决这个问题,我将runningDeleteCar设置为当前testRunner从循环中断开时的哈希码。然后我仔细检查这一点,以确保其他一些测试用例没有进入并更改它,如果它不匹配我只是回到while循环。这可以阻止两个测试用例同时爆发的情况。
这种方法基本上意味着一次只能有一个测试用例可以通过共享测试用例。