Parameterized tests: зачем и когда использовать
1️⃣ Как кратко ответить
Parameterized tests позволяют запускать один и тот же тестовый метод с разными наборами данных, что упрощает тестирование различных сценариев и улучшает покрытие кода. Они используются, когда необходимо протестировать метод с множеством входных значений, чтобы убедиться в его корректной работе в различных ситуациях.
2️⃣ Подробное объяснение темы
Parameterized tests — это подход в тестировании, который позволяет запускать один и тот же тестовый метод с различными наборами входных данных. Это особенно полезно, когда необходимо проверить поведение кода с разными входными значениями, не дублируя тестовый код.
Зачем нужны параметризованные тесты?
- Уменьшение дублирования кода: Вместо написания нескольких тестовых методов для каждого набора данных, вы пишете один тестовый метод и предоставляете ему различные данные.
- Улучшение покрытия тестов: Позволяет легко протестировать метод с множеством различных входных значений, что увеличивает вероятность обнаружения ошибок.
- Упрощение поддержки тестов: Изменение логики теста или добавление новых наборов данных требует изменения только в одном месте.
Когда использовать параметризованные тесты?
- Когда метод должен быть протестирован с различными наборами входных данных.
- Когда необходимо убедиться, что метод корректно обрабатывает как допустимые, так и недопустимые значения.
- Когда тестирование одного и того же поведения с разными данными может выявить скрытые ошибки.
Пример использования в 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): Метод, который проверяет, является ли строка палиндромом, сравнивая её с перевёрнутой версией.
Параметризованные тесты позволяют легко и эффективно проверять различные сценарии, улучшая качество и надежность тестируемого кода.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться