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

why*_*why 16 java testng

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

小智 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;     
  }  
Run Code Online (Sandbox Code Playgroud)

现在测试类是:

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

  @Test    
  public void testServer() {       
   //Code to test the application   
  }    
}    
Run Code Online (Sandbox Code Playgroud)

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

<class name="WebTestFactory" />  
Run Code Online (Sandbox Code Playgroud)

工厂方法可以像@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;
    }

}
Run Code Online (Sandbox Code Playgroud)


Koz*_*łek 2

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

工厂允许您动态创建测试。。它们提供动态数据,例如随机内容,或者如果您想使用 diffrend 参数调用某些方法。