12 инструментов для интеграционных и unit-тестов в Java
37К открытий38К показов
Я считаю, что разработка ПО — нечто большее, чем работа. Я вижу себя ремесленником, который каждый день пытается стать лучше. Самый «простой» путь для этого — найти несколько хороших инструментов и ответить на следующие вопросы:
- Когда я должен использовать инструмент X?
- Как я должен использовать инструмент X?
Автоматизированное тестирование — очень важная часть разработки ПО, но в блогах программистов немного постов про используемые инструменты. Эта же статья позволит вам заглянуть в мой «ящик с инструментами». Я расскажу о 12-ти библиотеках и фреймворках, которые я использую для написания unit- и интеграционных тестов, а также предоставлю ссылки на страницы, которые помогут вам понять, как их использовать.
Заглянем в мой ящик с инструментами
Перед тем, как вы сможете использовать описанные далее инструменты, вы должны настроить сборку, которая автоматически запускает интеграционные и 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.
Макеты, заглушки, подмены
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 вам в помощь.
Дополнительно:
- Справочник по Spring. Раздел 11: тестирование.
- Руководсто по Spring MVC Test рассказывает о написании unit- и интеграционных тестов для контроллеров Spring MVC.
- Руководсто по Spring Data JPA: интеграционное тестирование.
- Spring на передовой: использование Null-значений в наборах данных DbUnit.
- Spring на передовой: сбрасываем поля с автоинкрементом перед каждым тестовым методом.
Перевод статьи «12 Tools That I Use for Writing Unit and Integration Tests»
37К открытий38К показов