TestNG中的嵌套测试

时间:2016-03-01 15:18:34

标签: unit-testing testng parameterized-unit-test

在TestNG中,我有一个参数化的 Test A ,可以自动从dataProvider测试B 创建 n 测试应该在每次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视为后续报告的测试。

2 个答案:

答案 0 :(得分:1)

您可以使用TestNG Factory。 e.g:

关于工厂方法

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

答案 1 :(得分:0)

已经提供了很好的答案,如果您只是期望按要求的顺序执行@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(){

}