2016-02-12 21 views
1

我正在使用TestNG和Java。TestNG無法從線程中失敗測試

我有一個數據提供程序方法

@DataProvider 
public static Object[][] dataProviderMethod() { 
    return testCaseDataProvider; 
} 

和測試方法

@Test(dataProvider = "dataProviderMethod") 
public static void executeTestCase (SheetProvider sheetData, boolean parallel) { 
    //some code 
    if(condition) { 
     //spawn threads 
    } 
    else { 
     //do not spawn threads. directly call run method. 
    } 
} 

現在run()我想,以決定是否測試失敗或通過內。我試圖通過使用Assert.fail();內部運行方法來做到這一點。 它運行精細地順序執行,但給出了在並行執行一個異常

Exception in thread "T3" java.lang.AssertionError: null 

我明白這個問題是由於斷言錯誤本應被測試方法所捕獲而引起的。因此,在順序執行的情況下,它運行良好並且測試失敗,但是在並行執行的情況下,當我們調用Assert.fail()時,測試方法已經執行。

任何人都可以告訴我如何從run()方法失敗測試嗎?

+0

你可能會更清楚你的問題是什麼。在單個TestNG線程中,您正在生成自己的多個線程,並希望將這些多線程中發生的結果傳播回單個TestNG線程以報告結果。看起來很簡單,但很容易在TestNG線程和自己的線程之間混淆。您沒有提供關於您在做什麼的足夠信息,但是當您可能不需要時,我懷疑您的分支線程,而是可以讓TestNG數據提供者管理您的線程。 – djangofan

回答

1

您的測試顯示的真正問題是異常在併發線程中發生時不會被委託給調用者,您應該更改代碼以將任何執行異常傳回給調用者,因爲異常也可能發生在正常情況下程序員犯了一個錯誤。如果錯誤傳回給調用者,那麼你的問題就解決了。

+0

是的。那是對的。但問題是我不想並行運行測試。另外,一旦創建了一個線程,就會形成一個新的堆棧,因此我們無法將異常返回到基類。 –

+0

如果你使用'Executor'來產生線程,你可以調用'get()'來阻塞它,直到完成爲止,並且在出現錯誤時拋出異常 – Ferrybig

相關問題