Groovy 从SoapUI测试用例返回一个值

Groovy 从SoapUI测试用例返回一个值,groovy,thread-safety,soapui,Groovy,Thread Safety,Soapui,我正在尝试模块化我的测试用例,所以我正在运行一个共享的测试用例(作为一个过程),它做一些有用的事情并返回一个结果值。由于我需要传入非字符串输入属性,我必须从groovy运行测试用例: def findLoopEndTC = testRunner.testCase.testSuite.testCases["TestCase - Find Loop End"] assert findLoopEndTC != null, "Referred TC not found" def runContext

我正在尝试模块化我的测试用例,所以我正在运行一个共享的测试用例(作为一个过程),它做一些有用的事情并返回一个结果值。由于我需要传入非字符串输入属性,我必须从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_和_WAIT模式运行的,这确保了测试用例本身是以线程安全的方式运行的。 我的问题是如何以线程安全的方式从运行测试用例返回值

我尝试了
runner.getRunContext().getProperty(“Result”)
,但似乎上下文属性已经不存在了。因此,似乎只有“经典”的方法,
findLoopEndTC.getPropertyValue(“结果”)
,但这显然不是线程安全的。 还有其他的可能性吗


我使用SoapUI的免费版本。

过去几天我也一直在努力解决这个问题。我还没能想出如何使它线程安全,但我有一个替代方法,我认为它工作得相当好

我是基于SoapUI团队的这个建议。我发现上面的解决方案仍然不是线程安全的,99%的时间都是这样,但我发现有时可能会有两个测试用例同时中断循环

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


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

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

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

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”)


希望这有意义。

感谢您的回复。SmartBear团队在您的链接中提供的解决方案可能在大多数情况下都有效,但如果没有真正的Java锁,它有时仍然会失败。我选择了一种不同的方法,但不幸的是,我发现tc.run()方法本身存在更大的问题。请参阅我上面的评论。我选择了这个解决方案:在runContext中将映射作为参数传递,并在映射中设置返回值:def results=[:];runContext.put(“结果”,results);不幸的是,当从负载测试运行时,我发现tc.run()方法本身不是线程安全的(这是需要线程安全性的主要地方)。因此,它只能用于功能测试。查看我的错误报告