твердження проти тверджень JUnit


85

Сьогодні я побачив тестовий приклад JUnit із твердженням Java замість тверджень JUnit - чи є суттєві переваги чи недоліки, щоб віддати перевагу одному перед іншим?


Існують абсолютно фактичні відмінності між твердженнями JUnit та ключовим словом Java "assert". Це зовсім не питання, засноване на думках.
Thomas W

Відповіді:


95

У JUnit4 виняток (насправді Помилка), викинутий твердженням JUnit, є таким самим, як помилка, викинуте assertключовим словом java (AssertionError), тому він точно такий же, як assertTrueі крім трасування стека, і ви не зможете відрізнити.

З огляду на це, твердження повинні виконуватися зі спеціальним прапором у JVM, змушуючи багато тестів здаватися пройденими лише тому, що хтось забув налаштувати систему з цим прапором під час запуску тестів JUnit - недобре.

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

Справжня мета ключового слова assert у Java - мати можливість вимкнути його без штрафу за час роботи. Це не стосується модульних тестів.


26

Я віддаю перевагу твердженням JUnit, оскільки вони пропонують більш багатий API, ніж вбудований assertоператор, і, що ще важливіше, їх не потрібно чітко вмикати, на відміну від цього assert, що вимагає -eaаргумент JVM.


1
-eaзавжди ввімкнено mvn test, немає необхідності в -ea. Багатіший апі, хороший улов. Іноді я думаю, що в тесті API використовується неправильно, оскільки він не є частиною програми (a in api), я вважаю за краще називати його просто багатшими методами.
Похмурий

19

Коли тест не вдається, ви отримуєте більше інформації.

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

проти

assert(1 == 2); призводить до java.lang.AssertionError

Ви можете отримати ще більше інформації, якщо додати аргумент повідомлення до assertEquals


9
спробуй assert 1==2: "1 is not 2";.
Похмурий

@PeterRader Спробуйте ключове слово assert, коли параметр -ea не ввімкнено. Або ще краще, використовуйте твердження JUnit, які завжди працюють.
Thomas W

1
@ThomasW, коли -ea не ввімкнено, це не тест. Складання JUnit не завжди працюють, вони працюють лише в тому випадку, якщо ви вирішили використовувати JUnit, що є фреймворком, а у випадку Maven залежність maven - залежність maven, яка повинна знаходитись лише в тестовій області. У нас тут дві сторони: Що ти віддаєш перевагу? 1-я сторона : Використовуйте фреймворк як залежність лише в обсязі тесту, який потрібно завантажити, що eclipse дозволить вам використовувати в класах, які не знаходяться в папці src / main-, але не будуть там компілювати, оскільки maven має junit лише в сфера дії або друга сторона : використовуйте вбудовані матеріали.
Похмурий

1
@PeterRader Це питання стосується тестів JUnit. У цьому контексті слід використовувати JUnit або подібний клас твердження, оскільки вони завжди ввімкнені. Мене особисто впіймало те, що в минулому не було активовано ключове слово Java "assert", і я не вважаю, що ненадійні твердження мають місце в тестовому коді.
Thomas W

В окремому контексті тверджень у коді функцій - важливих для надійної практики програмування, хоча насправді не є питанням питання - і Spring, і Google Guava мають класи тверджень, які завжди ввімкнено. Я рекомендую щедро використовувати їх як передумови параметрів і стану для забезпечення правильності. Крім того, в продуктивності критично важливих областях, може бути невелика область , де Java assertможе бути краще - для коректності перевірок , які будуть впливати на продуктивність і, таким чином , краще всього за замовчуванням відключені. Однак мій досвід полягає в тому, що більшість тверджень мають бути постійними.
Thomas W

8

Я б сказав, що використовую твердження JUnit у тестових випадках, а в коді використовую утвердження Java. Іншими словами, реальний код ніколи не повинен мати залежностей JUnit, як очевидних, і якщо це тест, він повинен використовувати його варіанти JUnit, ніколи не стверджувати.


0

Я б сказав, що якщо ви використовуєте JUnit, ви повинні використовувати твердження JUnit. assertTrue()в основному те саме assert, що інакше навіщо взагалі використовувати JUnit?


4
Ви б використовували JUnit для тестової роботи. Твердження - це справді мала частина цінності, яку надає вам JUnit. Для JUnit без Assertне потрібно більше шаблону. assertбез JUnit потрібно було б написати цілий фреймворк.
Yishai

1
Я більше говорив, якщо ви збираєтеся використовувати інструмент, ЗАСТОСУЙТЕ ІНСТРУМЕНТ. звичайні старі твердження твердження здаються трохи дурними у тестах JUnit. На мою думку, вони належать до фактичного коду.
CheesePls

1
@CheesePls "регулярні старі твердження" стверджують "насправді новіші, ніж стверджує JUnit.
долмен

0

Це може не застосовуватися, якщо ви використовуєте виключно речі, які є блискучими та новими, але assert не був введений в Java до 1.4SE. Тому, якщо вам доведеться працювати в середовищі зі старими технологіями, ви можете схилятися до JUnit з міркувань сумісності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.