2016-09-29 123 views
0

因此,我开始构建一个基于Selenium和Java的自动化库。我正在构建一种方法来参数化传递给测试方法的数据。我正在使用TestNG。TestNG @DataProvider返回动态类

现在我有两个示例测试方法,它们将不同的数据模型作为参数。例如,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帮助...

眼下它会与其中的一个工作,如果我回到指定的类。

实施例:

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

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

我需要了DataProvider返回取其对象被传递到测试方法正在使用此数据提供者的参数。

完成此操作的最佳方法是什么?

如果你想看看我在GitHub上的项目,你可以在: https://github.com/Dominic-Pace/AutoCoreCommons

回答

0

DataProvider的提供对象为返回类型,这意味着你可以强制类型转换到测试方法返回的类型。

然而,你的例子显示,你有两个方法是做同样的事情,除了它将不同的类作为参数,然后我想建议,使用超级类到你的TestModelATestModelB类,然后在您的超类中,将方法testDataProvider(SuperClass sc)接受此超类作为参数,然后通过传递任何子类型来调用此方法。

+0

我不完全明白。你能分享一个例子吗?谢谢! – dpace

0

为了让事情更干净,我建议单独使用data providers。所以它很容易理解并易于维护。

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

你需要的是做什么:

  1. 创建data provider类。
  2. 将这个类的所有data provider方法。
  3. 所有数据提供方法应该是publicstatic
  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()); 
} 
+0

我可以做到这一点,但是当我进入1500 - 2000年使用不同数据集的不同测试用例时,它会变得非常多。我正在寻找某种工厂来返回某个类的实例或其他东西。尽管如此,谢谢! – dpace