TestNG中的DataProvider和Factory有什么区别?

18

何时使用DataProvider,何时使用Factory?

4个回答

12

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用于为测试提供参数。如果您将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
dataProvider 也可以放在测试类的构造函数中。 - reinierpost
+1 很好的解释。@why:如果您获得足够的信息,请接受此解释。 - ironwood
为什么不在DataProvider中创建WebDriver实例并将其传递呢? - djangofan

2
数据提供者始终创建相同的数据集。因此,如果您需要一个人类实例,您将始终从数据提供者获取名为约翰·韦恩的人。他们提供静态数据。这对于测试参数化很有用,当您向测试提供两个对象时,第一个是方法输入,第二个是您期望的对象。
工厂允许您动态地创建测试它们提供动态数据,如随机内容或者如果您想要调用一些具有不同参数的方法。

如果您的测试数据不在TestNG文件中,而是在不同的文件中,并且您有一个使用这些数据的方法,您会选择使用工厂还是数据提供者? - why
区别在于向您的方法提供数据的方式。正如您在帖子中看到的示例链接,当使用XML传递参数时,您会获得数据提供程序 - 数据来自TestNg的配置实现是其特性。当构建类以动态创建数据时,您将获得工厂。 - Koziołek

2

Factory(工厂)实现会为测试类的每一个实例执行测试方法,而 DataProvider(数据提供者)则为测试类的单个实例执行测试方法。


-1

简而言之:

  • @DataProvider -> 适用于单个方法的参数
  • @Factory -> 适用于类中所有方法的参数

让我从使用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)您必须指定一个无参构造函数或使字段+方法静态。在这里查看更多信息。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接