Статьи

Введение в Appium

Что вы будете создавать

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

Appium — это инструмент для автоматического тестирования, основанный на популярной инфраструктуре тестирования Selenium , который позволяет проводить автоматическое тестирование как на собственных приложениях для iOS, так и для Android. Его основное ограничение заключается в том, что он построен только для OS X и Linux.

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

В этом руководстве я покажу вам, как настроить Appium, сгенерировать автоматизированные сценарии и создать несколько простых тестов входа в систему для приложения Android.

Получение Appium не займет много времени, но легко испортить настройку. Когда я впервые установил Appium, я наивно скачал приложение (.dmg), а затем установил его в командной строке. Оказывается, если вы сначала загрузите приложение, это может затруднить получение Appium из командной строки. Итак, начните с получения Appium из командной строки.

В следующих шагах я предполагаю, что у вас установлен homebrew и вы используете OS X. Если у вас не установлен узел, выполните следующую команду из командной строки:

1
$ brew install node

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

1
2
$ npm install -g appium
$ npm install wd

Если у вас нет прав для использования этих команд, вам придется выполнять их самостоятельно, а не sudo . Расположение папки может отличаться для вас, в зависимости от ваших настроек.

1
$ sudo chmod -R a+w /usr/local

Чтобы запустить сервер Appium и посмотреть, правильно ли вы его настроили, выполните следующую команду из командной строки.

1
$ appium &

Appium из командной строки позволяет запускать тесты Selenium не только на симуляторах Android и iOS, но и на физических устройствах. Приложение имеет приятный пользовательский интерфейс, который позволяет вам запускать симулированную версию вашего AUT ( тестируемого приложения) и легко генерировать код Selenium для простых действий над приложением. В основном вы будете использовать приложение на начальном этапе создания тестов, а затем использовать командную строку для запуска тестов.

Почему мы не используем приложение для всего потока? Если вы планируете запускать набор тестов на различных устройствах в автоматическом режиме, возможно, по расписанию, крайне важно иметь возможность запускать Appium из командной строки.

Приложение Appium можно загрузить из Bitbucket . После загрузки образа диска дважды щелкните его и перетащите приложение Appium в папку « Приложения ».

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

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

Поскольку невозможно владеть каждым доступным устройством Android, я обычно тестирую на смоделированных устройствах. Это позволяет мне легко изменить, какое устройство моделируется для тестирования совместимости. Чтобы получить симулятор Android, получите AVD Manager и настройте любое устройство Android по вашему выбору, совместимое с API уровня 21.

  1. Загрузите APK с GitHub .
  2. Получить JDK , если у вас его еще нет.
  3. Загрузите Android SDK с помощью AVD Manager.
  4. Установите PATH среды ANDROID_HOME , JAVA_HOME и PATH в вашем .profile или .bash_profile (или .zshrc, если вы используете zsh).

ANDROID_HOME должен указывать на местоположение Android SDK, в то время как JAVA_HOME должен указывать на местоположение JDK.

Вот как вы можете добавить эти пути в ваш .bash_profile . Обратите внимание, что пути могут отличаться для вас.

1
2
3
4
$ vim ~/.bash_profile
$ export ANDROID_HOME=/Users/(username)/Library/Android/sdk
$ export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home

Затем создайте смоделированное устройство с помощью AVD Manager. Обязательно включите параметр Использовать графический процессор и установите значение кучи виртуальной машины равным 64 .

1
2
$ cd $ANDROID_HOME/tools
$ ./android avd

Чтобы ускорить работу симулятора, установите HAX с веб-сайта Intel .

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

Общие настройки Appium

Далее, проверьте кнопку-переключатель Android и щелкните значок Android . Проверьте путь к приложению и установите его значение в том месте, куда вы помещаете APK тестируемого приложения. Проверьте Launch AVD и выберите смоделированное устройство. Выберите 5.1 Lollipop (Уровень API 21) из выпадающего меню в версии платформы .

Выбор Android
Настройки Android

Нажмите Launch и дождитесь запуска приложения на симуляторе.

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

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

Appium Инспектор

Это инспектор Appium. Это очень удобный инструмент, который поможет вам начать писать тесты для Appium. По сути, инспектор позволяет вам выполнять действия с собственным приложением Android и записывать ваши действия в виде сгенерированного кода.

Поля с левой стороны инспектора составляют UI Navigator и позволяют вам перемещаться по элементам текущего действия. Внизу находятся варианты взаимодействия с элементом, выбранным из полей элемента. Детали выбранного элемента показаны в деталях . Если вы делаете что-то вручную для симуляции, вы должны нажать « Обновить», чтобы инспектор распознал эти изменения. Если вы хотите начать записывать свои действия в коде, вы должны нажать кнопку « Запись» .

Давайте создадим код, необходимый для успешного входа в систему. Приложение имеет два жестко закодированных логина : [email protected] : пароль и [email protected] : пароль2 .

  1. Нажав кнопку « Запись» , вы увидите код под инспектором. Вы можете выбрать для этого разные языки. Для этого урока мы будем использовать Python.
  2. В навигаторе пользовательского интерфейса перейдите к android.widget.LinearLayout / android.widget.FrameLayout /
    android.widget.LinearLayout / android.widget.ScrollView /
    android.widget.LinearLayout / android.widget.EditText [1].
  3. Нажмите « Текст» внизу и введите [email protected] .
  4. Нажмите « Отправить ключи» и обратите внимание, что в приведенном ниже коде появилась новая строка.
Инспектор Отправить ключи на электронную почту

5. В пользовательском интерфейсе перейдите к android.widget.LinearLayout /
android.widget.FrameLayout / android.widget.LinearLayout /
android.widget.ScrollView / android.widget.LinearLayout /
android.widget.EditText [2]

6. Введите пароль.

Инспектор отправляет ключи на пароль

7. Нажмите Отправить ключи .

8. В навигаторе пользовательского интерфейса перейдите к android.widget.LinearLayout / android.widget.FrameLayout /
android.widget.LinearLayout / android.widget.ScrollView /
android.widget.LinearLayout / android.widget.Button [1]

9. Нажмите Touch внизу, затем нажмите . Сейчас мы находимся на новом занятии, поэтому UI Navigator изменился.

Инспектор Нажмите Войти

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

Инспектор не обновился

11. В Навигаторе пользовательского интерфейса перейдите к android.widget.LinearLayout / android.widget.FrameLayout /
android.widget.RelativeLayout / android.widget.Button [1].

12. Нажмите Нажмите .

Инспектор Нажмите Выход

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

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

Чтобы использовать веб-драйвер Appium с Python, вы также должны получить библиотеки Appium для Python .

  1. Загрузите и разархивируйте файл .gz.
  2. Откройте файл .gz, перейдите к месту в командной строке и выполните следующую команду:
1
$ python setup.py install

Прежде чем мы начнем писать тесты, нам нужно решить, какие тестовые случаи мы будем делать. Хороший набор тестов должен учитывать все возможные взаимодействия. Давайте начнем с простого.

  1. Успешный вход
  2. Неудачный логин.
1
2
3
4
5
6
#!/usr/bin/python
 
from appium import webdriver
import time
import unittest
import os

Во-первых, мы должны импортировать все необходимое для теста. Мы будем использовать встроенный модульный тест Python для запуска наших тестов. Элемент Appium — это веб-драйвер, который мы будем использовать для взаимодействия с сервером Appium.

01
02
03
04
05
06
07
08
09
10
class LoginTests(unittest.TestCase):
   def setUp(self):
       desired_caps = {}
       desired_caps[‘appium-version’] = ‘1.0’
       desired_caps[‘platformName’] = ‘Android’
       desired_caps[‘platformVersion’] = ‘5.1’
       desired_caps[‘app’] = os.path.abspath(‘/Users/mkim/Documents/AUT/app/build/outputs/apk/app-debug-unaligned.apk’)
 
       self.wd = webdriver.Remote(‘http://0.0.0.0:4723/wd/hub’, desired_caps)
       self.wd.implicitly_wait(60)

Мы создаем класс LoginTests чтобы определить наш набор тестов. Функция setUp нашего модульного теста запускается в начале теста. В этом методе мы устанавливаем желаемые возможности, такие как Android и путь к приложению. Затем мы инициализируем веб-драйвер self.wd , подключившись к серверу Appium.

1
2
def tearDown(self):
       self.wd.quit()

Функция tearDown запускается после теста и отключается от сервера Appium.

01
02
03
04
05
06
07
08
09
10
11
12
def test_success(self):
       basepath = «//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.ScrollView[1]/android.widget.LinearLayout[1]/»
       basepath2 = «//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/»
   self.wd.find_element_by_xpath(basepath + «android.widget.EditText[1]»).send_keys(«[email protected]»)
   self.wd.find_element_by_xpath(basepath + «android.widget.EditText[2]»).send_keys(«password»)
   self.wd.find_element_by_xpath(basepath + «android.widget.Button[1]»).click()
       try:
       self.wd.find_element_by_xpath(basepath2 + «android.widget.TextView[1]»)
       except:
           self.fail(«Not at Login Success page.\n»)
 
   self.wd.find_element_by_xpath(basepath2 + «android.widget.Button[1]»).click()

Приведенный выше блок кода в основном скопирован из кода инспектора Appium. Мы выполняем необходимые действия в пользовательском интерфейсе для успешного входа в систему. В предложении try мы пытаемся найти элемент textView который отображает текст Login Success! Если выдается исключение, тест не пройден.

1
2
3
4
5
6
7
8
9
def test_fail(self):
       basepath = «//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.ScrollView[1]/android.widget.LinearLayout[1]/»
   self.wd.find_element_by_xpath(basepath + «android.widget.EditText[1]»).send_keys(«[email protected]»)
   self.wd.find_element_by_xpath(basepath + «android.widget.EditText[2]»).send_keys(«wrongpassword»)
   self.wd.find_element_by_xpath(basepath + «android.widget.Button[1]»).click()
       try:
       self.wd.find_element_by_xpath(basepath + «android.widget.Button[1]»)
       except:
           self.fail(«Not still at login screen.\n»)

Чтобы не пройти тестирование входа в систему, мы намеренно используем неверный пароль, неправильный пароль, ожидая сбоя входа в систему. Мы проверяем, можем ли мы найти элемент кнопки входа в систему и проваливаем тест, если не можем.

1
2
3
if __name__ == ‘__main__’:
   suite = unittest.TestLoader().loadTestsFromTestCase(LoginTests)
   unittest.TextTestRunner(verbosity=2).run(suite)

Это основная функция, необходимая для запуска наших тестов. Нет ничего плохого в нашем первом тестовом примере. Однако неудачный вход в систему может означать много вещей. Когда пользователь не может войти в систему, мы хотим убедиться, что пользовательский интерфейс помогает ему понять, как исправить свою ошибку для лучшего взаимодействия с пользователем.

  1. Успешный вход
  2. Войти с неверным паролем.
  3. Войти с неправильным адресом электронной почты.
  4. Войти без пароля.
  5. Войти без электронной почты.
  6. Войти с неверным адресом электронной почты.

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

Самая сложная часть написания тестов — проверка ожиданий. Например, неудачный тест входа в систему проверяет, существует ли элемент в пользовательском интерфейсе. Это означает, что тесты входа полностью зависят от пользовательского интерфейса, чтобы сообщить нам, выполнены ли требования.

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

Мы научились:

  • настроить Appium
  • использовать инспектор Appium для создания автоматизированных тестовых сценариев
  • используйте автоматизацию, чтобы создать несколько простых тестов входа в систему для приложения Android

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