Theories в JUnit
Часто случается, что в 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!