Robot Framework для автоматизации тестирования: ограничения и плюшки

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

    Я столкнулся с Robot Framework около года назад. Перед нами стояла задача силами двух инженеров автоматизировать довольно большой объем тестов в сжатые сроки, т.к. ручная регрессия перестала влезать в разумные рамки. Сам проект связан с пожарной безопасностью. Тестировать предстояло Web-часть в трех браузерах и Mobile-часть на множестве iOS и Android телефонов и планшетов. Помимо этого, в наличии были тесты, которые взаимодействовали и с Web, и с Mobile. Конечно, это не ракету построить, но и не совсем тривиально. Честно скажу, я сопротивлялся, мы долго думали и в итоге, по совокупности внутренних и внешних факторов, выбрали Robot Framework.

    Пара слов и картиночек для знакомства с Robot Framework

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

    Robot Framework – это keyword-driven фреймворк, разработанный специально для автоматизации тестирования. Он написан на Python, но для написания тестов обычно достаточно использовать готовые ключевые слова (кейворды), заложенные в этом фреймворке, не прибегая к программированию на Python. Нужно лишь загрузить необходимые библиотеки, например, SeleniumLibrary, и можно писать тест. В этой статье я дам общее представление о Robot Framework, но если после прочтения вы захотите углубиться в тему, то советую обратиться к официальной документации. В конце статьи также приведены ссылки на популярные библиотеки.

    Что ж, перейдем к «картиночкам». Вот так может выглядеть простой проект в IDE (на примере всеми любимой Википедии):

    • Синий и зеленый – папки с файлами для описания страниц и тестов соответственно. Так можно реализовать page object паттерн.

    • Коричневый – драйвера для различных браузеров.

    • Красный – тело теста.

    • Желтый – консоль, из которой можно запускать тесты и видеть консольные сообщения (полноценные логи не тут, но об этом позже).

    Как видно, в тесте сплошные «обертки» в стиле BDD (можно не применять такой синтаксис, но лично мне он тут кажется удобным). Имплементация находится в объектах страниц, например:

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

    Думаю, для получения общего представления этого достаточно. Детальное описание работы с Robot Framework лежит за рамками моего поста

    Плюсы и минусы

    В этой части я расскажу о плюсах и минусах Robot Framework, с которыми столкнулась наша команда. Учитывая специфику задач на проекте, наверняка у вас будут и свои «подводные камни». Я буду перечислять, двигаясь, на мой взгляд, от более значимого достоинства/недостатка к менее значимому.

    Плюшки

    Низкий порог входа

    Как я уже писал выше, Robot Framework является keyword-driven фреймворком, а не языком программирования. Хоть синтаксис и схож с Python, знаний программирования требуется несколько меньше или, скажем так, их применение не обязательно там, где это позволяет сложность самой задачи. Однако, при необходимости можно пользоваться переменными, циклами, функциями, возвращающими значения, и т.п. Ближайшими альтернативами могут показаться Pytest и Selenide, но они требуют большей подготовки пользователя, нежели Robot Framework. Например, одной из встроенных стандартных библиотек является BuiltIn. Там вы можете найти такие кейворды как Sleep, Log, Run Keyword If, Should Be Equal As Strings и т.п. и написать что-то вроде:

    Run Keyword If '${status}' == 'PASS' SomeAction

    Поддержка Web и Mobile

    Robot Framework неплохо работает в связке Mobile+Web (как end-to-end, так и атомарные тесты).

    Наши Web тесты работают с Chrome, FF и IE. Мобильная часть работает как с локальными реальными устройствами на Android и iOS, так и с устройствами с фермы SauceLabs. Ограничение – реальное локальное iOS-устройство можно тестировать только с Mac. И вообще iOS требует гораздо больше внимания, ведь тот же веб-драйвер для него надо пересобирать самостоятельно. (Тестирование iOS – это отдельная большая тема, и если интересно, дайте знать в комментариях, мне есть о чем рассказать)

    Тэги

    Есть возможность задавать тестам тэги. Тэгами может быть любая информация, которая пригодится нам для идентификации теста: ID теста, список компонент, к которым относится тест, и т.п. Этим мы обеспечиваем связь тестов с тестами или требованиями (traceability) и задаем необходимую информацию для конфигурирования запуска тестов. Указав в запускалке один тэг, мы можем запустить все тесты, которые относятся к определенному компоненту, или же можем при запуске явным образом перечислить тест-кейсы, которые надо запустить (удобно при регрессионном тестировании). Подробнее про тэги по ссылке.

    Хорошие отчеты из «коробки»

    Для предоставления стандартной отчетности ничего придумывать не надо. Отчеты создаются автоматически без единой дополнительной команды. Есть возможность объединения результатов разных тестовых прогонов. В результате прогона по умолчанию создаются три файла:

    • Output.xml – результаты тестов в формате XML. Пригодятся для мерджа результатов командой rebot. Пример:

    • Log.html – подробные результаты в HTML-формате. Полезны больше для разработчиков тестов. Пример:

    • Report.html – высокоуровневые результаты без подробной детализации. Полезны для демонстрации людям «со стороны» и менеджменту. Пример:

    BDD из «коробки»

    Синтаксис Gherkin языка с его нотациями Given, When, Then и And включен по умолчанию, и любой шаг может быть записан как в этой нотации, так и без нее. Можно использовать нотации или нет – тесты просто игнорируют их. К примеру, эти два кейворда с точки зрения фреймворка идентичны:

    Welcome page should be open

    And welcome page should be open

    Подробнее по ссылке.

    Page Object паттерн

    Robot Framework позволяет реализовать Page Object паттерн не при помощи ООП, а при помощи синтаксиса ключевых слов. Смысл в том, чтобы последовательно в кейворде указывать, с какой страницей мы работаем -> с какой областью внутри нее мы работаем -> с каким контролом работаем и что мы с ним делаем. Пример:

    On Main page on Users tab I click Create user icon

    где кейворд “On Main page on Users tab I click Create user icon” хранится в отдельном робот файлике, скажем, с названием mainPage.robot. Этот файлик мы подгружаем в наш файл с тестами по необходимости.

    См. также пример из секции «Пара слов и картиночек для знакомства с Robot Framework».

    Параллельный запуск

    Параллельный запуск становится возможным благодаря альтернативной запускалке тестов под названием Pabot. Стандартным предустановленным способом является команда robot. Естественно, тесты должны быть на это рассчитаны и не должны влиять друг на друга

    Грабли

    Отсутствует возможность отладки встроенными средствами

    Имеется ввиду классическая расстановка брейкпоинтов. Приходится либо выводить что-то дополнительное в лог, либо ставить временные слипы и так обходить эту проблему. В сети описаны некоторые способы прикрутить дебаг, но для уровня целевой аудитории Robot Framework это сложновато.

    Не поддерживается AWS

    AWS (Amazon Web Services – коммерческое публичное облако, ферма мобильных устройств) не поддерживает тесты на Robot Framework. AWS работает таким образом, что код исполняется на стороне Amazon, и тесты в формате Robot Framework не допустимы. Зато другая ферма, SauceLabs, устроена по другому принципу и прекрасно работает с Robot Framework (есть проблемы с администрированием их сервиса из России, но они решаются общением со службой поддержки или работой под VPN).

    IDE сложности

    RIDE (Robot IDE), специальная IDE для Robot Framework, мягко говоря, сырая. Режим работы в табличном виде (как раз для воплощения идеи keyword-driven фреймворка) выглядит так:

    Режим работы в редакторе текста:

    Ни в одном из двух предлагаемых режимов работать невозможно. Приложение периодически «падает» (хотя на других проектах такого нет). В режиме текста нет элементарного Go to Definition. В режиме таблиц Go to Definition есть, но сам этот режим крайне неудобен для средних и больших проектов.

    PyCharm работает лучше, но, к сожалению, существующие плагины не справляются с автокомплитом некоторых библиотек (например, SeleniumLibrary)

    Плохая поддержка сторонних библиотек

    Готовые, уже существующие в сети библиотеки зачастую не поддерживаются. Пользователей мало, и они переходят в разряд зомби. Например, работа с почтой, сравнение скриншотов и т.п. Можно, конечно, написать свои библиотеки на чистом Python (и Robot Framework это позволяет), но смысла в такой схеме остается мало.

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

    Выводы

    Выбор инструмента Robot Framework для нашего проекта был абсолютно верным и позволил выполнить наши обязательства в срок и с надлежащим качеством. Однако, надо понимать, что это, конечно же, не «серебряная пуля», есть много «но», которые надо иметь в виду.

    Инструмент – это всего лишь средство для достижения поставленной цели, и не всегда надо микроскопом забивать гвозди, даже если это выглядит эффектно. Ругать или нахваливать Robot Framework я не берусь. Скажу лишь, что это хороший инструмент для своих целей

    Полезные ссылки

    Auriga
    Аурига — это люди

    Комментарии 16

      +2
      По моему опыту, лучше всего себя показал VS Code c плагином Language Server Protocol. Для дебага там тоже был какой-то плагин. Библиотеки в Robot Framework действительно попадаются заброшенные, но и писать, и дорабатывать их очень просто. Я его выбрал из-за готовой библиотеки для работы с SAP, и нужные keyword-ы допиливал практически «на лету». Кстати, а если вы на Java писали, то тут же можно и на Java писать. Не пробовали?
        +1
        Не пробовали, как минимум, по 2м причинам.
        Во-первых, изначально он питонообразный, поэтому эта опция выглядит каким-то сомнительным винегретом.
        Во-вторых, у команды в целом сильнее скиллы по Питону.
        Насчет идеи с VS Code большое спасибо, попробуем. Подскажите, а там работает автокомплит Селениумовских и кастомных кейвородов, Go To Declaration?
          0
          Да, autocomplete и переходы работали хорошо. Кстати и для PyCharm есть плагин с autocomplete: plugins.jetbrains.com/plugin/7415-robot-framework-support Но, autocomplete иногда отваливался.
            0
            Да, мы его (Robot Framework Support) и применяем. Но в нем не работает автокомплит библиотек, например, SeleniumLibrary. С кастомными кейвордами все ок. Понятно что жить без этого можно, но неприятно.
              0
              Может стоит попробовать еще раз, у него в апреле выходил новая версия. Сейчас открыл проверил — работает. Не уверен, что картинку покажет, но приложу:
              image
                0
                Дело похоже в не плагине было. В сентябре починили IDE support for SeleniumLibrary: github.com/robotframework/SeleniumLibrary/issues/1588
                  0
                  Картинку не показывает… Вот только что ради интереса обновил robotframework и robotframework-seleniumlibrary. Обновил сам плагин Robot Framework Support. Даже ребутнулся) Не помогло. Сам PyCharm сейчас стоит версии 2019.3.5. Позже попробую обновиться до 2020.3.3, может поможет…
                    0
                    Да, у меня версия 2020.3.3 Но, я помню как в сентябре попробовал и оно заработало. Кстати, если вы еще не подписаны, приглашаю: t.me/robotframework_ru — это русскоязычный телеграм канал по Robot Framework.
      +2

      Недостатки:
      Странный синтаксис (разделитель — 4 пробела)
      Странная работа с переменными (в некоторых местах почти обычный оператор присваивания, в некоторых — специальное ключевое слово)
      Странная работа с циклами ( For есть, while нет)
      Очень странная работа с временем


      Достоинства:
      Код достаточно понятно читается
      То, что не получается выразить этим странным синтаксисом, легко выносится в библиотеку с python.

        +1
        Полностью поддерживаю!
        Разделитель можно и не 4 пробела, а, например, 5. Даже Таб вроде бы работал, но были какие-то проблемы. Но 4 пробела надежнее и ближе к телу )
        А можете чуть подробнее про работу со временем? Не очень понятно что имелось ввиду. Слипы вроде в секундах по умолчанию, но можно с явно написать «s». Больше со временем не сталкивался.
          +1
          Свой внутренний формат хранения дат и времени, с не совсем очевидными преобразованиями. Напоминает datetime от python, но в стиле RobotFramework ;)
        0
        Если просто присвоить значение, типа х = 3, то достаточно и обычного оператора (и даже он на самом деле не нужен). Ключевые слова для присваивания используются обычно в комбинации с другими условиями.
        0
        Не знаю как сейчас, а еще пару лет назад RIDE была недоделкой (хотя и очень старой к тому времени). Написана еще на втором питоне, требует какую-то древнюю версию wxPython, с другими даже не запускалась.

        Если еще актуально, посмотрите на RED (основан на эклипсе): nokia.github.io/RED, github.com/nokia/RED. Удобнее и поддержка живая (по крайней мере те же пару лет назад была).
          0
          Спасибо, передам ребятам про RED.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое