Автор оригинала: 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
Резюме
Методы фабрики тестирования полезны, когда в ваших тестовых классах есть конструкторы с аргументами или вы хотите создать другой набор тестовых классов и выполнить их сразу.