Сьогодні я побачив тестовий приклад 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 потрібно було б написати цілий фреймворк.