Groovy 从SoapUI测试用例返回一个值
我正在尝试模块化我的测试用例,所以我正在运行一个共享的测试用例(作为一个过程),它做一些有用的事情并返回一个结果值。由于我需要传入非字符串输入属性,我必须从groovy运行测试用例: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
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()方法本身不是线程安全的(这是需要线程安全性的主要地方)。因此,它只能用于功能测试。查看我的错误报告