Возможности и нюансы применения Kotlin в автоматизации тестирования ПО
Kotlin — это объектно-ориентированный, статически типизированный язык программирования, разработка которого началась в 2010 году при поддержке JetBrains и к настоящему времени заслуживший признание таких мировых ИТ-гигантов, как Google. Kotlin JVM чуть менее чем полностью совместим с Java, но при этом он более универсальный, лаконичный, типобезопасный и простой. С его помощью разработчики могут повысить производительность и упростить процессы создания программных продуктов. О возможностях Kotlin в сфере автоматизации тестирования и опыте его промышленной эксплуатации рассказывает QA Automation lead компании IT_ONE Алексей Антонов.
Содержание |
Язык разработки Kotlin стал широко известен во всем мире после того, как его представили на Google I/O 17 и поддержка созданных на нем инструментов была добавлена в официальный инструментарий Android Studio 3.0. Kotlin — язык простой, асинхронный, функциональный и поддерживает ООП. Имеет довольно большое применение во всех областях разработки приложений, а разработчики языка на вопрос «Почему использовать Kotlin?», отвечают, что он еще и идеальный для тестов. Посмотрим, насколько справедливы такие утверждения.
Kotlin в лабораторных условиях
Чтобы проверить, насколько хорошо Kotlin готов выполнять возложенные на него задачи автоматизации тестирования, мы в IT_ONE провели эксперимент: создали проект, в котором на Kotlin реализовали базовые архитектурные компоненты фреймворка для автоматизации тестирования, согласно обобщенной архитектуре ISTQB. Реализовали слой выполнения с возможностью логирования и формирования отчета о результатах выполнения тестов. На слое адаптеров (драйверов) проверили возможности работы с веб-интерфейсом, REST API и базой данных. Для этого написали базовые тесты «как есть» для каждого предполагаемого объекта тестирования. В дальнейшем это позволит оценить, насколько удобно и эффективно будет работать на слое определения тестов при написании самих тестов, определении тестовых процедур, параметров среды выполнения и формировании библиотеки тестов. Данный подход можно применять для любого языка или инструмента, который вы планируете использовать в дальнейшем для автоматизации тестирования.
На этом этапе можно назвать ряд выявленных нами преимуществ Kotlin для тестировщиков. Во-первых, в Kotlin присутствует DSL (доменный язык) для cистемы автоматической сборки проекта Gradle и CI/CD сервераTeamCity, то есть мы можем использовать один язык и для написания тестов, и для сборки, и настроек запуска, что гораздо проще, чем использовать разные. Во-вторых, в Kotlin JVM изначально присутствует необходимая функциональность для написания тестов — хотя и не для всех библиотек, написанных изначально на Java, есть готовая адаптация под идиомы Kotlin — и их нужно дополнительно расширять и «адаптировать». В-третьих, в язык уже встроены некоторые возможности из коробки: объекты одиночки, ленивые свойства, делегирование свойств и другие, которые позволяют быстро реализовать различные шаблоны проектирования и писать меньше кода.
Другие особенности Kotlin
В процессе автоматизации тестирования мы решаем задачи по определению тестовых процедур, написанию новых адаптеров, утилит, реализации интеграций с системами управления тестированием и дефектами ради повышения прозрачности, понятности и скорости написания самих тестов. Постепенно формируется некий DSL для постоянной работы с адаптерами и написания различных видов тестов. Возможности Kotlin приятно удивляют.
Например, присутствующие в Kotlin функции расширения (extension functions) по праву можно назвать мощнейшим инструментом, позволяющим добавлять новую функциональность к уже существующей без изменения исходного класса или интерфейса, то есть без исправлений в исходном коде, что очень удобно в том числе и при адаптации исходных библиотек на Java при отсутствии альтернативной реализации на Kotlin. При этом наличие и возможность использования встроенных функций (inline) и обобщений (Generics) позволяет дополнительно увеличить масштаб функциональности, который мы можем добавить для разных типов.
Также мы убедились, что Kotlin, как действительно безопасный язык, помогает нам уменьшить количество ошибок несоответствия типов на уровне компилятора путем выведения (inference) типов.
Наконец, у функций в Kotlin есть значения по умолчанию и именованные параметры, которые позволяют писать меньше кода и делать его читабельнее.
С помощью наличия в языке функциональных (single abstract method или SAM) интерфейсов, и возможности языка по переопределению операторов мы можем добиться еще лучших результатов в формировании DSL наших тестов.
Потрясающее ощущение при написании кода дают функции области видимости (with, let, run, also и apply) реализующие паттерны Fluent API и Builder.
Также в Kotlin присутствуют полноценные механизмы для построения абстракций (интерфейсы, классы и объекты). Мощные Enum-классы могут реализовывать интерфейсы. Функция If/When возвращает значения.
Null безопасность (Null safety) позволяет нам убедиться, что в имеющемся коде точно не может использоваться Nullable объект на уровне типа.
Присутствует понятный и удобный API по работе с коллекциями. При этом существуют отдельно коллекции как изменяемые, так и неизменяемые, что позволяет еще лучше ориентироваться в том, что происходит в коде.
Диапазоны и прогрессии позволяют формировать различные генераторы данных и использовать их в циклах.
Напомню, что у Kotlin и Java отличная совместимость. Например, мы можем взять код на Java, вставить его в редактор в файл Kotlin, и IntelliJ Idea сама предложит конвертацию в код на Kotlin.
Применение Kotlin на реальном проекте
Проект по разработке ПО, на котором мы применяем Kotlin, длится уже более трех лет, охватывает 15 внутренних команд заказчика и 15 команд вендоров, которые работают над около 50-ю микросервисами — платформенными и бизнесовыми. На проекте задействовано около 70 тестировщиков, с которыми работают семь выделенных автоматизаторов.
Мы используем среду разработки IntelliJ Idea и Kotlin. Недавно практически без проблем фреймворк мигрировал с JVM 11 на JVM 17. Задействуем Maven для сборки. Jira, Confluence и Telegram для взаимодействия. Bitbucket, TeamCity и Moon2 для разработки и запуска тестов.
На Kotlin написан эффективный плагин для Idea, который позволяет автоматизировать множество рутинных операций: проставлять статусы, получать шаги для реализации тестов, создавать уведомления, проставлять статусы по завершению автотеста. Также на базе Redis и Kotlin реализован механизм синхронизации и управления тестовыми данными, необходимый при параллельных запусках и совместной разработке. С помощью Spring, Kotlin и базы данных Postgres реализованы сервисы, которые позволяют высчитывать метрики по покрытию, отправлять уведомления в Telegram.
На текущий момент ночью запускается около 8300+ UI и API тестов в 10 потоков, длящихся в среднем от 8 до 9 часов. Объем успешно выполненных тестов составляет около 80%.
Резюме
Наш достаточно большой опыт создания автотестов на Kotlin показывает, что этот язык аккумулирует все лучшие идеи из объектно-ориентированного и функционального программирования, позволяет создавать удобный DSL для написания тестов.
Kotlin довольно легок в обучении и понимании идиом: я, будучи изначально Java-автоматизатором, смог адаптироваться и начать свободно писать автотесты на Kotlin примерно за месяц.
На сегодняшний день язык (за 14 лет!) уже вышел на приемлемый уровень, необходимый для промышленной эксплуатации в направлении автоматизации тестирования, и продолжает активно развиваться.
В качестве возможных ограничений нужно отметить, что с Kotlin, скорее всего, придется использовать инструменты разработки (IDE) от JetBrains, потому что остальные пока поддерживаются не лучшим образом.
Стоит учесть, что надо будет писать дополнительный код для адаптации тех библиотек, которые не реализованы на Kotlin.
В этом языке более долгая компиляция по сравнению с Java. И, пусть и небольшое, но время на обучение языку все-таки потребуется.
По моим ощущениям, Kotlin дает ту же легкость написания кода, которая есть в скриптовом языке, и при этом содержит все плюсы компилируемого языка. Он позволяет вывести DSL автотестов на новый уровень. Очень быстро привыкаешь к идиомам Kotlin и создаешь качественный, читаемый код. Пишется меньше кода, соответственно, меньше времени занимает его понимание и code-ревью.
Возвращаясь к вопросу из заголовка… Все-же, в нашей сфере деятельности идеального языка-инструмента нет и не может быть из-за разнообразия объектов тестирования, но команда разработчиков Kotlin всеми силами к этому идеалу стремится!