有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为TestNG中的并行测试初始化和清理pertest数据

在将一些测试从JUnit迁移到TestNG时,我面临一个问题,因为这些测试框架处理其测试类实例的方式不同

JUnit为每个测试方法创建一个新的测试类实例。因此,我看到的一个常见模式是:

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) 个答案

  1. # 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;
    }
    }