12 інструментів для інтеграційних та unit-тестів у Java
Я вважаю, що розробка програмного забезпечення — щось більше, ніж робота. Я бачу себе ремісником, який щодня намагається стати кращим. Найпростіший шлях для цього — знайти кілька хороших інструментів і відповісти на такі питання:
- Коли я повинен використовувати X інструмент?
- Як я повинен використовувати X інструмент?
Заглянемо в мою скриньку з інструментами
Перед тим, як ви зможете використовувати описані далі інструменти, ви повинні налаштувати складання, яке автоматично запускає інтеграційні та unit-тести. У мене є 2 нотатки на цю тему:
- Інтеграційне тестування з Maven описує, як ми можемо налаштувати Maven-складання з інтеграційними та unit-тестами в різних директоріях.
- Початок роботи з Gradle: інтеграційне тестування з плагіном TestSets описує те саме для Gradle.
Отже, ось 12 інструментів, які я використовую при інтеграційному та unit-тестуванні.
Запуск тестів
JUnit це фреймворк, який я використовую як для unit-, так і для інтеграційних тестів. Мені дуже подобається, т.к. він найпопулярніший, тому має безліч розширень. Також, якщо у вас виникнуть проблеми, знайти рішення буде нескладно.
NestedRunner – розширення для JUnit, яке дозволяє запускати тестові методи із вкладених класів. Мені подобається NestedRunner з низки причин:
- можна замінити довгі імена методів на ієрархію класів у стилі BDD;
- можна позбутися дублюючого коду шляхом переміщення його в настановні методи в потрібних вкладених класах;
- можна оголосити константи у вкладених класах і пов'язати їх із тестами, яким ці константи потрібні.
junit-davaprovider - розширення для JUnit, що дозволяє писати параметризованітести з використанням TestNG як провайдер даних. Це велике поліпшення порівняно із звичайним способом написання параметризованих тестів, який, скажемо прямо, не дуже.
Додатково:
- Unit-тестування з JUnit описує, як писати тести з JUnit 4.X.
- Написання «чистих» тестів: краса в невеликому розмірі розповідає про вирішення проблем, пов'язаних із написанням «чистих» тестів.
- Початок роботи з junit-dataprovider.
- Можливості junit-dataprovider.
- junit-dataprovider — альтернатива параметризованим класам JUnit описує, як перейти від стандартних параметризованих тестів до тестів, які використовують junit-dataprovider.
Макети, заглушки, підміни
Mockito – найпопулярніший фреймворк із підтримкою макетування для unit-тестів. Мені він подобається через простий API, безліч корисних можливостей і чудову документацію.
Greenmail — сервер електронної пошти, який підтримує SMTP, POP3 та IMAP із підтримкою SSL-з'єднання. Він мені подобається через простоту використання. Коли шукав налагоджувальний сервер електронної пошти, переглянувши кілька альтернатив, зупинився на Greenmail, т.к. він працював саме так, як мені потрібно.
MockFtpServer — бібліотека, яка надає дві різні реалізації FTP-сервера («заглушка» та «обманка»), які можна використовувати для тестування різних сценаріїв. Якщо вам потрібно протестувати код, який взаємодіє з FTP-сервером, наш вибір - MockFtpServer.
Додатково:
- Довідник з Mockito — чудовий приклад довідкової документації, яка справді допомагає.
- Інтеграційне тестування IMAP, SMTP та POP3 за допомогою Greenmail.
- Початок роботи з FakeFtpServer.
- Початок роботи зStubFtpServer.
- Що вибрати: FakeFtpServer чи StubFtpServer? Допоможе вирішити, яка реалізація FTP-сервера необхідна проведення того чи іншого тесту.
Твердження
Hamcrest надає інструменти для написання тверджень (assertions) для unit- та інтеграційних тестів. Я його використовую разом із Spring MVC Test Framework.
AssertJ надає гнучкий API для написання тверджень з корисними повідомленнями про помилки, покращує читаність тестового коду, дозволяє перетворити тести на специфікації, що виконуються, які дотримуються потрібної предметно-орієнтованої мови.
Додатково:
- Підручник з Hamcrest.
- Використання Hamcrest у тестуванні розповідає, як використовувати Hamcrest для написання тестів, а також як розширити його можливості за допомогою модулів користувача.
- Огляд AssertJ Core.
- Перетворюємо твердження на предметно-орієнтовану мову розповідає, як створювати твердження користувача в AssertJ.
- Пишемо чисті тести: заміна тверджень предметно-орієнтованою мовою. Розповідає, чому ми повинні замінити стандартні твердження JUnit на власні, які використовують вірну предметно-орієнтовану мову.
Тестування коду доступу до даних
H2 - швидка БД, корисна для написання інтеграційних тестів, що запускаються на локальній машині розробника.
DbUnit - розширення для JUnit, яке може бути використане для ініціалізації БД у відомий стан перед виконанням кожного інтеграційного тесту та заповнення БД потрібними даними. DbUnit має свої недоліки, але це дуже корисний інструмент, що дозволяє розділити тестові дані та тестовий код.
Додатково:
- DbUnit Core Components описуєключові компоненти DbUnit, знання яких необхідне написання тестів з використанням DbUnit.
- Найкращі практики DbUnit надає п'ять правил написання найкращих тестів для коду доступу до даних.
- Написання тестів для коду доступу до даних допоможе вам писати детерміновані тести доступу до даних, які перевіряють потрібну річ, які легко читаються і підтримуються.
Тестування Spring додатків
Spring Test – швейцарський ніж для написання автоматизованих тестів. Він надає першокласну підтримку написання unit- та інтеграційних тестів для додатків, що використовують Spring.
Spring Test DbUnit - інтегрує DbUnit у фреймфорк String Test. Якщо вам потрібно написати тести доступу до даних для програми, що використовує Spring та реляційну БД, то Spring Test DbUnit вам на допомогу.