HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: java, junit, theories, тестирование, проверка валидации ip-адресов</p>
1 <p>Теги: java, junit, theories, тестирование, проверка валидации ip-адресов</p>
2 <p>Часто случается, что в unit-тестировании выполняется серия тестов, которые отличаются только входными значениями и ожидаемыми результатами. Обычный @Test метод позволяет проверить поведение в одном конкретном сценарии. Что делать, если хочется протестировать некоторую функциональность на некотором множестве входных данных?</p>
2 <p>Часто случается, что в unit-тестировании выполняется серия тестов, которые отличаются только входными значениями и ожидаемыми результатами. Обычный @Test метод позволяет проверить поведение в одном конкретном сценарии. Что делать, если хочется протестировать некоторую функциональность на некотором множестве входных данных?</p>
3 <p>Предположим, что у нас есть метод, который валидирует ip-адреса, и мы должны проверить корректность валидации. Если тестировать возможные случаи, то так или иначе будет создан некоторый шаблонный код. В данном случае было бы удобно предоставить тестирующему методу набор входных значений и ожидаемых результатов.</p>
3 <p>Предположим, что у нас есть метод, который валидирует ip-адреса, и мы должны проверить корректность валидации. Если тестировать возможные случаи, то так или иначе будет создан некоторый шаблонный код. В данном случае было бы удобно предоставить тестирующему методу набор входных значений и ожидаемых результатов.</p>
4 <p>JUnit Theories позволяет проверить предполагаемое поведение на потенциально бесконечном множестве потенциальных сценариев.</p>
4 <p>JUnit Theories позволяет проверить предполагаемое поведение на потенциально бесконечном множестве потенциальных сценариев.</p>
5 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&lt;&gt;("192.168.1.1", true), new Pair&lt;&gt;("123", false), new Pair&lt;&gt;("0.0.0.0", true), new Pair&lt;&gt;("127.0.0.1", true), new Pair&lt;&gt;("1234.233.22.12", false), new Pair&lt;&gt;("172.16.256.39", false), new Pair&lt;&gt;("123.23,23.1", false), new Pair&lt;&gt;("asd.asd.ddd.d", false) }; } @Theory public void testIsValidIP(@FromDataPoints("TEST_SET") Pair&lt;String, Boolean&gt; pair) { assertThat(IPUtils.isValidIP(pair.getKey()), is(pair.getValue())); } }<p>Использование предположений и утверждений вместе с покрытием множеством сценариев с различными точками данных помогает сделать тесты более гибкими и выразительными, а также теории очень удобно использовать для поиска ошибок в граничных случаях.</p>
5 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&lt;&gt;("192.168.1.1", true), new Pair&lt;&gt;("123", false), new Pair&lt;&gt;("0.0.0.0", true), new Pair&lt;&gt;("127.0.0.1", true), new Pair&lt;&gt;("1234.233.22.12", false), new Pair&lt;&gt;("172.16.256.39", false), new Pair&lt;&gt;("123.23,23.1", false), new Pair&lt;&gt;("asd.asd.ddd.d", false) }; } @Theory public void testIsValidIP(@FromDataPoints("TEST_SET") Pair&lt;String, Boolean&gt; pair) { assertThat(IPUtils.isValidIP(pair.getKey()), is(pair.getValue())); } }<p>Использование предположений и утверждений вместе с покрытием множеством сценариев с различными точками данных помогает сделать тесты более гибкими и выразительными, а также теории очень удобно использовать для поиска ошибок в граничных случаях.</p>
6 <p>Интересно попробовать? Загляните на<a>GitHub</a>!</p>
6 <p>Интересно попробовать? Загляните на<a>GitHub</a>!</p>
7  
7