初始化并清理TestNG中并行测试的每个测试数据

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,但它似乎也在整个测试运行中共享.

dja*_*fan 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;
}
}
Run Code Online (Sandbox Code Playgroud)