Theories в JUnit | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Python Developer. Professional
-3%
Разработчик на Spring Framework
-5%
iOS Developer. Professional
-8%
Golang Developer. Professional
-6%
Базы данных
-12%
Agile Project Manager
-5%
Android Developer. Professional
-11%
Microservice Architecture
-5%
C++ Developer. Professional
-5%
Highload Architect
-6%
JavaScript Developer. Basic
-8%
Kotlin Backend Developer C# Developer. Professional Team Lead Алгоритмы и структуры данных Разработчик программных роботов (RPA) на базе UiPath и PIX Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов Vue.js разработчик VOIP инженер NoSQL Супер-практикум по использованию и настройке GIT Symfony Framework iOS Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool"
Инфраструктура
DevOps практики и инструменты
-12%
Базы данных
-12%
Network engineer. Basic
-10%
Network engineer
-4%
Экcпресс-курс «ELK»
-10%
Инфраструктурная платформа на основе Kubernetes
-6%
Administrator Linux.Basic Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Разработчик IoT
-13%
Основы Windows Server Разработчик программных роботов (RPA) на базе UiPath и PIX Reverse-Engineering. Professional Внедрение и работа в DevSecOps Administrator Linux. Advanced Infrastructure as a code in Ansible Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Экспресс-курс «IaC Ansible»
Специализации Курсы в разработке Подготовительные курсы
+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 комментариев
Для комментирования необходимо авторизоваться