TestNG @DataProvider返回动态类

时间:2016-09-29 01:48:44

标签: java selenium testng testng-dataprovider

首先,我要构建一个基于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

2 个答案:

答案 0 :(得分:0)

DataProvider提供了Object作为返回类型,这意味着您可以键入强制转换为您的测试方法返回的类型。

但是,你的例子显示,你有两个方法正在做同样的事情,除了事实上,它将不同的类作为参数,然后我想建议,使用超级类{{{ 1}}和TestModelA类然后在你的超类中,把接受这个超类的方法TestModelB作为参数然后通过传递任何子类型来调用这个方法。

答案 1 :(得分:0)

为了让事情更清洁,我建议单独data providers。因此,它易于理解且易于维护。

是,如果要在单独的文件中外部化data provider方法。这可以实现。

您需要做些什么:

  1. 创建一个data provider课程。
  2. 将所有data provider方法放入此课程中。
  3. 所有数据提供者方法都应为publicstatic
  4. 使用@Test方法调用您的测试特定数据提供商。
  5. 以下是您的情况:

    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());
    }