← Назад ко всем вопросам

Parameterized tests: зачем и когда использовать

1️⃣ Как кратко ответить

Parameterized tests позволяют запускать один и тот же тестовый метод с разными наборами данных, что упрощает тестирование различных сценариев и улучшает покрытие кода. Они используются, когда необходимо протестировать метод с множеством входных значений, чтобы убедиться в его корректной работе в различных ситуациях.

2️⃣ Подробное объяснение темы

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

Зачем нужны параметризованные тесты?

  1. Уменьшение дублирования кода: Вместо написания нескольких тестовых методов для каждого набора данных, вы пишете один тестовый метод и предоставляете ему различные данные.
  2. Улучшение покрытия тестов: Позволяет легко протестировать метод с множеством различных входных значений, что увеличивает вероятность обнаружения ошибок.
  3. Упрощение поддержки тестов: Изменение логики теста или добавление новых наборов данных требует изменения только в одном месте.

Когда использовать параметризованные тесты?

  • Когда метод должен быть протестирован с различными наборами входных данных.
  • Когда необходимо убедиться, что метод корректно обрабатывает как допустимые, так и недопустимые значения.
  • Когда тестирование одного и того же поведения с разными данными может выявить скрытые ошибки.

Пример использования в JUnit 5

В JUnit 5 параметризованные тесты реализуются с помощью аннотации @ParameterizedTest и различных источников данных, таких как @ValueSource, @CsvSource, @MethodSource и другие.

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.assertTrue;
​
public class ParameterizedTestExample {
​
    // Тестовый метод, который будет запускаться с разными входными данными
    @ParameterizedTest
    // Аннотация @ValueSource указывает, что тест будет запущен с каждым из указанных значений
    @ValueSource(strings = {"racecar", "radar", "level"})
    void testIsPalindrome(String candidate) {
        // Проверка, что строка является палиндромом
        assertTrue(isPalindrome(candidate));
    }
​
    // Метод, который проверяет, является ли строка палиндромом
    private boolean isPalindrome(String str) {
        // Сравниваем строку с её перевёрнутой версией
        return str.equals(new StringBuilder(str).reverse().toString());
    }
}

Объяснение кода:

  • @ParameterizedTest: Аннотация, которая указывает, что метод является параметризованным тестом.
  • @ValueSource(strings = {"racecar", "radar", "level"}): Указывает, что тестовый метод будет выполнен трижды, по одному разу для каждого из указанных значений.
  • testIsPalindrome(String candidate): Тестовый метод, который принимает строку и проверяет, является ли она палиндромом.
  • assertTrue(isPalindrome(candidate)): Утверждение, что метод isPalindrome возвращает true для переданной строки.
  • isPalindrome(String str): Метод, который проверяет, является ли строка палиндромом, сравнивая её с перевёрнутой версией.

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

Тема: Тестирование
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки