首先,我要构建一个基于Selenium和Java构建的自动化库。我正在构建一种方法来参数化传递给测试方法的数据。我正在使用TestNG。
现在我有两个示例测试方法,它们将不同的数据模型作为参数。例如,testOne接受TestModelA,testTwo接受TestModelB。但是,这两个都使用SAME dataProvider。这些TestModel类从JSON文件读取并以getter方法返回数据。
示例:
@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方法......
现在,如果我返回指定的Class,它将与其中一个一起使用。
示例:
@DataProvider(name = "JsonDataProvider")
protected static Object[][] getJsonDataModel() {
return new Object[][]{ { new TestModelA() } };
}
我需要DataProvider将任何传递给测试方法的Object作为使用此数据提供程序的参数返回。
实现这一目标的最佳方法是什么。
如果您想在GitHub上查看我的项目,您可以: https://github.com/Dominic-Pace/AutoCoreCommons
答案 0 :(得分:0)
DataProvider
提供了Object作为返回类型,这意味着您可以键入强制转换为您的测试方法返回的类型。
但是,你的例子显示,你有两个方法正在做同样的事情,除了事实上,它将不同的类作为参数,然后我想建议,使用超级类{{{ 1}}和TestModelA
类然后在你的超类中,把接受这个超类的方法TestModelB
作为参数然后通过传递任何子类型来调用这个方法。
答案 1 :(得分:0)
为了让事情更清洁,我建议单独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());
}