Статьи

TestNG: запускать тесты последовательно с @DataProvider в одном тестовом классе

Многие Java-разработчики и инженеры-тестировщики автоматизации используют TestNG в качестве основы тестирования в своей работе. Я не исключение. Это очевидный выбор, поскольку TestNG предоставляет очень мощный набор инструментов, который облегчает работу со всеми видами тестов. Чтобы доказать это, я покажу вам в этой статье, как можно решить одну нетривиальную задачу.

Эта проблема

Как запустить тесты в одном классе в определенном порядке с разными наборами данных? Похоже, я изложил формулировку проблемы в одном предложении. Но если вы попросите меня представить это предложение в более строгой форме, я приведу следующий список:

  • Несколько методов испытаний
  • Один тестовый класс
  • Последовательность запуска
  • Различные наборы данных для каждого метода испытаний

Резюмируя здесь, можно привести абстрактную схему проблемы:

01
02
03
04
05
06
07
08
09
10
TestClass {
firstTest(String testData)
secondTest(String testData)
thirdTest(String testData)
}
 
TestDataSets {
“string 1
“string 2
}

Выполнение этих тестов должно привести к результату:

1
2
3
4
5
6
7
firstTest(string 1)
secondTest(string 1)
thirdTest(string 1)
 
firstTest(string 2)
secondTest(string 2)
thirdTest(string 2)

После того, как проблема была выделена и объяснена, мы можем приступить к ее решению.

Реализация TestNG

Я буду использовать наиболее упрощенные конструкции кода, но вы можете использовать такой подход, настраивая его с определенной логикой.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package kill.me.later;
 
import static org.testng.Assert.assertTrue;
 
import org.testng.annotations.Test;
 
public class SomeTest {
 
    private int id = 0;
    private String account = "";
 
    public SomeTest(int id, String account) {
        this.id = id;
        this.account = account;
    }
 
    @Test
    public void firstTest() {
        System.out.println("Test #1 with data: "+id+". "+account);
        assertTrue(true);
    }
 
    @Test
    public void secondTest() {
        System.out.println("Test #2 with data: "+id+". "+account);
        assertTrue(true);
    }
 
    @Test
    public void thirdTest() {
        System.out.println("Test #3 with data: "+id+". "+account);
        assertTrue(true);
    }
 
}

Изучая приведенный выше код, каждый может заметить, что я использую обычную аннотацию TestNG @Test, применяемую к void- методам. Также я объявил конструктор, но его назначение будет обсуждаться позже. TestNG имеет очень полезные аннотации — @Factory и @DataProvider . Я рекомендую прочитать о них на официальном сайте документации TestNG . Пока вы читаете об этих аннотациях, я перейду к практической части:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
package kill.me.later;
 
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
 
public class SampleFactory {
 
    @Factory(dataProvider="dp")
    public Object[] createInstances(int id, String account) {
        return new Object[] {new SomeTest(id, account)};
    }
 
    @DataProvider(name="dp")
    public static Object[][] dataProvider() {
        Object[][] dataArray = {
                {1, "user1"},
                {2, "user2"}
        };
        return dataArray;
    }
 
}

Последний фрагмент кода обеспечивает выполнение каждого метода тестирования из класса SomeTest с наборами данных, объявленными в dataProvider . Но если вы попытаетесь запустить класс SampleFactory с помощью TestNG, вы не получите порядок выполнения тестовых методов из раздела «Проблема». Для того чтобы добиться последовательности методов тестирования последовательного выполнения, вам нужно использовать средство запуска TestNG XML:

1
< !DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

Обратите внимание на параметр group-by-instance . Именно это обеспечивает желаемый порядок последовательности для выполнения тестовых методов. Так что теперь вы можете легко организовать свои тесты для этого вида прогонов ДДТ.