Theories в JUnit | OTUS
⚡ Открываем подписку на курсы!
Проходите параллельно 3 онлайн-курса в месяц по цене одного.
Подробнее

Курсы

Программирование
Программист 1С Реверс-инжиниринг. Продвинутый курс
-16%
Java Developer. Professional
-17%
JavaScript Developer. Professional
-18%
Flutter Mobile Developer
-15%
JavaScript Developer. Basic
-16%
Highload Architect
-10%
Нереляционные базы данных
-17%
Подготовка к сертификации Oracle Java Programmer (OCAJP)
-8%
Алгоритмы и структуры данных
-12%
Архитектура и шаблоны проектирования
-14%
Framework Laravel
-13%
IoT-разработчик
-12%
Team Lead
-15%
VOIP инженер Разработчик C# Разработчик на Spring Framework AWS для разработчиков Cloud Solution Architecture CI/CD Vue.js разработчик Разработчик Node.js Scala-разработчик Супер - интенсив по Kubernetes Symfony Framework Advanced Fullstack JavaScript developer
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Theories в JUnit

JavaDeep_07.06_Site.png

Часто случается, что в unit-тестировании выполняется серия тестов, которые отличаются только входными значениями и ожидаемыми результатами. Обычный @Test метод позволяет проверить поведение в одном конкретном сценарии. Что делать, если хочется протестировать некоторую функциональность на некотором множестве входных данных?

Предположим, что у нас есть метод, который валидирует ip-адреса, и мы должны проверить корректность валидации. Если тестировать возможные случаи, то так или иначе будет создан некоторый шаблонный код. В данном случае было бы удобно предоставить тестирующему методу набор входных значений и ожидаемых результатов.

JUnit Theories позволяет проверить предполагаемое поведение на потенциально бесконечном множестве потенциальных сценариев.

public class IPUtils {
    private static final Pattern IP_ADDRESS_PATTERN = Pattern.compile(
        "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");

    public static boolean isValidIP(String ip) {
        return IP_ADDRESS_PATTERN.matcher(ip).matches();
    }

    private IPUtils() {
    }
}

@RunWith(Theories.class)
public class IPUtilsTest {

    @DataPoints("TEST_SET")
    public static Pair[] testSet() {
        return new Pair[] {
            new Pair<>("192.168.1.1", true),
            new Pair<>("123", false),
            new Pair<>("0.0.0.0", true),
            new Pair<>("127.0.0.1", true),
            new Pair<>("1234.233.22.12", false),
            new Pair<>("172.16.256.39", false),
            new Pair<>("123.23,23.1", false),
            new Pair<>("asd.asd.ddd.d", false)
        };
    }

    @Theory
    public void testIsValidIP(@FromDataPoints("TEST_SET") Pair<String, Boolean> pair) {
        assertThat(IPUtils.isValidIP(pair.getKey()), is(pair.getValue()));
    }
}

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

Интересно попробовать? Загляните на GitHub!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться