2010-06-03 3 views
61

Сегодня я видел тестовый пример JUnit с утверждением java вместо утверждений JUnit. Есть ли существенные преимущества или недостатки, чтобы отдать предпочтение одному другому?утверждают против JUnit Assertions

+4

Я думаю, что этот вопрос должен быть вновь открыт: верхний ответ чрезвычайно полезен. – jakebeal

+0

Существуют абсолютно фактические различия между утверждениями JUnit и ключевым словом Java assert. Это вовсе не вопрос, основанный на мнениях. –

ответ

78

В JUnit4 исключение (на самом деле ошибка), отбрасываемая JUnit утверждают одно и то же, как ошибка, брошенной в Java assert ключевое слово (AssertionError), так что это точно так же, как assertTrue и, кроме трассировки стека вы не мог» t сказать разницу.

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

В общем, из-за этого, я бы сказал, что с помощью JUnit assertTrue является лучшей практикой, поскольку она гарантирует испытание проводится, обеспечивает согласованность (иногда использовать assertThat или другой утверждает, что не ява ключевое слово) и если поведение утверждений JUnit должно измениться в будущем (например, подключиться к некоторому фильтру или другой будущей функции JUnit), ваш код сможет использовать это.

Настоящая цель ключевого слова assert в java заключается в том, чтобы отключить его без штрафа за выполнение. Это не относится к модульным тестам.

24

Я предпочитаю JUnit утверждения, поскольку они предлагают более богатый API, чем встроенный в assert заявлении и, что более важно, не должны быть явно включены в отличие от assert, что требует -ea JVM аргумент.

+0

'-ea' всегда включен в' mvn test', не нужно '-ea'. Более богатый апи, хороший улов. Иногда я думаю, что API неправильно используется в тесте, потому что он не является частью приложения (a в api), я предпочитаю называть его только более богатыми методами. –

0

Я бы сказал, что если вы используете JUnit, вы должны использовать утверждения JUnit. assertTrue() в основном то же самое, что и assert, иначе зачем использовать JUnit?

+2

Вы должны использовать JUnit для тестовой рамки. Утверждения действительно являются небольшой частью значения, которое дает JUnit. JUnit без 'Assert' потребует больше шаблонов. 'assert' без JUnit потребует от вас написать целую структуру. – Yishai

+0

Я больше говорил, если вы собираетесь использовать инструмент, ИСПОЛЬЗУЙТЕ ИНСТРУМЕНТ. регулярные старые утверждения утверждают кажутся глупыми в тестах JUnit. На мой взгляд, они принадлежат реальному коду. – CheesePls

+0

@CheesePls «обычные старые утверждения» на самом деле более поздние, чем утверждает JUnit. – dolmen

0

Это может быть неприменимым, если вы используете исключительно блестящие и новые вещи, но утверждение не было введено в Java до 1.4SE. Поэтому, если вы должны работать в среде со старыми технологиями, вы можете склониться к JUnit по соображениям совместимости.

11

Когда тест не проходит, вы получаете больше информации.

assertEquals(1, 2); приводит java.lang.AssertionError: expected:<1> but was:<2>

против

assert(1 == 2); результатов в java.lang.AssertionError

вы можете получить еще больше информации, если вы добавляете сообщение аргумент assertEquals

+2

try 'assert 1 == 2:" 1 не 2 ";'. –

+0

@PeterRader Попробуйте использовать ключевое слово assert, когда -ea не включен. Или еще лучше, используйте утверждения JUnit, которые всегда работают. –

+0

@ThomasW, когда -ea не позволяет его не тестировать. JUnit asserations не всегда работает, они работают только, если вы решили использовать JUnit, что такое фреймворк, а в случае maven - зависимость от maven - зависимость от maven, которая должна быть только в тестовой области. У нас есть две стороны: что вы предпочитаете? ** 1st Side **: используйте фреймворк в качестве зависимости только в тестовой области, который должен быть загружен, что eclipse позволяет использовать в классах, которые не находятся в папке src/main, но не компилируются там, потому что maven имеет junit только в области проверки или ** 2-й стороне **: используйте встроенный материал. –

5

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