Как указать в TestNG.xml какой DataProvider использовать

Всем доброго времени суток!
Нужен совет можно ли реализовать такую идею?
У меня есть тест и 2 DataProvider для него

public class MyTest {
    @DataProvider
    public Object[] dataProvider1() {
        return new Object[]{
                new MyObject("test1"),
                new MyObject("test2")};
    }

    @DataProvider
    public Object[] dataProvider2() {
        return new Object[]{
                new MyObject("test3"),
                new MyObject("test4")};
    }

    @Test(dataProvider = "dataProvider1")
    public void myTestMethod(final MyObject my) {
        my.doAction();
    }
}

Хочу создать 2 testNG.xml. Один должен запускать тест с первым провайдером, а второй - со вторым. Но не найду как это сделать. Кто подскажет как выкрутится и возможно ли это?

Чисто технически такое можно реализовать через IAnnotationTransformer, подсунув кастомное имя DP. Но это будет весьма костыльным и в корне неверным решением для вашей задачи.

Тут вопрос в другом: имеет ли смысл разбивать DP на 2 для одного и того же теста? Как насчет параметризации источника данных?

1 лайк

Таким образом я пытаюсь организовать два Test Suite: первый для Смоук (который запустит тест для 2-х объектов и будет запускаться после каждого пуша в репозитарий), а второй для Регрешена (который запустить тест для 15-ти объектов и будет запускать раз в день)

А можно Вас попросить немного растолковать, что Вы тут имеете ввиду?
Буду очень благодарен.

Используйте xml датапровайдер+внутренний
Если я правильно понял задачу
Кейс:
Запуск одинаковых тестов на разных энвайрментах

   <parameter name="stage" value="JIT"/>
   <parameter name="country" value="UK"/>

и сам провайдер даты внутри тест класса

1 лайк

Вместо того, чтобы хранить данные в коде и разбивать их на отдельные провайдеры, порой имеет смысл прибегнуть к внешним источникам хранения данных. Это может быть все, что угодно: файлы, база и т.п. Если одному и тому же тесту нужны разные данные, при условии наличия идентичных шагов, можно посредством, к примеру, аннотации намекать, к какому именно источнику нужно сейчас обращаться. Здесь же можно и указывать, в какую сущность нужно прочитать результат.

О технике создания generic DP я рассказывал на SC 16:

Исходники можно найти тут:

В качестве альтернативы, как уже намекнули выше, можно задавать некие ключи, которые будут служить идентификаторами для данных, которые вам нужно предоставить тесту в нужный момент времени. Это могут быть не только xml параметры, а и переменные окружения, system properties, и т.п. Но такой подход может быть не очень гибким, если кол-во потенциальных ветвлений данных будет расти.

П.С. Ну и заодно можете взглянуть на расширенную версию DP, которая умеет гибко работать с практически любыми типами данных. А то больно смотреть уже на эти массивы с итераторами.

1 лайк

Как раз вчера вечером нашёл Ваш пост по test-data-supplier и уже переехал на него. :slight_smile:

К этому и пришёл. Через системную переменную передаю ключ, по которому определяю набор данных в дата провайдере. Второй дата провайдер не понадобился.

Следующим шагом перееду во внешний источник хранения данных и generic DP.

Спасибо.

гигантский проект? или попробовать

ИМХО хранение в json данных обычно вполне достаточно
через датапровайдер читаем из ресурсов нужные файлы
парсим ключи-значения (автовелью, ломбок, или котлин дата классы)

пример можно?
сет пропертис тоже в коде обычно…