2013-10-21 69 views
0

我試圖模塊化我的測試用例,因此我正在運行一個共享的測試用例(作爲一個過程),它執行一些有用的操作並返回結果值。因爲我需要傳遞非字符串輸入特性,我已經測試情況下,從常規運行:從SoapUI返回值TestCase

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

我選擇了這個解決方案:在runContext中傳遞一個Map作爲參數,並在地圖中設置返回值: def results = [:]; runContext.put(「results」,results); – xarx

+0

不幸的是,我發現tc.run()方法本身在從負載測試(這是需要線程保存的主要場所)運行時不是線程安全的。所以它只能用於功能測試。看到我的bug報告http://forum.soapui.org/viewtopic.php?f=13&t=21961&sid=5bb191e6d594dabffda35cb43a2d7699 – xarx

回答

0

過去幾天我一直在努力解決這個問題。我一直無法解決如何使線程安全,但我有一個替代方法,我認爲它工作得很好。

我已經根據這個http://forum.soapui.org/viewtopic.php?f=2&t=4681#p15731 SoapUI團隊的建議。我發現上面的解決方案仍然不是線程安全的,99%的時間工作,但我發現有時候你可能有兩個測試用例同時打開循環。

爲了解決這個問題,我將runningDeleteCar設置爲當前testRunner在其循環中斷時的哈希碼。然後再仔細檢查一下,以確保其他一些測試用例沒有進入並更改它,如果不匹配,我只回到while循環。這樣可以阻止兩個測試用例同時爆發的情況。

這種方法基本上意味着一次只能有一個測試用例可以通過共享測試用例。

+0

謝謝你的迴應。 SmartBear團隊在鏈接中提供的解決方案可能適用於大多數情況,但如果沒有真正的Java鎖,它有時會失敗。我選擇了一種不同的方法,但不幸的是,發現tc.run()方法本身存在更多實質性問題。看到我上面的評論。 – xarx

1

我有同樣的問題。如果我理解正確的話,這是你想要的東西:

你已經把「呼」上下文進入新的情境「runContext」:

context.get(「TestStepContext」)把(「結果「,resultList)

已作爲要運行的測試用例的上下文傳入(同步)。我會打電話要運行的測試案例「B」:

高清亞軍= findLoopEndTC.run(runContext,FALSE)//呼籲測試用例

爲了得到一些有用的東西回來從「B」,某處在它,你需要把一個值回TestStepContext,如:

context.get(「TestStepContext」)把(「結果」,resultList)//我的結果正好是一個列表

在調用測試用例,調用運行測試用例後需要的行是:

def testResults = runContext.get(「TestStepContext」)。get(「Results」)

希望這是有道理的。