27 декабря 2021
Создаем первый тест с помощью Appium
Тимур Мироненко
Старший программист в тестировании ПО

Сейчас невозможно представить себе жизнь без смартфона. Интернет, игры, да даже сканирование QR-кодов требует наличие этого устройства. Мобильные версии часто опережают десктопные по объему трафика. Поэтому тестирование мобильных приложений является важной частью их разработки. И если с ручным тестированием всё понятно – жми пальцем по экрану и проверяй, то автоматизированное тестирование мобильных приложений всё ещё является чем-то новым и необычным. В этой статье я расскажу, как создать свой первый автотест для мобильного приложения на языке Java с использованием фреймворка Appium.
Что такое Appium

Appium – это кроссплатформенный инструмент для разработки автотестов для приложений на Android и iOS. Разработку тестов можно вести на различных языках программирования, но мы будем использовать Java, а тест напишем для Android-приложения.

Если вы когда-либо писали автотесты для веб-приложений с использованием Selenium WebDriver, то и Appium вам будет по плечу, так как тут используется тот же принцип: выбираем элемент по какому-то локатору и выполняем с ним требуемое действие.

Настройка окружения

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

Нам понадобится:
  1. Java
  2. Android Studio
  3. Appium Server
  4. Appium Inspector
  5. Intellij Idea
Для начала установим Java JDK. После установки необходимо создать переменную среды. Найти их можно в Свойствах системы на вкладке Дополнительно.
    Создаём системную переменную JAVA_HOME, в значении которой указываем путь до папки, в которой находится установленный JDK. Так же обновляем значение системной переменной Path, добавляя туда строку %JAVA_HOME%\bin
      После этого устанавливаем Android Studio, которая включает в себя Android SDK. Обязательно проверьте, что SDK с нужной версией Android установлен, сделать это можно при запуске Android Studio через SDK Manager.
      После установки возвращаемся к списку системных переменных и добавляем переменную ANDROID_HOME со значением папки, в которой у нас установлен SDK, а так же обновляем переменную Path, добавляя значение %ANDROID_HOME%\bin.
      После этого необходимо установить Appium Server. Это сервер, который связывает наши написанные тестовые скрипты с мобильным приложением с помощью REST API. По умолчанию сервер работает по локальному адресу 127.0.0.1 через порт 4723. Через кнопку Edit Configuration можно проверить настройки окружения, которые определяются через системные переменные. По кнопке Start Server запускаем сервер.
      Далее нужно определиться, на каком устройстве будет выполняться тест, – реальном или виртуальном. Виртуальное устройство можно создать в Android Studio через AVD Manager, взяв параметры реального устройства или же создать своё индивидуальное.
      Если хотите использовать реальное устройство, то его необходимо подключить с помощью USB к компьютеру, с которого вы будете запускать тест, и нужно перейти в режим разработчика. Для этого нужно найти в настройках телефона строку с версией Android и быстро кликать по ней, пока система не сообщит, что вы перешли в режим разработчика. После этого появится раздел настроек для разработчиков, в котором нужно активировать опции «Установка через USB» и «Отладка через USB».
      Теперь нужно установить Appium Inspector. Это что-то типа панели разработчика в браузере, через которую мы определяем селекторы для html-элементов. Ранее Appium Inspector был частью Appium Server, поэтому в старых гайдах установка Appium Inspector не описана. Указываем хост и порт Appium Server, а также добавляем /wd/hub в поле Remote Path. Также нам нужно указать настройки устройства: deviceName – это имя вашего устройства, можно подсмотреть в настройках телефона, а также platformName – в нашем случае это Android. После этого нажимаем кнопку Start Session, телефон подключится, и мы увидим инспектор элементов.
      Теперь осталось только установить среду разработки Intellij Idea, и можно начинать писать наш первый тест! Особенностей установки среды нет, поэтому перейдём сразу к разработке проекта.

      Пишем первый тест

      В Intellij Idea создаём новый проект Maven.
      Затем добавляем в pom.xml зависимости для Appium и jUnit
      <dependencies>
      <!-- https://mvnrepository.com/artifact/io.appium/java-client -->
          <dependency>
              <groupId>io.appium</groupId>
              <artifactId>java-client</artifactId>
              <version>7.6.0</version>
          </dependency>
          <dependency>
              <groupId>org.junit.jupiter</groupId>
              <artifactId>junit-jupiter</artifactId>
              <version>RELEASE</version>
              <scope>test</scope>
          </dependency>
      </dependencies>
      
      В папке test/java создаем класс tests, в котором будем писать наш первый тест для мобильного приложения. В качестве «подопытного» я выбрал стандартный калькулятор на моём Redmi. AndroidDriver вынесем отдельно как поле класса, а остальные методы для инициализации драйвера опишем в методе initialize().
      AndroidDriver<AndroidElement> driver = null;
      DesiredCapabilities capabilities = new DesiredCapabilities();
      Теперь немного детальнее о каждом из свойств, которые нужно указать для инициализации AndroidDriver:

      1) Имя устройства, на котором будет запущен тест
      capabilities.setCapability(MobileCapabilityType.DEVICE_NAME,"Redmi Note 9 Pro");
      2) Имя пакета тестируемого приложения
      capabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE,"com.miui.calculator");
      3) Имя экрана тестируемого приложения
      capabilities.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY,"cal.CalculatorActivity");
      4) Опция, которая отменяет сброс приложения до заводских настроек
      capabilities.setCapability(MobileCapabilityType.NO_RESET,true);
      Если вы тестируете приложение, которые необходимо установить из APK-пакета, то вместо 2 и 3 строки указываете строку .
      capabilities.setCapability(MobileCapabilityType.APP,"<полный_путь_к_вашему_apk>");
      Теперь можно запустить AndroidDriver с указанными свойствами и указать стандартное ожидание элементов формы. Указываем в качестве URL хост и порт нашего AppiumServer.
      try {
          driver = new AndroidDriver<>(new URL("http://127.0.0.0:4723/wd/hub"),capabilities);
          driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
      } catch (MalformedURLException e) {
          System.out.println(e.getMessage());
      Полностью метод initialize() выглядит так:
      public void initialize() {
          DesiredCapabilities capabilities = new DesiredCapabilities();
      
              capabilities.setCapability(MobileCapabilityType.DEVICE_NAME,"Redmi Note 9 Pro");
              capabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE,"com.miui.calculator");
              capabilities.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY,"cal.CalculatorActivity");
              capabilities.setCapability(MobileCapabilityType.NO_RESET,true);
          try {
              driver = new AndroidDriver<>(new URL("http://127.0.0.0:4723/wd/hub"),capabilities);
              driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
          } catch (MalformedURLException e) {
              System.out.println(e.getMessage());
          }
      }
      Тест будет выполнять простейшее арифметическое действие – сложение. Будем складывать 3 и 9 чтобы получить 12. Получается, что тест должен:

      1. Нажать «3»
      2. Нажать «+»
      3. Нажать «9»
      4. Нажать «=»
      5. Убедиться, что в поле вывода «12»

      Чтобы определить локаторы для каждого элемента, нам надо обратиться к Appium Inspector. В идеальной картине у каждого элемента должен быть свой id. И в нашем случае он есть. Именно по этому id мы будем обращаться к кнопке «3».
      Нажатие на кнопку выполняется следующей командой:
      driver.findElementById("com.miui.calculator:id/btn_3_s").click();
      Очень похоже на Selenium, правда? Тем не менее, id не всегда бывает указан в элементах, а xPath слишком громоздкие, чтобы их использовать. Тогда можно определить локатор через атрибуты с помощью UIAutomator. Попробуем обратиться таким способом к кнопке через текст:
      driver.findElementByAndroidUIAutomator("new UISelector().packageName(\"com.miui.calculator\").text(\"3\")").click();
      Чуть более громоздко, но это более универсальный способ определения элементов. Тем не менее, в нашем тесте нам достаточно определения по id, кроме поля с результатом. Тест будет выглядеть следующим образом:
      @Test
      public void checkCalculate() {
          initialize();
          driver.findElementById("com.miui.calculator:id/btn_3_s").click();
          driver.findElementById("com.miui.calculator:id/btn_plus_s").click();
          driver.findElementById("com.miui.calculator:id/btn_9_s").click();
          driver.findElementById("com.miui.calculator:id/btn_equal_s").click();
          assert(driver.findElementByAndroidUIAutomator("new UiSelector().packageName(\"com.miui.calculator\").resourceId(\"com.miui.calculator:id/result\")").getText().equals("= 12"));
      Запускаются и отлаживаются тесты стандартно через Idea.

      Готово!

      Первый тест для Android-приложения готов, а для того, чтобы написать более сложные тесты, я оставляю пару ссылок:
      1. https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md - типы свойств DesiredCapabilities.
      2. http://appium.io/docs/en/writing-running-appium/android/uiautomator-uiselector/ - описание использования UiSelector.
      3. http://appium.io/docs/en/about-appium/intro/ - документация Appium.
      ⟵ Назад
      Смотрите также