Під час вивчення можливостей фреймворку TestNG, можуть виникнути питання, стосовно відмінності між анотаціями @DataProvider та @Factory.

Попередньо може бути корисним ознайомитись:

@DataProvider – тестовий метод запускається з одного і того самого екземпляра тестового класу (якому він належить), але щоразу з різними наборами даних (котрі повертає метод постачальника даних).

@Factory – виконує всі тестові методи, наявні в тестовому класі, використовуючи окремі екземпляри відповідного класу.

Для кращого розуміння відмінності розглянемо наступні приклади.

Використання @DataProvider

public class SimpleTest {

    @BeforeClass
    void beforeClass() {
        System.out.println("Run before class method");
    }

    @Test(dataProvider = "dataMethod")
    void testMethod(String value) {
        System.out.println("Run test for value: " + value);
    }

    @DataProvider
    Object[][] dataMethod() {
        return new Object[][] { {"one"}, {"two"} };
    }
}

Клас SimpleTest містить методи beforeClass та testMethod. Тестовий метод приймає параметр типу String, значення котрого надається методом постачальника даних dataMethod.

Запускаю тест на виконання та отримую наступний результат:

Метод beforeClass запускається одного разу, незалежно від того, скільки разів виконується тестовий метод. Це свідчить про те, що під час виконання, було створено лише один екземпляр тестового класу.

Використання @Factory

public class SimpleTest {

    private final String value;

    public SimpleTest(String value) {
        this.value = value;
    }

    @BeforeClass
    void beforeClass() {
        System.out.println("Run before class method");
    }
    
    @Test
    void testMethod() {
        System.out.println("Run test for value: " + value);
    }
}

public class FactoryTests {

    @Factory
    Object[] factoryMethod() {
        return new Object[] {
                new SimpleTest("one"),
                new SimpleTest("two")
        };
    }
}

Клас SimpleTest містить методи beforeClass та testMethod. Фабричний метод factoryMethod повертає два екземпляри тестового класу, передаючи його конструктору значення параметра типу String.

Запускаю фабрику тестів на виконання та отримую наступний результат:

Метод beforeClass виконується перед кожним запуском testMethod. Це показує, що фабрична реалізація дає можливість виконувати тести, створюючи окремі екземпляри тестового класу.