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 вам на допомогу.