Рубрики
Без рубрики

Улучшайте свои модульные тесты с помощью Assert

Вы, вероятно, пишете модульные тесты, если нет, то, вероятно, вам следует это сделать. За годы своей карьеры я сделал многое… Помеченный как java, тестирование.

Вы, вероятно, пишете модульные тесты, если нет, то, вероятно, вам следует это сделать. За годы своей карьеры я провел множество семинаров, выступлений и т. Д. О том, как правильно их писать. Один из пунктов, который я всегда подчеркиваю, заключается в том, чтобы иметь понятные результаты этих тестов. Нет ничего хуже, чем провал модульного теста с сообщением типа 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 a  element

Я очень сильно влюблен в эту библиотеку. Это очень просто для начала и значительно улучшает ваши тесты. Я рекомендую вам начать использовать его сегодня (также погрузитесь в их документацию, там есть еще много чего для AssertJ).

Для получения дополнительных советов, подобных этому, вы можете следовать за мной по ссылке Твиттер .

Оригинал: “https://dev.to/pavel_polivka/improve-your-unit-tests-with-assertj-35m2”