Я использую assertJ и использую несколько утверждений assertThat в моем тестовом примере. Когда первое утверждение терпит неудачу, тест завершается, но я этого не хочу. Я хотел бы получить информацию обо всех ошибочных утверждениях после однократного выполнения тестового примера. Есть ли способ сделать это? Я нашел решение с SoftAssertions здесь -> http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#soft-assertions, но некрасиво добавлять переменную. перед каждым assertThat
Я не хочу assertJ assertThat завершает тест, когда утверждение не выполняется
Ответы (3)
Небольшой пример кода может помочь, но тогда это скорее теоретическая проблема, поскольку реальный ответ таков: рассмотрите возможность отсутствия нескольких утверждений в одном тестовом вызове!
Значение: идея неудачного теста заключается в том, чтобы как можно быстрее решить проблему. Когда вы объединяете несколько утверждений в один тест, вы по умолчанию усложняете нашу жизнь. Потому что вместо того, чтобы знать, что «тест X с утверждением Y не прошел», вы должны сначала очень внимательно изучить журналы, чтобы определить, какие утверждения прошли, а какие - нет.
Поэтому рекомендуется не помещать несколько утверждений / проверок в один тест.
Если вам не нравятся мягкие утверждения, вы можете попробовать JUnit 5 assertAll но в противном случае я бы последовал совету @GhostCat и попытался бы утверждать что-то одно для каждого теста (что обычно приводит только к нескольким утверждениям).
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, как и для любой среды тестирования.