met*_*bed 5 java junit testng unit-testing
在将一些测试从JUnit迁移到TestNG时,我遇到了一个问题,因为这些测试框架如何处理它们的Test类实例.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
相比之下,TestNG对所有测试方法使用Test类的单个实例.所以上面的模式不起作用!由于数据存储在实例字段中,因此不再隔离这些值.如果启用并行执行,这可能会导致覆盖数据中期测试.
那么我如何使用TestNG做到这一点?是否有存储将其分离出每个数据的方式@BeforeMethod
- @Test
- @AfterMethod
元组?
我可以在@Test
自己内部完成所有3个步骤,但这需要try...finally
在每个测试中添加笨拙的块.我也试过使用ITestContext
,但它似乎也在整个测试运行中共享.
是的,使用 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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1740 次 |
最近记录: |