|
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]); } }
У этого подхода много недостатков:
- Если тест падает на одном наборе данных, он не выполняет остальные.
- Данные предоставляются в массиве, а не в виде именованных переменных, что снижает читаемость. В нашем коротком примере это не так страшно, но при более сложной структуре плохая читаемость создаёт серьёзные неудобства.
- Отчёт о тестировании показывает только имя теста, а не конкретную итерацию цикла:

Отчёт для теста с циклом Как избавиться от этих недостатков? В 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 нужно передать информацию о параметрах. Чтобы понять, какие данные получает 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" } ] }
Как видим, параметры наконец появились в результатах теста. Отчёт находит их и правильно отображает в соответствующем тесте:

Отчёт Allure с параметрами 4. Заключение Параметризация — полезный приём, который позволяет запускать один и тот же тест на нескольких наборах данных, не дублируя его и не усложняя циклами. Она делает тесты проще для чтения и легче в поддержке. Параметризация полностью поддерживается в интеграции Allure-JUnit5. Интеграции постоянно улучшаются, и вероятно, что в будущих версиях параметры можно будет не указывать явно. Тем не менее, текущий подход уже предоставляет всю необходимую функциональность и обеспечивает прозрачность стека.-Источник
|