Автор оригинала: Pankaj Kumar.
Поставщик данных – одна из лучших функций платформы TestNG. Мы можем использовать TestNG dataProvider для ввода аргументов в наши методы тестирования.
Поставщик данных TestNG
TestNG dataProvider помогает нам в создании слабо связанных тестовых случаев. Мы можем разделить логику тестирования и входные данные на различные методы, таким образом, мы также можем повторно использовать входные данные из поставщика данных для нескольких методов тестирования.
Давайте посмотрим, как мы можем создать простого поставщика данных для класса тестирования с помощью плагина Eclipse. В Eclipse перейдите в Новый | Другой | Класс тестирования и на экране мастера выберите @dataProvider
аннотацию.
Когда вы нажимаете на кнопку Готово, мы получаем реализацию по умолчанию тестового класса тестирования с помощью метода dataProvider.
package com.journaldev.dataprovider; import org.testng.annotations.Test; import org.testng.annotations.DataProvider; public class Test4 { @Test(dataProvider = "dp") public void f(Integer n, String s) { } @DataProvider public Object[][] dp() { return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, }; } }
Обратите внимание, что нет необходимости использовать плагин Eclipse TestNG, но он помогает нам легко создавать базовый класс, а затем изменять его в соответствии с нашим вариантом использования проекта.
Обратите внимание, что dp()
метод аннотирован @dataProvider
аннотацией, и мы использовали его в @Test
конфигурации.
Метод dataProvider должен возвращать массив объектов, а его размер должен соответствовать методу тестирования. Поскольку наш метод тестирования имеет два аргумента, наш метод поставщика данных должен возвращать Объект [] []
, чтобы он был сопоставлен с аргументами метода.
Просто запустите приведенный выше класс как тест TestNG, и мы получим следующий вывод в консоли.
[RemoteTestNG] detected TestNG version 6.14.3 PASSED: f(1, "a") PASSED: f(2, "b")
Свойства TestNG @dataProvider
Аннотация @dataProvider имеет три свойства:
имя
: Используется для указания имени метода поставщика данных, значение по умолчанию-имя функции. Мы можем использовать его, чтобы дать правильное имя нашему методу поставщика данных.индексы
: Это очень важное свойство, оно позволяет нам указывать индексы, которые мы хотим использовать для наших целей тестирования. Это полезно, когда наш метод поставщика данных может иметь большое количество значений, и мы хотим запустить наши тестовые примеры только для нескольких из них. Его значение по умолчанию – “все”, поэтому тесты будут выполняться для всех входных данных, сгенерированных методом поставщика данных.parallel
: Этот параметр указывает TestNG на параллельное выполнение тестов. Таким образом, входные данные для методов тестирования могут вводиться в случайном порядке. По умолчанию входные данные вводятся в порядке, и тесты выполняются последовательно.
Давайте рассмотрим пример, в котором я изменил имя метода dataProvider, а также использовал только несколько входных данных, сгенерированных этим методом.
package com.journaldev.dataprovider; import org.testng.annotations.Test; import org.testng.annotations.DataProvider; public class Test4 { @Test(dataProvider = "fooDP") public void foo(Integer n) { System.out.println("Inside foo, input = "+n); } @DataProvider(name="fooDP", indices= {1,3,5,7,9}) public Object[] dp() { Object[] ints = new Object[100]; for(int i =0 ; i<100; i++) { ints[i] = 100+i; } return ints; } }
Теперь, когда мы запускаем наш тестовый класс, он генерирует следующий вывод.
[RemoteTestNG] detected TestNG version 6.14.3 Inside foo, input = 101 Inside foo, input = 103 Inside foo, input = 105 Inside foo, input = 107 Inside foo, input = 109 PASSED: foo(101) PASSED: foo(103) PASSED: foo(105) PASSED: foo(107) PASSED: foo(109)
Теперь измените метод dataProvider на параллельный.
@DataProvider(parallel=true, name="fooDP", indices= {1,3,5,7,9}) public Object[] dp() { //method logic }
Выходные данные, генерируемые при выполнении тестового класса:
[RemoteTestNG] detected TestNG version 6.14.3 Inside foo, input = 105 Inside foo, input = 107 Inside foo, input = 109 Inside foo, input = 103 Inside foo, input = 101 PASSED: foo(103) PASSED: foo(105) PASSED: foo(107) PASSED: foo(109) PASSED: foo(101)
Обратите внимание, что индексы
значения не вызывают никаких исключений, если поставщик данных возвращает меньшее количество объектов, чем указано. Таким образом, реализация поставщика данных ниже тоже будет работать нормально.
@DataProvider(parallel = true, name = "fooDP", indices = { 1, 3, 5, 7, 9 }) public static Object[] dp() { Object[] ints = new Object[3]; ints[0] = 0;ints[1] = 1;ints[2] = 2; return ints; }
Класс поставщика данных TestNG
Тестирование разработано таким образом, чтобы быть слабо связанным, поэтому неудивительно, что у нас есть возможность разделить наш тестовый класс с классом поставщика данных. Мы можем использовать @Test
свойство Класс поставщика данных
, чтобы указать имя класса для поиска метода поставщика данных.
Если этот атрибут указан, метод поставщика данных должен быть статическим в указанном классе. Если не указано, поставщик данных будет отображаться в тестовом классе или его суперклассах.
Вот пример отдельного класса TestNG dataProvider.
package com.journaldev.dataprovider; import org.testng.annotations.DataProvider; public class Test4DataProvider { @DataProvider(parallel = true, name = "fooDP", indices = { 1, 3, 5, 7, 9 }) public static Object[] dp() { Object[] ints = new Object[100]; for (int i = 0; i < 100; i++) { ints[i] = 100 + i; } return ints; } }
Наш обновленный тестовый класс:
package com.journaldev.dataprovider; import org.testng.annotations.Test; public class Test4 { @Test(dataProvider = "fooDP", dataProviderClass = Test4DataProvider.class) public void foo(Integer n) { System.out.println("Inside foo, input = " + n); } }
Поставщик данных TestNG с заводом
Мы также можем использовать Поставщик данных
с Заводскими
методами. Ниже фрагмент кода показывает простой пример использования dataProvider с заводской аннотацией.
@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"}; }
Я подробно объяснил вариант использования и преимущества использования dataProvider с фабрикой в учебнике по тестированию аннотаций фабрики.
Резюме
Тестирование-это потрясающая платформа для тестирования. Поставщик данных-одна из лучших его функций, которую я очень люблю и часто использую в своих тестовых случаях.