Ответ 1
TestNG factory используется для динамического создания экземпляров тестовых классов. Это полезно, если вы хотите запускать тестовый класс сколько угодно раз. Например, если у вас есть тест для входа в сайт, и вы хотите запустить этот тест несколько раз, тогда его легко использовать TestNG factory, где вы создаете несколько экземпляров тестового класса и запускаете тесты.
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 должен только ссылаться на класс, содержащий метод factory, так как сами тестовые экземпляры будут созданы во время выполнения:
<class name="WebTestFactory" />
Метод factory может принимать параметры так же, как @Test и @Before/After, и он должен возвращать Object []. Возвращаемые объекты могут быть любого класса (не обязательно того же класса, что и класс factory).
В то время как датапарайдер используется для предоставления параметров для теста. Если вы предоставите 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;
}
}