Автор оригинала: Pankaj Kumar.
Аннотация Testing @Factory используется для указания метода в качестве фабрики для предоставления объектов, которые будут использоваться при тестировании для тестовых классов. Метод, помеченный аннотацией @Factory , должен возвращать массив объектов.
Тестирование @Заводская аннотация
Фабрика тестирования полезна, когда вы хотите запустить несколько тестовых классов через один тестовый класс. Давайте рассмотрим краткий пример тестирования заводской аннотации.
Допустим, у нас есть два тестовых класса с несколькими определенными методами тестирования.
package com.journaldev.utils;
import org.testng.annotations.Test;
public class Test1 {
@Test
public void test1() {
System.out.println("Test1 test method");
}
}
package com.journaldev.utils;
import org.testng.annotations.Test;
public class Test2 {
@Test
public void test2() {
System.out.println("Test2 test method");
}
}
Теперь мы можем определить фабричный метод, который возвращает массив объектов вышеуказанных классов.
package com.journaldev.utils;
import org.testng.annotations.Factory;
public class TestNGFactory {
@Factory()
public Object[] getTestClasses() {
Object[] tests = new Object[2];
tests[0] = new Test1();
tests[1] = new Test2();
return tests;
}
}
На изображении ниже показан результат выполнения вышеуказанного класса в качестве тестового класса TestNG.
Вот вывод, полученный в консоли Eclipse.
[RemoteTestNG] detected TestNG version 6.14.3
Test1 test method
Test2 test method
PASSED: test1
PASSED: test2
===============================================
Default test
Tests run: 2, Failures: 0, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
Обратите внимание, что если мы сделаем сборку maven и в ней будет больше тестовых классов TestNG, все они также будут выполнены. У меня есть еще один тестовый класс для тестирования, и ниже приведен результат сборки maven.
Running TestSuite Configuring TestNG with: org.apache.maven.surefire.testng.conf.TestNG652Configurator@3224f60b Test2 test method Test3 test method Test1 test method Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.342 sec Results : Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
Поэтому, если тестовый класс возвращается любым заводским методом, он исключается из набора тестов по умолчанию.
Мы также можем создать несколько методов @Factory в одном и том же тестовом классе или в разных тестовых классах.
Испытательная фабрика с поставщиком данных
Когда мы создаем проект, все наши тестовые случаи выполняются. Так в чем же преимущество использования заводского метода?
Что ж, это полезно, когда вы используете его с поставщиком данных, а у конструктора тестового класса есть аргументы.
Допустим, наш Test1 класс определен как:
package com.journaldev.utils;
import org.testng.annotations.Test;
public class Test1 {
private String str;
public Test1(String s) {
this.str = s;
}
@Test
public void test1() {
System.out.println("Test1 test method. str = "+str);
}
}
Если мы просто запустим этот класс как тестовый класс TestNG, то он присвоит значение по умолчанию строковому аргументу конструктора и выдаст следующий вывод.
Test1 test method. str = Default test PASSED: test1
В этом случае мы можем использовать dataProvider вместе с фабрикой для предоставления входных данных для конструктора.
package com.journaldev.utils;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
public class TestNGFactory {
@Factory(dataProvider = "dp")
public Object[] getTestClasses(String s) {
Object[] tests = new Object[2];
tests[0] = new Test1(s);
tests[1] = new Test2();
return tests;
}
@DataProvider
public Object[] dp() {
return new Object[] {"A", "B"};
}
}
Когда мы запускаем выше тестовый класс, он выдает следующий результат.
Test1 test method. str = A Test1 test method. str = B Test2 test method Test2 test method PASSED: test1 PASSED: test1 PASSED: test2 PASSED: test2
Резюме
Методы фабрики тестирования полезны, когда в ваших тестовых классах есть конструкторы с аргументами или вы хотите создать другой набор тестовых классов и выполнить их сразу.