Найти тему
Nuances of programming

Создаем юнит-тесты с помощью ИИ-инструмента

Оглавление

Источник: Nuances of Programming

Шаг 1. Установка плагина и импорт проекта

Плагин для IntelliJ IDEA полностью бесплатен для разработки программ с открытым исходным кодом. Чтобы установить его, перейдите в меню “Настройки” (Preferences) IntelliJ IDEA, в его левой части выберите Плагины (Plugins) и найдите через поиск Diffblue Cover, как показано ниже.

Установите плагин Diffblue Cover в IntelliJ IDEA
Установите плагин Diffblue Cover в IntelliJ IDEA

После завершения установки и при наличии существующего проекта, который импортирован в IntelliJ IDEA, плагин начнет индексировать и анализировать всю кодовую базу (т. е. классы, зависимости и т. д.) в качестве фоновой задачи. Это может занять некоторое время в зависимости от её размера и сложности.

Diffblue Cover индексирует проект
Diffblue Cover индексирует проект

Вы также можете дополнительно настроить плагин Diffblue Cover через меню IntelliJ IDEA, чтобы подогнать его под свои нужды.

Если вам хочется поэкспериментировать, рекомендую начать с базового проекта. Ниже приведен пример проекта Spring Boot с контроллером, уровнем обслуживания, репозиторием, использующим данные spring, и резидентной (In-Memory)базой данных:

git clone https://github.com/rhamedy/sample-rest-service.git

Можете спокойно клонировать репозиторий и делать с ним, что угодно.

Шаг 2. Краткое руководство по проекту

Если вы клонировали проект-пример, приведенный выше, то этот раздел для вас. Здесь я кратко покажу классы, для которых мы собираемся создавать юнит-тесты.

Слой контроллера

Вот как выглядит контроллер Spring Boot, который мы собираемся протестировать:

Как показано выше, у нас есть несколько конечных точек для получения списка всех студентов, а также добавления, получения и удаления по идентификатору каждого в отдельности.

Сервисный слой

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

Дальше мы попытаемся сгенерировать модульные тесты для вышеперечисленных классов с помощью плагина Diffblue Cover.

Шаг 3. Генерация юнит-тестов при помощи плагина, основанного на искусственном интеллекте

Именно здесь происходит вся магия. Другими словами, плагин, работающий на основе ИИ, вступает в дело и самостоятельно, без какой-либо помощи, генерирует юнит-тесты.

Опция для генерации юнит-тестов
Опция для генерации юнит-тестов

Если вы уже установили плагин, щелкните правой кнопкой мыши по StudentController и выберите опцию “Написать тесты” (Write Tests) в меню действий, как показано выше.

Плагин Diffblue Cover генерирует юнит-тесты для StudentController
Плагин Diffblue Cover генерирует юнит-тесты для StudentController

Плагин начнет анализировать контроллер и каждый из его методов. Наконец, он сгенерирует юнит-тесты для каждого из методов.

Генерация тестов занимает какое-то время  —  Diffblue Cover анализирует класс и его методы. Но затраты времени минимальны по сравнению с тем, сколько понадобится для написания вручную.

Ниже приведен тест StudentControllerTest, сгенерированный Diffblue Cover.

Тесты выглядят очень надежными и следуют лучшим практикам Spring Boot относительно тестирования.

Все сгенерированные юнит-тесты целиком можно найти в этом пулл-реквесте.

Шаг 4. Тестовое покрытие сгенерированных юнит-тестов

Инструмент покрытия кода или тестового покрытия показывает процент кода, охваченного тестами.

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

Покрытие кода JaCoCo для сгенерированных юнит-тестов.
Покрытие кода JaCoCo для сгенерированных юнит-тестов.

Мы получили довольно хороший процент покрытия по классам, для которых были сгенерированы тесты, то есть по пакетам Controller, service и util.

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

Демонстрация по созданию юнит-тестов с плагином Diffblue Cover

Для тех, кому интересно, я приготовил также быструю видео-демонстрацию процесса: начиная от установки плагина до генерации тестов и оценки покрытия для сгенерированных тестов.

Быстрое демо по генерации как юнит-тестов на Java с помощью Diffblue Cover

Недостатки автоматизированной генерации юнит-тестов

Несмотря на многие преимущества, которые дает генерация юнит-тестов, у нее есть несколько недостатков, которые я хотел бы вкратце затронуть.

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

Во-вторых, на мой взгляд, юнит-тестирование косвенно влияет на то, как мы пишем код. Если мы пишем код, который плохо спроектирован, то модульное тестирование становится еще более неприятным процессом. К примеру, представим метод, который делает десять разных вещей, и к тому же в нем содержится много вложенных условий и довольно сложная логика. Было бы непросто написать тесты, которые охватывают все пути выполнения таких методов.

Однажды, когда я приводил аргументы в пользу юнит-тестирования, один разработчик сказал мне:

Я трачу 20% своего времени на написание кода и 80% на написание юнит-тестов для этого кода.

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

Заключение

В целом я остался доволен работой плагина и качеством сгенерированных юнит-тестов для проекта-образца.

Однако я заметил, что плагин не может генерировать тесты для определенных классов и в некоторых случаях пропускает пути выполнения (ветви). В видео-примере выше есть дополнительная информация на этот счет.

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен

Перевод статьи Rafiullah Hamedy: Use an AI Tool to Write Your Unit Tests