Сегодня я увидел тестовый пример JUnit с утверждением java вместо утверждений JUnit - есть ли существенные преимущества или недостатки в предпочтении одного над другим?
Сегодня я увидел тестовый пример JUnit с утверждением java вместо утверждений JUnit - есть ли существенные преимущества или недостатки в предпочтении одного над другим?
Ответы:
В JUnit4 исключение (на самом деле Error), вызванное утверждением JUnit, совпадает с ошибкой, вызванной assert
ключевым словом java (AssertionError), поэтому оно точно такое же, как assertTrue
и трассировка стека, и кроме трассировки стека, вы не могли заметить разницу.
При этом утверждения должны запускаться со специальным флагом в JVM, в результате чего многие тесты кажутся пройденными только потому, что кто-то забыл настроить систему с этим флагом при запуске тестов JUnit - нехорошо.
В общем, из-за этого я бы сказал, что использование JUnit assertTrue
- лучшая практика, потому что он гарантирует запуск теста, обеспечивает согласованность (вы иногда используете assertThat
или другие утверждения, которые не являются ключевыми словами java), и если поведение JUnit утверждает должен измениться в будущем (например, подключиться к какому-либо фильтру или другой будущей функции JUnit), ваш код сможет это использовать.
Настоящая цель ключевого слова assert в java - отключить его без штрафа во время выполнения. Это не относится к модульным тестам.
Я предпочитаю утверждения JUnit, поскольку они предлагают более богатый API, чем встроенный assert
оператор, и, что более важно, не нуждаются в явном включении, в отличие от того assert
, для чего требуется -ea
аргумент JVM.
-ea
всегда включен, в нем mvn test
нет необходимости -ea
. Более богатый апи, хороший улов. Иногда мне кажется, что API неправильно используется при тестировании, потому что он не является частью приложения (a в api), я предпочитаю называть его просто более богатыми методами.
Когда тест не проходит, вы получаете дополнительную информацию.
assertEquals(1, 2);
приводит к java.lang.AssertionError: expected:<1> but was:<2>
против
assert(1 == 2);
приводит к java.lang.AssertionError
вы можете получить еще больше информации, если добавите аргумент сообщения в assertEquals
assert 1==2: "1 is not 2";
.
assert
может быть предпочтительнее - для проверок правильности, которые могут повлиять на производительность и, следовательно, лучше всего отключены по умолчанию. Однако мой опыт показывает, что большинство утверждений должно быть постоянно.
Я бы сказал, используйте утверждения JUnit в тестовых примерах и используйте утверждения Java в коде. Другими словами, реальный код никогда не должен иметь зависимостей JUnit, что очевидно, и если это тест, он должен использовать его варианты JUnit, а не assert.
Я бы сказал, что если вы используете JUnit, вам следует использовать утверждения JUnit. assertTrue()
в основном то же самое, что и assert
, иначе зачем вообще использовать JUnit?
Assert
потребуется больше шаблонов. assert
без JUnit вам потребуется написать целую структуру.