当前位置: 首页 > 知识库问答 >
问题:

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

汪丁雷
2023-03-14

在将一些测试从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呢?有没有一种方法可以存储与每个@beforethod-@Test-@AfterMethod元组隔离的数据?

我可以在@Test内部执行所有3个步骤,但这需要添加笨拙的try...最后块到每个测试。我还尝试使用ITestContext,但它似乎在整个测试运行中是共享的。

共有1个答案

后凯捷
2023-03-14

是的,使用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;
}
}
 类似资料:
  • 首先,对不起我的英语,它不是那么完美:) 所以我面临以下问题:我试图使用Selenium Grid和TestNg在不同的浏览器中运行并行测试,并在@BeforeTest方法中传递参数。我的问题是,当每个测试初始化时,他们似乎会使用最后一个测试的参数。所以在这个例子中,当我运行测试时,它将打开两个Chrome,而不是一个火狐和一个Chrome。(browser.getDriver()方法返回远程We

  • 我试图用TestNG并行运行一个示例测试项目。但它是在一个线程中顺序执行的。我漏掉什么了吗? 谢了。

  • 问题内容: 首先,对不起我的英语,它不是那么完美:) 因此,我面临以下问题:我正在尝试使用Selenium Grid和TestNg在不同的浏览器中运行并行测试,并在@BeforeTest方法中传递参数。我的问题是,在初始化每个测试时,似乎它们将使用最后一个测试的参数。因此,在此示例中,当我运行测试时,它将打开两个Chrome,而不是一个Firefox和一个Chrome。 (browser.getD

  • 类TestParallel.FirstTestClass线程ID:22名称:TestNG 类TestParallel.SecondTestClass线程ID:23名称:TestNG 类TestParallel.TestSetup线程ID:23名称:TestNG java.lang.NullPoInterException位于TestParallel.TestSetup.OnTestFailure(

  • 我正在使用testNg硒网格进行测试会话,我对整个东西非常满意 关键是测试的数量正在增长,现在它们至少需要 3 小时才能执行(在 30 个浏览器上进行 -100 次测试) 我计划进行 -150 次测试,所以,正如您可以想象的那样,我必须找到一个解决方案并并行启动它们 我试图玩一下这个,但没有现在很幸运,我现在看到的是两个浏览器启动,但只有一个通过测试。另一个只是等待:-)测试的结构如下,基本上 1