Вы, вероятно, пишете модульные тесты, если нет, то, вероятно, вам следует это сделать. За годы своей карьеры я провел множество семинаров, выступлений и т. Д. О том, как правильно их писать. Один из пунктов, который я всегда подчеркиваю, заключается в том, чтобы иметь понятные результаты этих тестов. Нет ничего хуже, чем провал модульного теста с сообщением типа Failed. Верно
что ты должен с этим делать? Со стандартными функциями утверждений, предоставляемыми всеми платформами тестирования, вы можете немного улучшить это, используя правильные функции, предоставляя дополнительные сообщения и т.д… Это не идеально, и иногда это требует много работы.
А вот и AssertJ . Это простая библиотека, предназначенная для улучшения ваших утверждений. Я бы счел это необходимым для моих нужд в тестировании. Он предоставляет широкий спектр утверждений, современных сообщений об ошибках. Кроме того, это улучшает читаемость кода, очень просто понять, что вы хотите утверждать.
Установка
AssertJ доступен в Maven central, поэтому установка так же проста, как добавление тестовой зависимости.
org.assertj assertj-core 3.19.0 test
Использование
В этой статье я рассмотрю несколько примеров того, насколько удивителен AssertJ. Эти примеры будут выполнены в JUnit 5 со следующей структурой.
class DtoComparisonTest { @Test void testComparison() { var x = new TestedDto("a", "c", new TestedNestedDto(1, 2)); var y = new TestedDto("a", "b", new TestedNestedDto(1, 3)); Assertions.assertThat(x).isEqualTo(y); } @Data @AllArgsConstructor private static class TestedDto { String firstString; String secondString; TestedNestedDto nested; } @Data @AllArgsConstructor private static class TestedNestedDto { int firstInt; int secondInt; } }
В этом примере сравнивается x
и y
объекты и выводит следующие сообщения об ошибках.
org.opentest4j.AssertionFailedError: Expecting:to be equal to: but was not. Expected :DtoComparisonTest.TestedDto(firstString=a, secondString=b, nested=DtoComparisonTest.TestedNestedDto(firstInt=1, secondInt=3)) Actual :DtoComparisonTest.TestedDto(firstString=a, secondString=c, nested=DtoComparisonTest.TestedNestedDto(firstInt=1, secondInt=2))
Насколько это потрясающе?
В нем есть множество встроенных утверждений для String. Давайте рассмотрим несколько примеров:
@Test void testComparison() { var x = new TestedDto("Dragon", "Goblin", new TestedNestedDto(1, 2)); Assertions.assertThat(x.getFirstString()) .startsWith("D") .endsWith("n") .isLowerCase(); }
Это приведет к выводу
java.lang.AssertionError: Expecting <"Dragon"> to be a lowercase
Представьте, что вы делаете это и получаете тот же результат с обычными утверждениями.
В нем также есть множество встроенных модулей для коллекций.
@Test void testComparison() { var x = new TestedDto("a", "b", new TestedNestedDto(1, 2)); var y = new TestedDto("c", "d", new TestedNestedDto(1, 2)); var collection = Arrays.asList(x, y); Assertions.assertThat(collection) .hasSize(2) .contains(x) .allMatch(tested -> tested.getNested().getFirstInt() == 1) .anyMatch(tested -> tested.getSecondString().equals("b")) .containsNull(); }
Выводит это сообщение об ошибке
java.lang.AssertionError: Expecting: <[DtoComparisonTest.TestedDto(firstString=a, secondString=b, nested=DtoComparisonTest.TestedNestedDto(firstInt=1, secondInt=2)), DtoComparisonTest.TestedDto(firstString=c, secondString=d, nested=DtoComparisonTest.TestedNestedDto(firstInt=1, secondInt=2))]> to contain aelement
Я очень сильно влюблен в эту библиотеку. Это очень просто для начала и значительно улучшает ваши тесты. Я рекомендую вам начать использовать его сегодня (также погрузитесь в их документацию, там есть еще много чего для AssertJ).
…
Для получения дополнительных советов, подобных этому, вы можете следовать за мной по ссылке Твиттер .
Оригинал: “https://dev.to/pavel_polivka/improve-your-unit-tests-with-assertj-35m2”