Я не хочу assertJ assertThat завершает тест, когда утверждение не выполняется

Я использую assertJ и использую несколько утверждений assertThat в моем тестовом примере. Когда первое утверждение терпит неудачу, тест завершается, но я этого не хочу. Я хотел бы получить информацию обо всех ошибочных утверждениях после однократного выполнения тестового примера. Есть ли способ сделать это? Я нашел решение с SoftAssertions здесь -> http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#soft-assertions, но некрасиво добавлять переменную. перед каждым assertThat


person kris82pl    schedule 13.06.2018    source источник
comment
Я заметил, что ваш вопрос все еще открыт: вы не приняли ответ. Посмотрите и решите, хотите ли вы принять ответ. Или дайте мне знать, если я могу что-то сделать, чтобы усилить свой вклад и сделать его достойным принятия. Принятие помогает будущим читателям определить, решена ли проблема, и выражает признательность людям, которые нашли время, отвечая вам.   -  person GhostCat    schedule 02.10.2018


Ответы (3)


Небольшой пример кода может помочь, но тогда это скорее теоретическая проблема, поскольку реальный ответ таков: рассмотрите возможность отсутствия нескольких утверждений в одном тестовом вызове!

Значение: идея неудачного теста заключается в том, чтобы как можно быстрее решить проблему. Когда вы объединяете несколько утверждений в один тест, вы по умолчанию усложняете нашу жизнь. Потому что вместо того, чтобы знать, что «тест X с утверждением Y не прошел», вы должны сначала очень внимательно изучить журналы, чтобы определить, какие утверждения прошли, а какие - нет.

Поэтому рекомендуется не помещать несколько утверждений / проверок в один тест.

person GhostCat    schedule 13.06.2018
comment
Привет, дорогой! Всегда приятно читать твой пост и оглядываться! Согласитесь, что неудачный тест поможет вам как можно быстрее решить проблему. но меньше соглашаться с практикой - не помещать несколько утверждений / проверок в один тест. - person davidxxx; 14.06.2018

Если вам не нравятся мягкие утверждения, вы можете попробовать JUnit 5 assertAll но в противном случае я бы последовал совету @GhostCat и попытался бы утверждать что-то одно для каждого теста (что обычно приводит только к нескольким утверждениям).

person Joel Costigliola    schedule 14.06.2018
comment
Пример assertAll в указанном вопросе кажется чем-то, чего мы вполне можем достичь с помощью превосходного assertThat(...).extracting(...).containsExactly(...) вашей библиотеки! Спасибо за это :) - person davidxxx; 14.06.2018

Я думаю, что в некоторых случаях вы можете, а иногда даже должны утверждать несколько вещей в одном методе тестирования, если ваш метод выполняет несколько изменений, которые вы должны проверять на разных уровнях / абстракции.
Например, когда вы тестируете метод, который добавляет элемент в объект, который его хранит, вы можете утверждать, что количество элементов, содержащихся в объекте, было увеличено на единицу, но вы также можете проверить правильность нового элемента добавлены относительно его значений.
У вас есть два уровня / абстракции: объект, содержащий элемент, имеющий "прямое / основное" состояние, и элементы, которые он содержит, которые имеют свои собственные состояния.

Разделив его на два утверждения, он даст тест, который выглядит так:

@Test
public void addElt(){
    foo.addElt(new Element("a name", "a role"));

    assertThat(foo).extracting(Foo::getSize)
                   .contains(actualSize+1);    
    assertThat(foo.getLastElt()).extracting(Element::getName, Element::getRole)
                                .containsExactly(addedElt.getName(), addedElt.getRole());
}

Итак, зачем пытаться объединить два утверждения, которые проверяют две разные вещи?
Действительно ли это полезно для отладки вашего теста?
Я так не думаю.
Попытка подтвердить изменения на двух уровнях абстракции в одном утверждении явно не имеет смысла: сложные и бесполезные шумы.
Если первое утверждение терпит неудачу:

assertThat(foo).extracting(Foo::getSize)
               .contains(actualSize+1);  

Скорее всего, это означает, что элемент не был добавлен.
Итак, в этом случае выполняется второе утверждение:

assertThat(foo.getLastElt()).extracting(Element::getName, Element::getRole)
                            .containsExactly(addedElt.getName(), addedElt.getRole());

не имеет смысла, так как очень вероятно, что это также будет ошибкой.
Разработчик, который выполняет проверку на отказ, должен иметь только полезную информацию, а не шум, который может усложнить его решение. Так что отзывы о размере, который не соответствует ожидаемому, - это как раз то, что вам нужно.

То, что я пытаюсь объяснить, подходит для AssertJ, как и для любой среды тестирования.

person davidxxx    schedule 14.06.2018
comment
Хороший. Теперь будем надеяться, что ОП вернется, чтобы принять один из ответов в какой-то момент. - person GhostCat; 14.06.2018
comment
Подожди и посмотри, как мы говорим :) - person davidxxx; 14.06.2018