TestNG 中的嵌套测试

Nested tests in TestNG

在 TestNG 中,我有一个参数化的 Test A,它自动从 dataProvider测试 B 每次 A 中的测试完成时都应该执行,因为我想利用 A 中获得的结果。换句话说,我想知道是否可以有以下内容:

给定参数化 @Test A(dataProvider = "inputList")@Test B,TestNG 将创建以下单元测试并按以下顺序执行它们:

Test A1
Test B1 (Based on A1 result)
Test A2
Test B2 (Based on B2 result)
...

Test An
Test Bn (Based on An result)

任何现有的 TestNG 标签都可以吗?我知道我可以将 @Test B 视为 @After,但这不会被 TestNG 理解为测试,我需要将测试 B 视为以后报告的测试。

您可以使用 TestNG Factory。例如:

关于工厂方法

public class TestClass {
    private final int p1;
    private final int p2;

    public TestClass(int p1, int p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    @Factory(dataProvider = "inputList")
    public static Object[] createTestClasses() {
        return new Object[]{
                new TestClass(1, 1),
                new TestClass(1, 0),
                new TestClass(1, -1),
        };
    }

    @Test
    public void A() {
        // test `A` code, stores result in some class member field
    }

    @Test(dependsOnMethods = {"A"})
    public void B() {
        // test `B` code, uses stored result from test `A`
    }
}

关于构造函数

public class TestClass {
    private final int p1;
    private final int p2;

    @Factory(dataProvider = "inputList")
    public TestClass(int p1, int p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    @DataProvider
    public static Object[][] inputList() {
        return new Object[][]{
                {1, 1},
                {1, 0},
                {1, -1}
        };
    }

    @Test
    public void A() {
        // test `A` code, stores result in some class member field
    }

    @Test(dependsOnMethods = {"A"})
    public void B() {
        // test `B` code, uses stored result from test `A`
    }
}

请参阅 TestNG 文档页面中的 Factories

已经提供了很好的答案,如果您只是期待按要求的顺序执行@Test 方法,那么您可以使用优先级。如果你想指定方法之间的依赖关系,那么你可以使用 dependsOnMethods。下面是简单的例子

  @Test(priority=1)
public void testA1(){

}

@Test(priority=2,dependsOnMethods="testA1")
public void testB1(){

}

@Test(priority=3)
public void testA2(){

}

@Test(priority=4,dependsOnMethods="testA2")
public void testB2(){

}