Сьогодні я побачив тестовий приклад JUnit із твердженням Java замість тверджень JUnit - чи є суттєві переваги чи недоліки, щоб віддати перевагу одному перед іншим?
Сьогодні я побачив тестовий приклад JUnit із твердженням Java замість тверджень JUnit - чи є суттєві переваги чи недоліки, щоб віддати перевагу одному перед іншим?
Відповіді:
У JUnit4 виняток (насправді Помилка), викинутий твердженням 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 in 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, ніколи не стверджувати.
Я б сказав, що якщо ви використовуєте JUnit, ви повинні використовувати твердження JUnit. assertTrue()
в основному те саме assert
, що інакше навіщо взагалі використовувати JUnit?
Assert
не потрібно більше шаблону. assert
без JUnit потрібно було б написати цілий фреймворк.