Тестирование на основе свойств с динамической матрицей
Некоторое время назад мне пришлось развернуть динамическую матрицу, чтобы полностью протестировать некоторые функции, над которыми я работал в то время.
Я даже не могу вспомнить, что это был за случай или проект, но с тех пор я использую ту же технику для выполнения матричного тестирования. Это не очень красиво или чисто, но это делает свою работу. 😎
Я использовал Параметризованная аннотация теста 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 StreamgetArguments() { 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”