Многие 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 | packagekill.me.later;importstaticorg.testng.Assert.assertTrue;importorg.testng.annotations.Test;publicclassSomeTest {    privateintid = 0;    privateString account = "";    publicSomeTest(intid, String account) {        this.id = id;        this.account = account;    }    @Test    publicvoidfirstTest() {        System.out.println("Test #1 with data: "+id+". "+account);        assertTrue(true);    }    @Test    publicvoidsecondTest() {        System.out.println("Test #2 with data: "+id+". "+account);        assertTrue(true);    }    @Test    publicvoidthirdTest() {        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 | packagekill.me.later;importorg.testng.annotations.DataProvider;importorg.testng.annotations.Factory;publicclassSampleFactory {    @Factory(dataProvider="dp")    publicObject[] createInstances(intid, String account) {        returnnewObject[] {newSomeTest(id, account)};    }    @DataProvider(name="dp")    publicstaticObject[][] dataProvider() {        Object[][] dataArray = {                {1, "user1"},                {2, "user2"}        };        returndataArray;    }} | 
Последний фрагмент кода обеспечивает выполнение каждого метода тестирования из класса SomeTest с наборами данных, объявленными в dataProvider . Но если вы попытаетесь запустить класс SampleFactory с помощью TestNG, вы не получите порядок выполнения тестовых методов из раздела «Проблема». Для того чтобы добиться последовательности методов тестирования последовательного выполнения, вам нужно использовать средство запуска TestNG XML:
| 1 |  | 
Обратите внимание на параметр group-by-instance . Именно это обеспечивает желаемый порядок последовательности для выполнения тестовых методов. Так что теперь вы можете легко организовать свои тесты для этого вида прогонов ДДТ.