Несколько дней новогоднего волшебства:
Успейте начать обучение в 2018-ом году со скидкой до 30%!
Выбрать курс

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!

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