Рубрики
Без рубрики

Тестирование матрицы на основе свойств в Java

Тестирование матрицы на основе свойств в Java. С тегами java, test, pbt, junit.

Тестирование на основе свойств с динамической матрицей

Некоторое время назад мне пришлось развернуть динамическую матрицу, чтобы полностью протестировать некоторые функции, над которыми я работал в то время.

Я даже не могу вспомнить, что это был за случай или проект, но с тех пор я использую ту же технику для выполнения матричного тестирования. Это не очень красиво или чисто, но это делает свою работу. 😎

Я использовал Параметризованная аннотация теста Junit для включения тестирования на основе свойств (PBT) и Аннотация источника метода , указывающая на метод, который выдает поток, представляющий матрицу. Это довольно просто, но чем больше типов параметров у меня в матрице, тем сложнее прочитать или записать метод, предоставляющий их. 😵

В последнее время я обнаружил JUnit Pioneer , который представляет собой пакет расширений JUnit 5 , среди всех представленных преимуществ вы можете найти аннотацию CartesianProductTest . Объединено с парой/|Декартовых перечислений исходных примечаний и реализация матрицы становится намного проще и элегантнее. 😃

Давайте посмотрим.

Создание динамической матрицы на основе свойств из следующих Перечислений должно содержать 6 тестов:

  enum Direction {
    INCOMING,
    OUTGOING
  }

  enum Status {
    SUCCESS,
    FAILURE,
    WAITING
  }

Реализация матрицы из этих Перечислений с Параметризованным тестом JUnit и Источником метода :

  @ParameterizedTest
  @MethodSource("getArguments")
  void using_junit_parameterized_test_with_method_source(
      final Direction direction, final Status status) {
    assertTrue(true);
  }

  static Stream getArguments() {
    return Stream.of(Direction.values())
        .flatMap(d -> Stream.of(Status.values()).map(s -> arguments(d, s)));
  }

Как вы можете видеть, добавление элементов в существующие Перечисления будет динамически увеличивать матрицу и, следовательно, количество выполняемых тестов.

Но добавление третьего элемента в матрицу и метод getArguments начнут терять свою читабельность. Тем не менее , это позволяет выполнить работу, и я уже давно использую эту технику в своих проектах.

Теперь давайте сделаем то же самое с тестом декартового продукта JUnit Pioneer и парой CartesianEnumSource с:

  @CartesianProductTest
  @CartesianEnumSource(Direction.class)
  @CartesianEnumSource(Status.class)
  void using_junit_pioneer_cartesian_product_test_with_enum_source(
      final Direction direction, final Status status) {
    assertTrue(true);
  }

Это выдаст ту же матрицу, только теперь добавить третий элемент довольно просто, просто добавьте еще одну аннотацию, вы можете найти другие типы источников рядом с Перечислениями , в Документации JUnit Pioneer .

Как показано в этот репозиторий , выполняющий оба тестовых случая в одном и том же тестовом классе с использованием платформы Junit, распечатает:

[INFO] '-- JUnit Jupiter [OK]
[INFO]   '-- Property Based Matrix Test [OK]
[INFO]     +-- using junit pioneer cartesian product test with enum source (Direction, Status) [OK]
[INFO]     | +-- [1] INCOMING, SUCCESS [OK]
[INFO]     | +-- [2] INCOMING, FAILURE [OK]
[INFO]     | +-- [3] INCOMING, WAITING [OK]
[INFO]     | +-- [4] OUTGOING, SUCCESS [OK]
[INFO]     | +-- [5] OUTGOING, FAILURE [OK]
[INFO]     | '-- [6] OUTGOING, WAITING [OK]
[INFO]     '-- using junit parameterized test with method source (Direction, Status) [OK]
[INFO]       +-- [1] INCOMING, SUCCESS [OK]
[INFO]       +-- [2] INCOMING, FAILURE [OK]
[INFO]       +-- [3] INCOMING, WAITING [OK]
[INFO]       +-- [4] OUTGOING, SUCCESS [OK]
[INFO]       +-- [5] OUTGOING, FAILURE [OK]
[INFO]       '-- [6] OUTGOING, WAITING [OK]

Вы можете ознакомиться с кодом для этого руководства в Гитхаб .

👋 Увидимся в следующем уроке 👋

Оригинал: “https://dev.to/tomerfi/property-based-matrix-testing-in-java-47p4”