Параметризованные тесты
Параметризованные тесты означают возможность передачи параметров в тест. Эта фича реализована в JUnit 4 и в TestNG, но очень разными способами.
JUnit 4
@RunWith и @Parameter аннотации используются для передачи значения параметров в тест, @Parameters возвращает List[]. Эти значения передаются в конструктор в качестве аргумента.
@RunWith(value = Parameterized.class)
public class JunitTest6 {
private int number;
public JunitTest6(int number) {
this.number = number;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] { { 1 }, { 2 }, { 3 }, { 4 } };
return Arrays.asList(data);
}
@Test
public void pushTest() {
System.out.println("Parameterized Number is : " + number);
}
}
Здесь довольно много ограничений:
мы должны следовать сигнатуре JUnit для объявления параметра;
параметр передается в конструктор класса для инициализации поля класса, который будет содержать значение параметра;
возвращаемый тип метода с аннотацией @Parameters должен быть List []
данные должны быть примитивного типа (String, int)
TestNG
XML файл или @DataProvider используются для передачи параметров в тест.
Параметризованный тест с XML файлом.
@Parameters - здесь аннотация для метода, в котором нужен параметр для тестирования. Данные для параметра передаются через XML конфигурационный файл. С помощью такого подхода мы можем использовать тест кейс разными входными данными и даже получать разный результат. Кроме того, любой из пользователей автотестами может иметь свои собственные параметры для запуска теста.
Юнит тест
public class TestNGTest6_1_0 {
@Test
@Parameters(value="number")
public void parameterIntTest(@Optional(1) int number) {
System.out.println("Parameterized Number is : " + number);
}
}
XML файл
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="testing">
<parameter name="number" value="2"/>
<classes>
<class name="com.fsecure.demo.testng.TestNGTest6_0" />
</classes>
</test>
</suite>
Некоторые из параметров можно зааннотировать с помощью @Optional с указанием значения по умолчанию (если не указать, то будут использоваться значения по умолчанию для примитивов, либо null для всех остальных типов).
Параметризованный тест с @DataProvider.
Использование XML файла для передачи данных может быть очень удобным, однако иногда тесты требуют сложные типы данных, которые нельзя представить в виде String или примитивных типов (классы, структуры данных). В TestNG в такой ситуации можно использовать @DataProvider, который может передавать в тест данные любого типа.
@DataProvider для вектора, строки или целого числа в качестве параметра:
@Test(dataProvider = "Data-Provider-Function")
public void parameterIntTest(Class clzz, String[] number) {
System.out.println("Parameterized Number is : " + number[0]);
System.out.println("Parameterized Number is : " + number[1]);
}
//This function will provide the patameter data
@DataProvider(name = "Data-Provider-Function")
public Object[][] parameterIntTestProvider() {
return new Object[][] {
{Vector.class, new String[] {"java.util.AbstractList", "java.util.AbstractCollection"}},
{String.class, new String[] {"1", "2"}},
{Integer.class, new String[] {"1", "2"}}
};
}
@DataProvider для объекта в качестве параметра, где “TestNGTest6_3_0” объект с get set методами для демо:
@Test(dataProvider = "Data-Provider-Function")
public void parameterIntTest(TestNGTest6_3_0 clzz) {
System.out.println("Parameterized Number is : " + clzz.getMsg());
System.out.println("Parameterized Number is : " + clzz.getNumber());
}
//This function will provide the patameter data
@DataProvider(name = "Data-Provider-Function")
public Object[][] parameterIntTestProvider() {
TestNGTest6_3_0 obj = new TestNGTest6_3_0();
obj.setMsg("Hello");
obj.setNumber(123);
return new Object[][]{
{obj}
};
}
Параметризованные тесты с TestNG очень гибкие и "юзер-френдли" (как вариант с XML, так и с DataProvider). Поддерживаются любые типы данных для передачи в тест. Кроме того, @DataProvider могут быть вынесены в отдельный класс для удоства в отличии от JUnit, где метод, метод отдающий параметры должен быть в отдельном классе.
Вопрос 1. Подумайте, чем отличаются @Parameters в TestNG от JUnit. Что из них больше соотносится с DDT (Data Driven Testing)?
Last updated