2015-09-12 122 views
5

將某些測試從JUnit遷移到TestNG時,由於這些測試框架如何處理它們的Test類實例,我遇到了一個問題。在TestNG中爲並行測試初始化​​和清理每個測試數據

JUnit爲每個測試方法創建一個Test類的新實例。因此,一個常見的模式我看到的是:

public class MyTest { 

    private Stream inputData; 

    @Before 
    public void setUp() { 
     // Set up some data in (non-static) instance fields 
     // This data is isolated per test 
     inputData = createInputDataStream(); 
    } 

    @Test 
    public void testStuff() { 
     // Use the data from the instance fields 
     doStuff(inputData); 
    } 

    @After 
    public void tearDown() { 
     // Clean up the data from the instance fields 
     closeInputDataStream(inputData); 
    } 
} 

相比之下,TestNG的使用測試類的單個實例爲所有的測試方法。所以上面的模式不起作用!由於數據存儲在實例字段中,因此這些值不再孤立。如果啓用並行執行,這可能會導致覆蓋數據中間測試。

那麼如何用TestNG來做到這一點?有沒有一種方法可以將數據隔離到每個@BeforeMethod - @Test - @AfterMethod元組?

我可以在@Test本身內完成所有3個步驟,但是這需要在每個測試中添加難看的try...finally塊。我也嘗試使用ITestContext,但它似乎也是共享的整個測試運行。

+1

'@ BeforeMethod'和'@AfterMethod '每個'@ Test'調用都會被調用;所以這應該和你描述的完全一樣。唯一的區別是你每次都會覆蓋類的狀態 - 而不是創建一個新的實例。你有沒有注意到那種意外的行爲?或者你是否試圖在課堂上同時運行所有的測試(恐怕這是不可能的)? –

+0

@CostiCiudatu主要在並行執行過程中 - 有時候這些值會在測試中被覆蓋。 – metacubed

+0

如果你想並行地運行類中的測試方法(''),由於你正在改變可變狀態,所以沒有辦法防禦競爭條件。 –

回答

1

是的,使用TestNG你有辦法更權力,你用JUnit沒有和DataProvider的處理您的線程,每個測試類實例的局部變量:

public class MyTest { 

private Stream inputData; 

@BeforeMethod 
public void setUp(Object[] args) { 
    inputData = (Data)args[0]; 
    inputData = normalizeDataBeforeTest(inputData); 
} 

@Test(dataProvider="testArgs") 
public void testStuff(Data inputDatax, Object a, Object b) { 
    doSomethingWith(a); 
    doSomethingWith(b); 
    doStuff(this.inputData); 
} 

@AfterMethod 
public void tearDown() { 
    // Clean up the data from the instance fields 
    closeInputDataStream(inputData); 
} 

.... 
@DataProvider 
public static Object[][] testArgs() { 
    // generate data here, 1 row per test thread 
    Object[][] testData; 
    for loop { 
     // add row of data to testData 
     // {{dataItem, obja, objb}, {dataItem, obja, objb}} etc. 
    } 
    return testData; 
} 
} 
相關問題