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
,但它似乎也是共享的整個測試運行。
'@ BeforeMethod'和'@AfterMethod '每個'@ Test'調用都會被調用;所以這應該和你描述的完全一樣。唯一的區別是你每次都會覆蓋類的狀態 - 而不是創建一個新的實例。你有沒有注意到那種意外的行爲?或者你是否試圖在課堂上同時運行所有的測試(恐怕這是不可能的)? –
@CostiCiudatu主要在並行執行過程中 - 有時候這些值會在測試中被覆蓋。 – metacubed
如果你想並行地運行類中的測試方法(''),由於你正在改變可變狀態,所以沒有辦法防禦競爭條件。 –