Баннер мобильный (1) Пройти тест

JUnit

Глоссарий

26 марта 2023

Поделиться

Скопировано

Содержание

    JUnit — это фреймворк для языка программирования Java, предназначенный для автоматического тестирования программ. Его основное назначение — unit-тестирование, то есть такое, когда по отдельности проверяется функциональность каждого компонента программы.

    Логотип JUnit

    Юнит-тестирование еще называют модульным. Благодаря ему программы работают как надо: возможные ошибки и непредвиденное поведение находят тестировщики, после чего программисты устраняют недочеты.

    Автоматическое тестирование помогает сэкономить ресурсы: время специалистов, силы и средства. При этом оно точнее и быстрее, чем ручное. С помощью фреймворков, таких как JUnit, даже сложные тесты можно создавать легче и быстрее.

    JUnit «вырос» из серии фреймворков xUnit — они есть для разных языков программирования и все ориентированы на тестирование. У них похожая архитектура и функциональность.

    Кто пользуется JUnit

    Фреймворк нужен тестировщикам-автоматизаторам, QA-инженерам — людям, которые занимаются проверкой функциональности программ. Знания JUnit пригодятся и для начинающих специалистов, чтобы эффективнее выполнять задачи, и для профи — чтобы грамотнее разрабатывать стратегии тестирования.

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

    Для чего используется JUnit

    Это фреймворк для Java, полностью совместимый с самим языком и его инструментами, поэтому им удобнее всего пользоваться для тестирования Java-проектов. Это обычно продукты энтерпрайз-сектора: сервисы крупных компаний, банки, страховые и другие подобные направления.

    Впрочем, версии фреймворка существуют и для других языков — например для PHP, Python, C# и прочих ЯП. Эти версии можно использовать и в проектах с иной технической базой. Поэтому JUnit актуален практически везде, где требуется быть знакомым с автоматическим юнит-тестированием. Чаще всего это проекты с принятой моделью TDD — Test-Driven Development, или разработка, построенная на тестах.

    Что такое TDD

    Test-Driven Development — подход к созданию программ, в котором на первом месте стоят тесты. На русский название можно перевести как «разработка через тестирование». Подход состоит из коротких циклов разработки, в которых сначала пишутся тесты, а уже потом — программы, проходящие их. То есть тесты выступают как своеобразное техзадание: в них прописывается, какие результаты должна выдавать программа в той или иной ситуации.

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

    Создатели этого метода считали, что такой подход поможет вдохнуть в программистов уверенность и упростить проектирование программ. У него есть и еще одно достоинство — код тестируется сразу же, поэтому вероятность внезапной ошибки снижается. Но есть и риск: если в тестах пропустить какую-то важную деталь, она может всплыть позже как баг или сбой.

    Как происходит тестирование с JUnit

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

    Модульное тестирование, для которого используют JUnit, — это такой вид проверки, при котором каждый компонент рассматривается по отдельности. Оно помогает избежать ошибок на самом «низком» уровне — на уровне работоспособности отдельных объектов.

    Поэтому процесс тестирования через JUnit можно представить так.

    1. Тестировщик знакомится с компонентом и с тем, как он должен работать. После этого он продумывает разные ситуации и решает, по какой логике будет работать тест.
    2. Тестировщик пишет код теста с помощью JUnit. Обычно этот код выполняет те действия, которые мог бы совершить с объектом человек или другой компонент программы. Там же сразу определяется, какие результаты тест должен воспринять как правильные.
    3. В тесте указываются разные входные данные, которые он будет «отдавать» компоненту в ходе тестирования.
    4. Тест настраивается: тестировщик определяет, что он будет выводить в случае ошибки, как покажет результаты, в каком порядке будет запускаться и так далее.
    5. После этого тестировщик запускает для компонента тест и проверяет результаты. Если нужно протестировать еще какую-то возможность, для этого пишется свой тест.

    Как устроен тест на JUnit

    Экземпляр тестовой программы создается как наследник от основного класса TestCase. У этого класса есть встроенные методы для инициализации, и их можно переопределить, если нужно, то есть переписать под свои нужды. После этого экземпляру прописываются методы — функции, конкретные тесты, каждый из которых выполняет свою задачу.

    Код внутри метода — это какие-то действия, а за ними — проверки. То есть сначала тест делает что-то с компонентом, который проверяет, а потом «смотрит», какими получились результаты. Проверки показывают, соответствуют ли результаты тем, которые предполагались. Если это так — тест пройден. Если нет — в работе компонента есть ошибка и ее следует исправить.

    Даже если только один из методов не прошел — или выдал исключение, весь тест считается проваленным.

    Можно ли тестировать без JUnit

    Да, это возможно. Есть ручное тестирование, есть другие фреймворки с иной функциональностью. Выбор конкретного инструмента зависит от команды разработчиков, целей и задач проекта, стека технологий и других факторов. JUnit чаще всего используют, когда проект пишут на Java, он довольно сложный и ручным тестированием не обойтись.

    Маленькие проекты могут тестировать без мощных фреймворков: вручную или с помощью компактных библиотек. Но JUnit — инструмент, который серьезно упрощает этот процесс и позволяет выполнять сложные задачи. Поэтому, если тестируется что-то сложное, с большим количеством компонентов, с JUnit работать удобнее, чем без него.

    Какие возможности дает JUnit

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

    Юнит-тестирование с помощью JUnit — это еще и создание документации. Подробные тесты сами по себе говорят специалистам, что делает этот компонент и как он работает. Объяснять подобные вещи нужно: в коммерческой разработке часто встречаются ситуации, когда людям приходится работать с чужим кодом. Поэтому лучше заранее рассказать им все с помощью документации — так будет легче вникнуть.

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

    Собственная точка входа. Это то, о чем мы говорили выше: тест на JUnit — отдельная программа. Точка входа — это, например, метод main(), с которого начинается выполнение кода. Внутри этого метода находится вся программа.

    Если у теста нет своей точки входа, значит, он выполняется в теле основной программы, а это не всегда удобно. А свой собственный метод для запуска позволяет ему существовать отдельно от продукта, и такое разделение делает код чище и понятнее.

    Настройка тестов. Чтобы эффективно протестировать компонент, нужно предварительно настроить готовую программу-тест. То есть определить, когда и как она будет запускаться, инициализировать ее, чтобы привести в рабочее состояние, задать входные данные или сделать много чего еще. Для всего перечисленного в JUnit есть свои функции, которые позволяют выполнять эти действия буквально в две-три строчки кода.

    Настройки в JUnit довольно гибкие. Можно отдельно настроить, какие действия будут выполняться перед всеми тестами, какие — перед каждым или перед некоторым конкретным. Есть и возможность описать действия после завершения теста — например, очистку памяти и удаление уже ненужных данных.

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

    Отключение тестов. Бывает так, что какой-то тест сейчас запускать не нужно. Остальные должны отработать, а один конкретный — нет. JUnit позволяет отключать такие тесты с помощью специальной команды @Ignore. Ее можно поставить на отдельный метод тестовой программы или на нее целиком.

    Тайм-аут. По умолчанию у тестов нет временных ограничений. Но в реальности, если компонент работает слишком долго, это неправильно и мешает использовать программу. И скорость работы тоже можно протестировать с помощью JUnit – в нем есть встроенное правило, которое позволяет задать тайм-аут. Это значит, что, если тест не выполнится за заданное время, он считается проваленным. Такой подход помогает отслеживать, например, зависания или неэффективные решения, из-за которых код начинает работать очень медленно.

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

    Преимущества JUnit

    «Чистый» Java. Тестировщику или разработчику, скорее всего, не понадобится работать с какими-то другими языками и надстройками. Фреймворк реализован на чистом Java, полностью поддерживает его принципы программирования, согласования по части именования, синтаксис и другие особенности. Поэтому тем, кто уже знаком с Java, освоить его будет легко.

    Совместимость с Java-инструментами. По этой же причине JUnit полностью совместим с инструментами, которыми обычно пользуются разработчики на Java. Например, он прекрасно работает с Maven и Gradle — это программное обеспечение, которое отвечает за сборку Java-проектов.

    Есть у него и обратная совместимость: это значит, что старые программы могут работать с новыми версиями JUnit. Например, если какая-то программа писалась, когда был актуален JUnit 4, то она поймет и JUnit 5, а он в свою очередь поймет ее.

    Ориентированность на TDD. У разработки через тестирование есть ряд достоинств, и она довольно популярна. JUnit позволяет полностью реализовать ее принципы, поэтому инструмент не придется серьезно переделывать под этот подход. Внедрить TDD становится легче, а работать с ней — удобнее.

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

    Недостатки JUnit

    JUnit сильно ориентирован на Java: в нем те же особенности именования и довольно многословный код. Это плюс для Java-разработчиков и минус для многих других специалистов. Человеку, который не разбирается в Java, будет непросто разобраться в тексте кода. А если просмотреть тест понадобится специалисту из совершенно другой отрасли, он, вероятно, ничего не поймет.

    Еще один минус — отсутствие встроенных mock-объектов. Так называются сущности-заглушки: они «имитируют» функции настоящих объектов, которые будут работать в коде. У них более примитивное устройство по сравнению с реальными объектами и жестко заданный функционал. Ими часто пользуются в тестировании, но в JUnit нет для них механизма: приходится подключать дополнительную библиотеку Mockito.

    Другие недостатки скорее субъективны. Например, часть разработчиков не любит JUnit из-за того, что он пересоздает экземпляр тестовой программы для каждого выполнения тестового метода. Но это не объективный минус, а скорее особенность, которая не всем нравится.

    Что понадобится для начала работы с JUnit

    Фреймворк можно загрузить из официального репозитория на GitHub, а можно подключить с помощью утилит для разработчиков. Чтобы писать тесты, также понадобятся установленный язык Java, среда разработки для него и одна из программ для сборки — чаще всего это Maven. В качестве среды обычно используют IntelliJ IDEA, некоторые также пользуются Eclipse.

    Кроме перечисленного, понадобится компонент, который вы собираетесь тестировать, и умение работать с Java. Код для автоматических тестов пишется на этом языке: если вы с ним незнакомы, понадобится изучить хотя бы его основы.

    Как начать изучать JUnit

    Начните с «чистого» Java. Когда вы освоитесь в особенностях этого языка и научитесь писать на нем простой код, можете переходить к написанию тестов. Для тестирования важно не столько понимать тонкости языка программирования, сколько иметь соответствующий образ мышления. Важно быть внимательным и скрупулезным, уметь замечать мелочи и продумывать множество возможных исходов. Все это — навыки, которые нарабатываются со временем.

    Получить техническую базу и научиться писать тесты на JUnit вы можете на наших профессиональных курсах. Записывайтесь, мы поможем получить новую профессию.

    Поделиться

    Скопировано

    0 комментариев

    Комментарии