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
методы в отдельном файле. Это может быть достигнуто.
Что для этого нужно сделать:
- Создать
data provider
учебный класс. - Положи все свои
data provider
методы в этом классе. - Все методы поставщика данных должны быть
public
а такжеstatic
, - Позвоните своему поставщику тестовых данных в свой
@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)
который принимает этот суперкласс в качестве аргумента, затем вызывает этот метод, передавая любой подтип.