06.07.2022

Unit тестирование в Java

Сергей Немчинский
6 минут просмотра
Unit тестирование в Java

Unit тест — это небольшая программа, которая тестирует работу отдельного отрезка кода. Задача теста — убедиться, что именно этот участок кода функционирует нормально, выполняет свою задачу в разных условиях, и не мешает работе других участков кода и всего продукта.

Не все разработчики любят unit-тесты: они отнимают много времени. Когда раз за разом unit тест показывает, что код работает нормально, зачем тестировать то, что и так работает? Но в коммерческой разработке без тестирования никуда, включая разработку на Java. Поговорим о java unit тестах, как они работают и когда нужно их использовать.

Для чего нужны Unit тесты

Любой программный продукт, код которого не покрыт тестами, обречен на медленную мучительную смерть. Даже если поначалу такая программа работает нормально, довольно быстро она начинает сбоить, выдавать ошибки, и в конце концов, работать с ней становится невозможно. Даже если такая программа функционирует, никто не понимает, что происходит внутри, особенно если разработчики кода давно покинули проект.

Тесты используются на разных уровнях: например, верхнеуровневые тесты проверяют программу на соответствие бизнес-логике. Но для тестирования отдельного модуля вовсе необязательно прогонять всю программу через полный пользовательский сценарий. Достаточно изолировать нужный отрезок кода и заставить его выполнить свою функцию. Это и есть Unit тестирование — «unit» переводится как модуль.

Тестирование может быть ручным и автоматизированным, но если речь идет о Unit тестах, они чаще бывают автоматическими. При ручном тестировании используется пошаговая инструкция. Автоматический Unit test — это небольшая программа, которая эмулирует пользовательские действия. Unit тестами можно проверять отдельную функцию, процедуру, метод, модуль или объект.

Созданием Unit тестов занимаются тестировщики-автоматизаторы или разработчики. Модульное тестирование может быть простым или сложным, в зависимости от стратегий, принципов и инструментов тестирования в команде. Главное, о чем не следует забывать: тесты должны не только существовать в системе, но запускаться и поддерживаться. Иначе никакого смысла в их написании нет.

Применение Unit тестов

Есть несколько основных сценариев, при которых стоит писать Unit тесты.

  • Легкий рефакторинг

При легком рефакторинге, то есть внесении элементов в код, модульное тестирование позволят быстро выявить проблемы новых элементов кода.

  • Интеграционное тестирование

Интеграционное тестирование — это тесты более высокого уровня, во время которых проверяется взаимодействие разных модулей программы между собой. Unit тесты могут быть частью интеграционного тестирования.

  • Документация

При написании Unit теста создается документ, который описывает задачу теста. Чем больше таких документов у продукта, тем проще его поддержка и обновление, особенно когда меняются разработчики.

  • Test-driven development

Существует подход, популярный в коммерческой разработке, при котором сначала пишутся тесты и документация на них, согласно архитектуре будущего приложения. Тесты задают классы, методы и особенности их поведения. Затем создается код, и различные элементы кода могут использоваться только при условии, что они прошли тесты. Этот кропотливый подход требует времени, зато готовый код полностью протестирован и задокументирован.

Что такое JUnit

Начнем с того, что для Unit тестов можно использовать различные фреймворки. Хорошо подобранный фреймворк делает создание Unit тестов быстрее и проще. Так, если написание теста для выбранного юнита с нуля может занять несколько часов, то с фреймворком время сокращается до минут.

Существует множество разных фреймворков для разных языков программирования, в том числе, конечно же, и для Java. Надо сказать, некоторые языки лучше подходят для модульного тестирования, чем другие, и Java, конечно же, наверху списка. Синтаксис Java позволяет создание модульных тестов без использования дополнительных библиотек.

JUnit — это фреймворк для создания модульных текстов на языке Java. Он входит в семейство фреймворков xUnit для разных языков программирования. JUnit породил систему расширений, включая известный инструмент для автоматизации работы в веб-браузере Selenium. Благодаря Junit были созданы, проработаны и улучшены концепции тестирования ПО — как, что и когда надо тестировать.

Аннотации для JUnit

В четвертой версии JUnit появились аннотации. Это метаданные, которые могут быть добавлены в код Java, чтобы сделать его более читаемым. Аннотации можно добавлять к методам, классам и переменным.

Например, аннотация @Before используется, в частности, чтобы перед java unit тестом выполнить определенную логику, например, обработать некий оператор. Так же работает аннотация @After, только логика выполняется после теста. Аннотация @Ignore позволяет игнорировать определенные условия. Полный список аннотаций нужно смотреть в описании продукта JUnit, начиная с четвертой версии.

Пример JUnit тестирования

Выводы

Многим разработчикам не нравится писать тесты, включая java unit тесты. Это считается скучной работой по сравнению с написанием кода. Но дело в том, что без тестирования можно создавать только проекты-однодневки, жизненный срок которых — несколько месяцев.

В любом более-менее серьезном коммерческом продукте без тестов не обойтись. Слишком велики риски, с которыми может столкнуться заказчик при использовании некачественного ПО. Представьте себе больницу, энергостанцию или космический корабль, на которых заглючил код и произошла авария. А ведь такие случаи реально бывали. Да и бизнес, у которого встали все процессы, потому что новый релиз положил систему, вряд ли будет доволен.

Поэтому тесты писать нужно. Необязательно покрывать тестами 100% кода, но качественное тестирование — залог успешного программного продукта.