Параметризованные тесты означает возможность передачи параметров в тест. Эта фича реализована в 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);
}
}
Здесь довольно много ограничений:
TestNG
XML файл или @DataProvider используются для передачи параметров в тест.
@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 для всех остальных типов).
Использование 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)?