Параметризованные тесты

Параметризованные тесты означают возможность передачи параметров в тест. Эта фича реализована в 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