Еще одна интересная функция, доступная в TestNG, — это параметрическое тестирование . В большинстве случаев вы сталкиваетесь со сценарием, в котором бизнес-логика требует огромного количества тестов. Параметризованные тесты позволяют разработчикам запускать один и тот же тест снова и снова, используя разные значения.
TestNG позволяет передавать параметры напрямую в методы тестирования двумя различными способами:
- С testng.xml
- С поставщиками данных
Передача параметров с testng.xml
С помощью этого метода вы определяете простые параметры в файле testng.xml, а затем ссылаетесь на эти параметры в исходных файлах. Давайте продемонстрируем, как использовать эту технику для передачи параметров.
Создать тестовый класс
-
Создайте тестовый класс Java, скажем, ParameterizedTest1.java.
-
Добавьте тестовый метод parameterTest () в ваш тестовый класс. Этот метод принимает строку в качестве входного параметра.
-
Добавьте аннотацию @Parameters («myName») к этому методу. Параметру будет передано значение из testng.xml, которое мы увидим на следующем шаге.
Создайте тестовый класс Java, скажем, ParameterizedTest1.java.
Добавьте тестовый метод parameterTest () в ваш тестовый класс. Этот метод принимает строку в качестве входного параметра.
Добавьте аннотацию @Parameters («myName») к этому методу. Параметру будет передано значение из testng.xml, которое мы увидим на следующем шаге.
Создайте файл класса Java с именем ParameterizedTest1.java в C: \> TestNG_WORKSPACE .
import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class ParameterizedTest1 { @Test @Parameters("myName") public void parameterTest(String myName) { System.out.println("Parameterized value is : " + myName); } }
Создать testng.xml
Создайте testng.xml в C: \> TestNG_WORKSPACE для выполнения тестовых наборов .
<?xml version = "1.0" encoding = "UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name = "Suite1"> <test name = "test1"> <parameter name = "myName" value="manisha"/> <classes> <class name = "ParameterizedTest1" /> </classes> </test> </suite>
Мы также можем определить параметры на уровне <suite>. Предположим, мы определили myName на уровнях <suite> и <test>. В таких случаях применяются обычные правила определения объема. Это означает, что любой класс внутри тега <test> увидит значение параметра, определенного в <test>, а классы в остальной части файла testng.xml увидят значение, определенное в <suite>.
Скомпилируйте класс тестового примера, используя javac.
C:\TestNG_WORKSPACE>javac ParameterizedTest1.java
Теперь запустите testng.xml, который запустит метод parameterTest . TestNG сначала попытается найти параметр с именем myName в теге <test>, а затем, если он не может его найти, он ищет в теге <suit>, который его заключает.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Проверьте вывод.
Parameterized value is : manisha =============================================== Suite1 Total tests run: 1, Failures: 0, Skips: 0 ===============================================
TestNG автоматически попытается преобразовать значение, указанное в testng.xml, в тип вашего параметра. Вот поддерживаемые типы —
- строка
- INT / Integer
- булево / Boolean
- Байт / Байт
- символ / символов
- двухместный / Double
- Поплавок / Float
- долго долго
- короткий / Short
Передача параметров с поставщиками данных
Когда вам нужно передать сложные параметры или параметры, которые необходимо создать из Java (сложные объекты, объекты, считанные из файла свойств или базы данных и т. Д.), Параметры можно передать с помощью поставщиков данных.
Поставщик данных — это метод, аннотированный @DataProvider . Эта аннотация имеет только один строковый атрибут: его имя. Если имя не указано, имя поставщика данных по умолчанию автоматически соответствует имени метода. Поставщик данных возвращает массив объектов.
Следующие примеры демонстрируют, как использовать поставщиков данных. Первый пример о том, что @DataProvider использует Vector, String или Integer в качестве параметра, а второй пример о том, что @DataProvider использует объект в качестве параметра.
Пример 1
Здесь @DataProvider передает Integer и Boolean в качестве параметра.
Создать класс Java
Создайте класс Java с именем PrimeNumberChecker.java. Этот класс проверяет, является ли число простым. Создайте этот класс в C: \> TestNG_WORKSPACE .
public class PrimeNumberChecker { public Boolean validate(final Integer primeNumber) { for (int i = 2; i < (primeNumber / 2); i++) { if (primeNumber % i == 0) { return false; } } return true; } }
Создать тестовый класс
-
Создайте тестовый класс Java, скажем, ParamTestWithDataProvider1.java.
-
Определите метод primeNumbers (), который определяется как поставщик данных с использованием аннотации. Этот метод возвращает массив объектов.
-
Добавьте тестовый метод testPrimeNumberChecker () в ваш тестовый класс. Этот метод принимает Integer и Boolean в качестве входных параметров. Этот метод проверяет, является ли переданный параметр простым числом.
-
Добавьте аннотацию @Test (dataProvider = «test1») к этому методу. Атрибут dataProvider сопоставлен с «test1».
Создайте тестовый класс Java, скажем, ParamTestWithDataProvider1.java.
Определите метод primeNumbers (), который определяется как поставщик данных с использованием аннотации. Этот метод возвращает массив объектов.
Добавьте тестовый метод testPrimeNumberChecker () в ваш тестовый класс. Этот метод принимает Integer и Boolean в качестве входных параметров. Этот метод проверяет, является ли переданный параметр простым числом.
Добавьте аннотацию @Test (dataProvider = «test1») к этому методу. Атрибут dataProvider сопоставлен с «test1».
Создайте файл класса java с именем ParamTestWithDataProvider1.java в C: \> TestNG_WORKSPACE .
import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class ParamTestWithDataProvider1 { private PrimeNumberChecker primeNumberChecker; @BeforeMethod public void initialize() { primeNumberChecker = new PrimeNumberChecker(); } @DataProvider(name = "test1") public static Object[][] primeNumbers() { return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}}; } // This test will run 4 times since we have 5 parameters defined @Test(dataProvider = "test1") public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) { System.out.println(inputNumber + " " + expectedResult); Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber)); } }
Создать testng.xml
Создайте testng.xml C: \> TestNG_WORKSPACE для выполнения тестовых наборов .
<?xml version = "1.0" encoding = "UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name = "Suite1"> <test name = "test1"> <classes> <class name = "ParamTestWithDataProvider1" /> </classes> </test> </suite>
Скомпилируйте класс Test case, используя javac.
C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java
Теперь запустите testng.xml.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Проверьте вывод.
2 true 6 false 19 true 22 false 23 true =============================================== Suite1 Total tests run: 5, Failures: 0, Skips: 0 ===============================================
Пример 2
Здесь @DataProvider передает объект в качестве параметра.
Создать класс Java
Создайте Java-класс Bean.java, который представляет собой простой объект с методами get / set, в C: \> TestNG_WORKSPACE .
public class Bean { private String val; private int i; public Bean(String val, int i) { this.val = val; this.i = i; } public String getVal() { return val; } public void setVal(String val) { this.val = val; } public int getI() { return i; } public void setI(int i) { this.i = i; } }
Создать тестовый класс
-
Создайте тестовый класс Java, скажем, ParamTestWithDataProvider2.java.
-
Определите метод primeNumbers (), который определяется как поставщик данных с помощью аннотации. Этот метод возвращает массив объекта.
-
Добавьте тестовый метод testMethod () в ваш тестовый класс. Этот метод принимает объектный компонент в качестве параметра.
-
Добавьте аннотацию @Test (dataProvider = «test1») к этому методу. Атрибут dataProvider сопоставлен с «test1».
Создайте тестовый класс Java, скажем, ParamTestWithDataProvider2.java.
Определите метод primeNumbers (), который определяется как поставщик данных с помощью аннотации. Этот метод возвращает массив объекта.
Добавьте тестовый метод testMethod () в ваш тестовый класс. Этот метод принимает объектный компонент в качестве параметра.
Добавьте аннотацию @Test (dataProvider = «test1») к этому методу. Атрибут dataProvider сопоставлен с «test1».
Создайте файл класса java с именем ParamTestWithDataProvider2.java в C: \> TestNG_WORKSPACE .
import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class ParamTestWithDataProvider2 { @DataProvider(name = "test1") public static Object[][] primeNumbers() { return new Object[][] { { new Bean("hi I am the bean", 111) } }; } @Test(dataProvider = "test1") public void testMethod(Bean myBean) { System.out.println(myBean.getVal() + " " + myBean.getI()); } }
Создать testng.xml
Создайте testng.xml в C: \> TestNG_WORKSPACE для выполнения тестовых наборов .
<?xml version = "1.0" encoding = "UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name = "Suite1"> <test name = "test1"> <classes> <class name = "ParamTestWithDataProvider2" /> </classes> </test> </suite>
Скомпилируйте класс тестового примера, используя javac.
C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java
Теперь запустите testng.xml.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Проверьте вывод.