TestNG @DataProvider для возврата динамического класса

Итак, для начала я создаю библиотеку автоматизации, основанную на Selenium и Java. Я строю способ параметризации данных, которые передаются в методы тестирования. Я использую TestNG.

Прямо сейчас у меня есть два примера методов тестирования, которые используют разные модели данных в качестве параметра. Например, testOne принимает TestModelA, а testTwo принимает TestModelB. Тем не менее, оба из них используют один и тот же dataProvider. Эти классы TestModel читают из файла JSON и возвращают данные в методах получения.

Пример:

@Test(dataProvider = "JsonDataProvider")
public void testDataProviderOne(TestModelA testData) {
    System.out.println(testData.getTestDataAA());
    System.out.println(testData.getTestDataAB());
}

@Test(dataProvider = "JsonDataProvider")
public void testDataProviderTwo(TestModelB testData) {
    System.out.println(testData.getTestDataBA());
    System.out.println(testData.getTestDataBB());
}

Мне нужна помощь в создании этого метода DataProvider...

Прямо сейчас он будет работать с одним из них, если я верну указанный класс.

Пример:

@DataProvider(name = "JsonDataProvider")
protected static Object[][] getJsonDataModel() {

    return new Object[][]{ { new TestModelA() } };
}

Мне нужно, чтобы DataProvider возвращал объект, который передается в метод теста в качестве параметра, использующего этот поставщик данных.

Каков наилучший способ сделать это.

Если вы хотите проверить мой проект на GitHub, вы можете по адресу: https://github.com/Dominic-Pace/AutoCoreCommons

2 ответа

Чтобы сделать вещи чище, я предлагаю иметь отдельный data providers, Так что было бы легко понять и легко поддерживать.

Да, если вы хотите, чтобы data provider методы в отдельном файле. Это может быть достигнуто.

Что для этого нужно сделать:

  1. Создать data provider учебный класс.
  2. Положи все свои data provider методы в этом классе.
  3. Все методы поставщика данных должны быть public а также static,
  4. Позвоните своему поставщику тестовых данных в свой @Test методы.

Вот как это будет выглядеть в вашем случае:

MyDataProvider.java учебный класс

package example.dataprovider;

import org.testng.annotations.DataProvider;

public class MyDataProvider {
    @DataProvider(name = "JsonDataProviderForTestModelA")
    public static Object[][] getJsonDataProviderForTestModelA() {

        return new Object[][]{ { new TestModelA() } };
    }

    @DataProvider(name = "JsonDataProviderForTestModelB")
    public static Object[][] getJsonDataProviderForTestModelB() {

        return new Object[][]{ { new TestModelB() } };
    }
}

Ваш @Test методы могут использовать поставщик данных, соответствующий его требованию. подобно

@Test(dataProvider = "JsonDataProviderForTestModelA")
public void testDataProviderOne(TestModelA testData) {
    System.out.println(testData.getTestDataAA());
    System.out.println(testData.getTestDataAB());
}

@Test(dataProvider = "JsonDataProviderForTestModelB")
public void testDataProviderTwo(TestModelB testData) {
    System.out.println(testData.getTestDataBA());
    System.out.println(testData.getTestDataBB());
}

DataProvider предоставляет Object в качестве возвращаемого типа, что означает, что вы можете ввести приведение к типу, который возвращает ваш тестовый метод.

Тем не менее, ваш пример показывает, что у вас есть два метода, которые делают одно и то же, за исключением того факта, что он принимает разные классы в качестве аргумента, тогда я хотел бы предложить использовать супер класс для вашего TestModelA а также TestModelB классы, а затем в вашем суперклассе, поместите метод testDataProvider(SuperClass sc) который принимает этот суперкласс в качестве аргумента, затем вызывает этот метод, передавая любой подтип.

Другие вопросы по тегам