В чем разница между DataProvider и Factory в TestNG? - PullRequest
16 голосов
/ 20 марта 2011

Когда использовать DataProvider, а когда использовать Factory?

Ответы [ 4 ]

11 голосов
/ 26 ноября 2012

Фабрика 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 [].Возвращаемые объекты могут быть любого класса (не обязательно того же класса, что и фабричный класс).

Принимая во внимание, что поставщик данных используется для предоставления параметров для теста.Если вы предоставите поставщик данных для теста, тест будет выполняться каждый раз с различными наборами значений.Это полезно для сценария, например, когда вы хотите войти на сайт с разными наборами имени пользователя и пароля каждый раз.

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

}
2 голосов
/ 20 марта 2011

Поставщик данных всегда создает один и тот же набор данных.Так что, если вам нужен экземпляр Person, вы всегда получите человека по имени John Wayne от поставщика данных.Они предоставляют статические данные.Это хорошо для параметризации теста, когда вы предоставляете тесту два объекта - первый - это ввод метода, второй - то, что вы ожидаете.

Фабрики позволяют создавать тесты динамически. .Они предоставляют динамические данные, такие как случайный контент или, если вы хотите, вызвать какой-либо метод с параметрами diffrend.

1 голос
/ 06 марта 2015

Фабричная реализация выполняет тестовый метод для каждого отдельного экземпляра тестового класса.Где, поскольку DataProvider выполняет метод теста для одного экземпляра класса теста.

0 голосов
/ 26 ноября 2017

TLDR

  • @DataProvider -> параметры для ОДНОГО метода
  • @Factory -> params для ВСЕХ методов в классе

Позвольте мне начать с использования 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) Вы должны указать конструктор без аргументов или создать поля + методы static . Подробнее здесь

2) При @DataProvider ваш @BeforeClass будет выполнен один раз . С @Factory он будет выполняться с каждую итерацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...