[Перевод] Знакомство с драйверами Appium (или как выбрать нужный)

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

8uqmpgxypf7wrhv4qootygc2stg.jpeg

Appium — это кроссплатформенный инструмент, который позволяет автоматизировать тестирование мобильных (iOS и Android) и десктопных приложений одновременно. Способ реализации этой мультиплатформенной модели заключается в использовании различных драйверов. По сути, Appium имеет примерно ту же архитектуру, что и Selenium WebDriver, который также использует ряд независимых драйверов для поддержки кроссбраузерной автоматизации тестирования.
Для разных инструментов автоматизации существуют отдельные драйверы Appium, что, как правило, означает использование одного драйвера для каждой из платформ (один для iOS, один для Android и т. д.). Однако, есть и исключения. Они связаны с тем, что в автоматизации тестирования приложений для некоторых платформ (например, для Android) используется несколько инструментов в связке с Appium. Фактически, драйверов для Android три: на базе UiAutomator, UiAutomator 2 и Espresso.


Драйверы, пожалуй, самая важная составляющая всего инструмента, ведь их задача состоит в том, чтобы исполнять команды Appium API (известного как WebDriver Protocol) на конкретной платформе. По сути, драйверы — это трансляторы, которые преобразуют клиентский код Appium во что-то, что выполняет команды на платформах iOS, Android и т.д.

Для архитектурной простоты, среди прочих причин, каждый отдельный драйвер сам по себе является автономным WebDriver-совместимым сервером (хотя ему и не доступны все опции, которые есть у основного сервера Appium). Внутри драйвера полученные команды обрабатываются своеобразным способом. Например, они могут передаваться в отдельный процесс, выполняющий Java-код на устройстве Android.

Сами драйверы имеют довольно сложную внутреннюю архитектуру, иногда основываясь на целом комплексе технологий. Ниже представлена диаграмма, отражающая стек технологий, задействованных в драйвере XCUITest (текущий драйвер iOS):
hhemcly8_2dixs3sk1g7zvvures.png
Как видим, принцип работы драйвера XCUITest не так уж и прост. Он доступен как часть Appium и запускается всякий раз, когда вы стартуете сессию iOS. Внутри себя драйвер использует ещё один инструмент, известный как WebDriverAgent, который отвечает за преобразование команд WebDriver Protocol в вызовы библиотеки XCUITest.

Многие драйверы имеют подобную архитектуру, хотя  каждый из них может реализовать свою, поскольку в конечном счёте драйвер публикуется в npm как класс, наследующий BaseDriver класс Appium. Это позволяет драйверам легко подключиться к Appium.

Виды драйверов


Итак, сколько же всего существует драйверов? Честно говоря, довольно сложно сказать точно, потому как, помимо официальных драйверов Appium, есть и неофициальные. Но если мы посмотрим на исходный код Appium, то увидим следующее:

const AUTOMATION_NAMES = {
APPIUM: 'Appium',
UIAUTOMATOR2: 'UiAutomator2',
UIAUTOMATOR1: 'UiAutomator1',
XCUITEST: 'XCUITest',
YOUIENGINE: 'YouiEngine',
ESPRESSO: 'Espresso',
TIZEN: 'Tizen',
FAKE: 'Fake',
INSTRUMENTS: 'Instruments',
WINDOWS: 'Windows',
MAC: 'Mac',
};


Automation names — это ключи для различных драйверов, которые использует Appium. Этот участок кода определяет, какие строки разрешено использовать в качестве значений для automationName capability. Каждый драйвер обычно поддерживает только одну платформу. Вот краткое описание каждого из драйверов, основанное на их automationName:

  • Appium — это просто указатель на дефолтный драйвер для выбранной платформы и не представляет собой отдельный драйвер;
  • UiAutomator2 (репозиторий) — текущий драйвер для платформы Android, использующийся по умолчанию и основанный на инструменте Google UiAutomator;
  • UiAutomator1 (репозиторий) — старый драйвер для Android, основанный на более старой версии UiAutomator. Этот драйвер не будет поддерживаться в будущем, так что лучше отказаться от него в пользу UiAutomator2;
  • XCUITest (репозиторий) — дефолтный драйвер для iOS, основанный на инструменте Apple XCUITest;
  • YouiEngine (репозиторий) — драйвер от разработчиков из You.i Labs, который используют в автоматизации тестирования приложений для различных платформ, созданных на базе их SDK;
  • Espresso (репозиторий) — новейший драйвер для Android, основанный на инструменте Google Espresso;
  • Tizen (репозиторий) — драйвер от разработчиков Samsung для автоматизации тестирования приложений на базе Xamarin, использующихся в ОС Tizen;
  • Fake (название говорит само за себя) используется как внутренний инструмент тестирования Appium. Вам никогда не придётся его использовать;
  • Instruments (репозиторий) — устаревший драйвер, использующийся для приложений с iOS 9.3 и ниже;
  • Windows (репозиторий) — в Microsoft собрали совместимый с Appium сервер, назвав его WinAppDriver, и этот драйвер соединяет его с основным Appium-сервером. Предназначен непосредственно для автоматизации десктопных приложений для Windows;
  • Mac (репозиторий) — драйвер, который позволяет автоматизировать тестирование десктопных приложений для Mac.


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

FAQ по драйверам


Так как же понять, какой драйвер использовать?

Что ж, если вам необходимо писать автотесты для приложений под iOS, Windows, Mac или Tizen, выбор очевиден — используйте дефолтный драйвер для каждой из этих платформ. Что касается Android, то тут предстоит выбирать между UiAutomator2 и Espresso. Лучше всего заранее узнать больше о каждом из этих инструментов и понять, какой из них лучше подойдёт для вашего случая. Возможности драйверов UiAutomator2 и Espresso схожи, но не полностью идентичны.

Все ли драйверы поддерживают одни и те же команды одинаково?

И да, и нет. На фундаментальном уровне мы ограничены возможностями автоматизации, предоставляемыми поставщиками платформ. Тап на устройстве Android работает так же, как и на устройстве iOS. Но процесс выполнения других команд может различаться. Разработчики Appium, насколько это возможно, стараются обеспечить одинаковое поведение драйверов на разных платформах.

Могу ли я перейти с одного драйвера на другой и ожидать, что мои тесты не «сфейлятся»?

И да, и нет. Всё зависит от того, о каких драйверах мы говорим. Одним из преимуществ использования Appium является то, что вы можете переходить с одного инструмента автоматизации на другой (например, c UiAutomator2 на Espresso), не жертвуя уже готовым тест-сьютом. И всё же мигрировать следует медленно и методично, следя за тем, что всё происходит так, как вы ожидаете. Команда Appium иногда публикует руководства по миграции для перехода с одного драйвера на другой — стоит обратить на них внимание перед миграцией.

Могу ли я создать свой собственный драйвер?

Да! Многие уже сделали это, в частности, Джейсон Хаггинс и я (на AppiumConf 2019). Но есть и другие самописные драйверы, такие как hbbtv-драйвер Кристиана Бромана.

Изменятся ли драйверы в Appium 2.0?

Это очень хороший вопрос! Один из негативных аспектов системы драйверов Appium состоит в том, что все они включены в зависимости сервера Appium. Но мы движемся к тому, чтобы драйверы существовали в менее связной системе, где можно выбирать, какие конкретно драйверы использовать с Appium. Если решить эту проблему, вам не придётся устанавливать старый драйвер UiAutomator2 и подключать его зависимости, когда вы используете Appium только для запуска тестов iOS. (А в курсе ли вы, что существует предложение по разработке Appium 2.0?)

Надеюсь, эта статья оказалась полезной для вас. Буду рада прочитать в комментариях о вашем опыте использования драйверов Appium.

© Habrahabr.ru