Вложенные тесты в TestNG

В TestNG у меня есть параметризованный Test A, который автоматически создает n тестов из dataProvider, и Test 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 рассматривался как тест для более поздних отчетов.


person Venom    schedule 01.03.2016    source источник
comment
Если читатели приходят из NUnit, они могут быть знакомы с концепцией синхронизированных тестов PNunit. Ответы ниже, кажется, помогают мне реализовать ту же концепцию в TestNG. (В основном я просто добавляю некоторые ключевые слова для себя и других, которые могут работать в обеих средах)   -  person Jefferey Cave    schedule 27.06.2016


Ответы (2)


Вы можете использовать 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`
    }
}

См. раздел Factory на странице документации TestNG.

person mfulton26    schedule 01.03.2016

Уже предоставлен хороший ответ, если вы просто хотите выполнить методы @Test в необходимом порядке, вы можете использовать приоритет. Если вы хотите указать зависимость между методами, вы можете использовать dependOnMethods. ниже простой пример

  @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(){

}
person murali selenium    schedule 01.03.2016