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