Статья — перевод англоязычного руководства
При написании автотестов мы часто используем параметризацию — запуск одного и того же теста с разными данными. В этой статье мы разберём, какие задачи решает параметризация и как она реализована в Allure Report.
1. Подготовка
Предварительные требования
Проверьте наличие:
Зависимости
В руководстве используются пакеты:
Пример кода
Исходный код примера:
https://github.com/allure-examples/guide-junit5-parametrization.
Настройка
Для запуска примеров нужны Java и Allure Report.
Настроенный пустой проект с JUnit можно загрузить из Allure Start.
2. Зачем использовать параметризацию
Начнём с простого примера: сложим два числа.
@Testpublic void testSum() { assertEquals(1 + 2, 3);}
Как запустить этот тест на нескольких наборах данных? Первое, что приходит в голову — поместить в тест цикл. Например:
@Testpublic 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]); }}
У этого подхода много недостатков:
-
Если тест падает на одном наборе данных, он не выполняет остальные.
-
Данные предоставляются в массиве, а не в виде именованных переменных, что снижает читаемость. В нашем коротком примере это не так страшно, но при более сложной структуре плохая читаемость создаёт серьёзные неудобства.
-
Отчёт о тестировании показывает только имя теста, а не конкретную итерацию цикла:
Как избавиться от этих недостатков? В 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), что делает тест более читаемым. -
В отчёте каждая итерация параметризованного теста отображается как отдельный тестовый запуск:
Отчёт для параметризванного теста
3. Параметризация в Allure Report
Allure Report интегрируется с JUnit 5 и поддерживает параметризованные тесты. Рассмотрим, как параметризация реализована «под капотом» Allure, и как она отображается в отчётах.
Если просто включить интеграцию Allure для JUnit, параметризованные тесты будут выглядеть как обычные, но с повторами:
Почему так происходит? Дело в том, что 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" } ]}
Как видим, параметры наконец появились в результатах теста. Отчёт находит их и правильно отображает в соответствующем тесте:
4. Заключение
Параметризация — полезный приём, который позволяет запускать один и тот же тест на нескольких наборах данных, не дублируя его и не усложняя циклами. Она делает тесты проще для чтения и легче в поддержке.
Параметризация полностью поддерживается в интеграции Allure-JUnit5. Интеграции постоянно улучшаются, и вероятно, что в будущих версиях параметры можно будет не указывать явно. Тем не менее, текущий подход уже предоставляет всю необходимую функциональность и обеспечивает прозрачность стека.
ссылка на оригинал статьи https://habr.com/ru/articles/1037696/