TestNG中DataProvider和Factory之间有什么区别?

时间:2011-03-20 12:37:19

标签: java testng

何时使用DataProvider以及何时使用Factory?

4 个答案:

答案 0 :(得分:11)

TestNG工厂用于动态创建测试类的实例。如果您想要任何时候都不运行测试类,这非常有用。例如,如果您有一个登录站点的测试,并且您希望多次运行此测试,那么它易于使用的TestNG工厂,您可以在其中创建多个测试类实例并运行测试。

public class WebTestFactory {      
  //createInstances method will create 10 objects of WebTest class
  @Factory     
  public Object[] createInstances() {      
   Object[] result = new Object[10];       
   for (int i = 0; i < 10; i++) {      
      result[i] = new WebTest(i);      
    }      
    return result;     
  }  

现在是测试类:

public class WebTest {     
  private int m_numberOfTimes;     
  public WebTest(int numberOfTimes) {      
    m_numberOfTimes = numberOfTimes;       
  }    

  @Test    
  public void testServer() {       
   //Code to test the application   
  }    
}    

您的testng.xml只需要引用包含工厂方法的类,因为测试实例本身将在运行时创建:

<class name="WebTestFactory" />  

工厂方法可以像@Test和@ Before / After一样接收参数,它必须返回Object []。返回的对象可以是任何类(不一定是与工厂类相同的类)。

然而,dataprovider用于为测试提供参数。如果为测试提供数据提供者,则每次运行测试时将使用不同的值集。这对于您希望每次登录到具有不同用户名和密码集的站点的场景非常有用。

public class DataProviderTest {

    @Test(dataProvider= "data")
    public void TestUltimatixFromExcelData(String userName,String password) {
        WebDriver driver; 
        driver=new FirefoxDriver();
        //Test to login into a site
    }

    @DataProvider(name="data")
    public static Object[][] dataProviderTest() throws Exception{

        Object[][] returnArray={new Object[]{"username1","password1"},new Object[]{"username2","password2"},new Object[]{"username3","password3"}
        };
        return returnArray;
    }

}

答案 1 :(得分:2)

数据提供程序始终创建相同的数据集。因此,如果您需要Person实例,您将始终从数据提供者处获得名为John Wayne的人员。它们提供静态数据。当您为测试提供两个对象时,这对于测试参数化很有用 - 首先是方法输入,第二个是您期望的。

Factories allow you to create tests dynamically.。它们提供动态数据,如随机内容,或者如果您想调用一些带有diffrend参数的方法。

答案 2 :(得分:1)

工厂实现为测试类的每个单独实例执行测试方法。 DataProvider为测试类的单个实例执行测试方法的位置。

答案 3 :(得分:0)

<强> TLDR

  • @DataProvider - &gt;用于单一方法的参数
  • @Factory - &gt;类中所有方法的参数

首先让我使用DataProviders

public class VeryImportantTest {

    @DataProvider
    public static Object[][] numberProvider() {
        return new Object[][]{
                {1},
                {2}
        };
    }

    // DataProvider provides data to a SINGLE method
    @Test(dataProvider = "numberProvider")
    public void test1(int num){
        Assert.assertNotEquals(3, num);
    }

    @Test(dataProvider = "numberProvider")
    public void test2(int num){
        // ...
    }

    @Test(dataProvider = "numberProvider")
    public void test3(int num){
        // ...
    }

    // Hmmm... I still have 10 tests to write here, 
    // and it's getting annoying to specify the dataprovider everytime...
}

但不是@Factory

public class FactoryExample {

    @Factory
    public Object[] factoryMethod() {
        return new Object[] {
                new FactoryExample(0),
                new FactoryExample(1) 
       };
    }

    private int number;

    private FactoryExample(){}

    private FactoryExample(int number) {
        this.number = number;
    }

    // Now there's no need to specify dataproviders everywhere, nice
    @Test
    public void test1(){
        Assert.assertNotEquals(3, number);
    }

    @Test
    public void test2(){ // <-- No need to specify params in each method either
       // ...
    }
}

使用Factory时请注意两件事:

1)您必须指定 no-arg构造函数或使字段+方法静态。查看更多here

2)使用@DataProvider,您的@BeforeClass将被执行一次。使用@Factory,它将以每次迭代执行。