[Перевод] Параметризация в JUnit 5 и Allure Report

Страницы:  1

Ответить
 

Professor Seleznov


Статья — перевод англоязычного руководства
При написании автотестов мы часто используем параметризацию — запуск одного и того же теста с разными данными. В этой статье мы разберём, какие задачи решает параметризация и как она реализована в Allure Report.
1. Подготовка
Предварительные требования
Проверьте наличие: Зависимости
В руководстве используются пакеты: Пример кода
Исходный код примера:
https://github.com/allure-examples/guide-junit5-parametrization.
Настройка
Для запуска примеров нужны Java и Allure Report.
Настроенный пустой проект с JUnit можно загрузить из Allure Start.
2. Зачем использовать параметризацию
Начнём с простого примера: сложим два числа.
@Test
public void testSum() {
assertEquals(1 + 2, 3);
}
Как запустить этот тест на нескольких наборах данных? Первое, что приходит в голову — поместить в тест цикл. Например:
@Test
public void testSum() {
final int[][] data = new int[][]{
{1, 2, 3},
{-1, 1, 0},
{0, 0, 0}
};
for (int[] datum : data) {
assertEquals(datum[0] + datum[1], datum[2]);
}
}
У этого подхода много недостатков:
  • Если тест падает на одном наборе данных, он не выполняет остальные.
  • Данные предоставляются в массиве, а не в виде именованных переменных, что снижает читаемость. В нашем коротком примере это не так страшно, но при более сложной структуре плохая читаемость создаёт серьёзные неудобства.
  • Отчёт о тестировании показывает только имя теста, а не конкретную итерацию цикла:
pic
Отчёт для теста с циклом
Как избавиться от этих недостатков? В JUnit 5 их можно устранить с помощью параметризации. Чтобы это продемонстрировать, перепишем предыдущий тест:
private static Stream<Arguments> dataProvider() {
return Stream.of(
Arguments.of(1, 2, 3),
Arguments.of(-1, 1, 0),
Arguments.of(0, 0, 0) );
}
@ParameterizedTest
@MethodSource("dataProvider")
public void testSum(int x, int y, int sum) {
assertEquals(x + y, sum);
}
Все три проблемы здесь решены:
  • Тест запускается несколько раз, и даже если он упал во время одной из итераций, остальные всё равно будут выполнены.
  • Данные представлены именованными переменными (x, y, sum), что делает тест более читаемым.
  • В отчёте каждая итерация параметризованного теста отображается как отдельный тестовый запуск:
    pic
    Отчёт для параметризванного теста
3. Параметризация в Allure Report
Allure Report интегрируется с JUnit 5 и поддерживает параметризованные тесты. Рассмотрим, как параметризация реализована «под капотом» Allure, и как она отображается в отчётах.
Если просто включить интеграцию Allure для JUnit, параметризованные тесты будут выглядеть как обычные, но с повторами:
pic
Отчёт Allure без параметров
Почему так происходит? Дело в том, что Allure нужно передать информацию о параметрах. Чтобы понять, какие данные получает Allure, запустите параметризованный тест и откройте файл {uid}-result.json в папке allure-results. В отчёте, показанном на предыдущем скриншоте, раздел parameters выглядит так:
{
"testCaseName": "testSum(int, int, int)",
"parameters": [
{
"name": "UniqueId",
"value": "[engine:junit-jupiter]/[class:org.example.junit_parameterization.SumTest]/[test-template:testSumParameterized(int, int, int)]/[test-template-invocation:#1]",
"mode": "hidden"
}
],
"start": 1717700137076,
"stop": 1717700137101
}
Как видим, в файле отсутствуют параметры x, y и sum, поэтому в отчёте нет раздела с параметрами — они просто включены в имя метода.
Как это исправить?
Подробное решение описано в документации, здесь же мы просто перепишем параметризованный тест:
@ParameterizedTest
@MethodSource("dataProvider")
public void testSum(int x, int y, int sum) {
Allure.parameter("x", x);
Allure.parameter("y", y);
Allure.parameter("sum", sum);
assertEquals(x + y, sum);
}
Если запустить этот тест, раздел parameters в файле результатов будет выглядеть так:
{
"testCaseName": "testSum(int, int, int)",
"parameters": [
{
"name": "UniqueId",
"value": "[engine:junit-jupiter]/[class:org.example.junit_parameterization.SumTest]/[test-template:testSumAllurified(int, int, int)]/[test-template-invocation:#2]",
"mode": "hidden"
},
{
"name": "x",
"value": "-1"
},
{
"name": "y",
"value": "1"
},
{
"name": "sum",
"value": "0"
}
]
}
Как видим, параметры наконец появились в результатах теста. Отчёт находит их и правильно отображает в соответствующем тесте:
pic
Отчёт Allure с параметрами
4. Заключение
Параметризация — полезный приём, который позволяет запускать один и тот же тест на нескольких наборах данных, не дублируя его и не усложняя циклами. Она делает тесты проще для чтения и легче в поддержке.
Параметризация полностью поддерживается в интеграции Allure-JUnit5. Интеграции постоянно улучшаются, и вероятно, что в будущих версиях параметры можно будет не указывать явно. Тем не менее, текущий подход уже предоставляет всю необходимую функциональность и обеспечивает прозрачность стека.-Источник
 
Loading...
Error