Вступление
Библиотека поддержки тестирования Android включает в себя инфраструктуру UI Automator , которую можно использовать для автоматического тестирования черного ящика в приложениях Android. Представленная в API Level 18, платформа позволяет разработчикам моделировать действия пользователя над виджетами, которые составляют пользовательский интерфейс приложения.
В этом руководстве я собираюсь показать вам, как использовать инфраструктуру для создания и запуска базового теста пользовательского интерфейса для стандартного приложения «Калькулятор».
Предпосылки
Чтобы следовать, вам нужно:
- последняя сборка Android Studio
- устройство или эмулятор под управлением Android 4.3 или выше
- базовое понимание JUnit
1. Установка зависимостей
Чтобы использовать инфраструктуру UI Automator в своем проекте, отредактируйте файл build.gradle в каталоге приложения вашего проекта, добавив следующие зависимости:
1
2
3
|
androidTestCompile ‘com.android.support.test:runner:0.2’
androidTestCompile ‘com.android.support.test:rules:0.2’
androidTestCompile ‘com.android.support.test.uiautomator:uiautomator-v18:2.1.0’
|
Кнопка « Синхронизировать сейчас» должна появиться на экране. Когда вы нажимаете на нее, вы должны увидеть ошибку, которая выглядит следующим образом:
Нажмите на ссылку Установить репозиторий и синхронизировать проект, чтобы установить репозиторий поддержки Android .
Если вы используете библиотеку appcompat-v7 и ее версия 22.1.1 , вам необходимо добавить следующую зависимость, чтобы приложение и тестовое приложение использовали одну и ту же версию com.android.support:support-annotations
:
1
|
androidTestCompile ‘com.android.support:support-annotations:22.1.1’
|
Затем, из-за ошибки в Android Studio, вам необходимо исключить файл с именем LICENSE.txt с использованием packagingOptions
. Невыполнение этого требования приведет к следующей ошибке при попытке запустить тест:
1
2
3
4
5
|
Execution failed for task ‘:app:packageDebugAndroidTest’.
Duplicate files copied in APK LICENSE.txt
File 1: ~/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.1/860340562250678d1a344907ac75754e259cdb14/hamcrest-core-1.1.jar
File 2: ~/.gradle/caches/modules-2/files-2.1/junit/junit-dep/4.10/64417b3bafdecd366afa514bd5beeae6c1f85ece/junit-dep-4.10.jar
|
Добавьте следующий фрагмент внизу вашего файла build.gradle :
1
2
3
4
5
|
android {
packagingOptions {
exclude ‘LICENSE.txt’
}
}
|
2. Создайте тестовый класс
Создайте новый тестовый класс CalculatorTester
, создав файл CalculatorTester.java внутри каталога androidTest . Чтобы создать тестовый пример UI Automator, ваш класс должен расширять InstrumentationTestCase
.
Нажмите Alt + Insert и затем нажмите SetUp Method, чтобы переопределить метод setUp
.
Нажмите Alt + Insert еще раз и нажмите Test Method, чтобы сгенерировать новый метод тестирования. Назовите этот метод testAdd
. Класс CalculatorTester
теперь должен выглядеть так:
01
02
03
04
05
06
07
08
09
10
11
|
public class CalculatorTester extends InstrumentationTestCase{
@Override
public void setUp() throws Exception {
}
public void testAdd() throws Exception {
}
}
|
3. Проверьте пользовательский интерфейс программы запуска
Подключите устройство Android к компьютеру и нажмите кнопку «Домой» на своем устройстве, чтобы перейти на главный экран.
Вернитесь на свой компьютер и используйте файловый менеджер или терминал, чтобы перейти в каталог, в который вы установили Android SDK. Затем войдите в каталог инструментов внутри него и запустите uiautomatorviewer . Это запустит UI Automater Viewer . Вам должен быть представлен экран, который выглядит так:
Нажмите кнопку, похожую на телефон, чтобы сделать снимок экрана вашего устройства Android. Обратите внимание, что только что сделанный снимок экрана является интерактивным. Нажмите значок приложения внизу. В разделе « Подробности узла » справа вы теперь можете видеть различные детали вашего выбора, как показано ниже.
Чтобы взаимодействовать с элементами на экране, среда тестирования UI Automator должна иметь возможность однозначно идентифицировать их. В этом уроке вы будете использовать text
, content-desc
или class
элемента, чтобы однозначно идентифицировать его.
Как видите, значок «Приложения» не имеет никакого text
, но имеет content-desc
. Запишите его значение, потому что вы будете использовать его на следующем шаге.
Поднимите устройство Android и коснитесь значка «Приложения», чтобы перейти к экрану, на котором показаны приложения, установленные на устройстве. Вернитесь в UI Automater Viewer и сделайте еще один снимок экрана. Поскольку вы будете писать тест для приложения «Калькулятор», щелкните его значок, чтобы просмотреть подробности.
На этот раз content-desc
пуст, но text
содержит значение Calculator . Запишите это также.
Если на вашем Android-устройстве установлена другая программа запуска или другая версия Android, экраны и детали узла будут другими. Это также означает, что вам придется внести некоторые изменения в ваш код, чтобы соответствовать операционной системе.
4. Подготовьте тестовую среду
Вернитесь в Android Studio, чтобы добавить код в метод setUp
. Как следует из названия, метод setUp
должен использоваться для подготовки вашей тестовой среды. Другими словами, здесь вы указываете, что нужно сделать перед запуском фактического теста.
Теперь вы будете писать код для имитации того, что вы делали на вашем Android-устройстве на предыдущем шаге:
- Нажмите кнопку домой, чтобы перейти на главный экран.
- Нажмите значок приложения, чтобы просмотреть все приложения.
- Запустите приложение «Калькулятор», коснувшись его значка.
В вашем классе объявите поле типа UiDevice
и назовите его device
. Это поле представляет ваше устройство Android, и вы будете использовать его для имитации взаимодействия с пользователем.
1
|
private UiDevice device;
|
В методе setUp
инициализируйте device
, вызвав метод UiDevice.getInstance
, передав экземпляр Instrumentation
как показано ниже.
1
|
device = UiDevice.getInstance(getInstrumentation());
|
Для имитации нажатия кнопки «Домой» на устройстве вызовите метод pressHome
.
1
|
device.pressHome();
|
Далее вам нужно смоделировать событие щелчка на значке приложения. Вы не можете сделать это сразу же, потому что устройству Android потребуется момент, чтобы перейти на домашний экран. Попытка щелкнуть значок «Приложения» до того, как он появится на экране, вызовет исключение во время выполнения.
Чтобы дождаться, чтобы что-то произошло, вам нужно вызвать метод wait
в экземпляре UiDevice
. Чтобы дождаться появления значка «Приложения» на экране, используйте метод Until.hasObject
.
Чтобы определить значок приложения, используйте метод By.desc
и передайте ему значение Apps . Вам также необходимо указать максимальную продолжительность ожидания в миллисекундах. Установите его на 3000 . Это приводит к следующему блоку кода:
1
2
|
// Wait for the Apps icon to show up on the screen
device.wait(Until.hasObject(By.desc(«Apps»)), 3000);
|
Чтобы получить ссылку на значок приложения, используйте метод findObject
. Получив ссылку на значок приложения, вызовите метод click
чтобы смоделировать щелчок.
1
2
|
UiObject2 appsButton = device.findObject(By.desc(«Apps»));
appsButton.click();
|
Как и прежде, нам нужно немного подождать, пока значок калькулятора не появится на экране. На предыдущем шаге вы увидели, что значок калькулятора можно однозначно идентифицировать по text
полю. Мы By.text
метод By.text
чтобы найти иконку, проходящую в Calculator
.
1
2
|
// Wait for the Calculator icon to show up on the screen
device.wait(Until.hasObject(By.text(«Calculator»)), 3000);
|
Используйте методы findObject
и click
чтобы получить ссылку на значок калькулятора и имитировать щелчок.
1
2
|
UiObject2 calculatorApp = device.findObject(By.text(«Calculator»));
calculatorApp.click();
|
5. Проверьте пользовательский интерфейс калькулятора
Запустите приложение «Калькулятор» на вашем Android-устройстве и используйте UI Automater Viewer для его проверки. Сделав снимок экрана, нажмите кнопки, чтобы увидеть, как вы можете их уникально идентифицировать.
В этом тестовом примере калькулятор вычислит значение 9 + 9 = и проверит, показывает ли оно 18 как результат. Это означает, что вам нужно знать, как идентифицировать кнопки с метками 9 , + и = .
На моем устройстве вот что я собрал из проверки:
- Кнопки, содержащие цифры, имеют соответствующие
text
значения. - Кнопки, содержащие символы + и =, имеют значения
content-desc
установленные на плюс и равно соответственно. - Результат отображается в виджете
EditText
.
Обратите внимание, что эти значения могут отличаться на вашем устройстве, если вы используете другую версию приложения Калькулятор.
6. Создайте тест
На предыдущих шагах вы уже узнали, что можете использовать метод findObject
вместе с By.text
или By.desc
чтобы получить ссылку на любой объект на экране. Вы также знаете, что вы должны использовать метод click
для имитации щелчка по объекту. Следующий код использует эти методы для выполнения расчета 9 + 9 = . Добавьте его в метод testAdd
класса CalculatorTester
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
// Wait till the Calculator’s buttons are on the screen
device.wait(Until.hasObject(By.text(«9»)), 3000);
// Select the button for 9
UiObject2 buttonNine = device.findObject(By.text(«9»));
buttonNine.click();
// Select the button for +
UiObject2 buttonPlus = device.findObject(By.desc(«plus»));
buttonPlus.click();
// Press 9 again as we are calculating 9+9
buttonNine.click();
// Select the button for =
UiObject2 buttonEquals = device.findObject(By.desc(«equals»));
buttonEquals.click();
|
На данный момент, вы должны ждать результата. Тем не менее, вы не можете использовать Until.hasObject
здесь, потому что EditText
содержащий результат, уже на экране. Вместо этого вы должны использовать метод waitForIdle
чтобы дождаться завершения расчета. Опять же, максимальная продолжительность ожидания может составлять 3000 мс.
1
|
device.waitForIdle(3000);
|
Получить ссылку на объект EditText
с помощью методов findObject
и By.clazz
. Получив ссылку, вызовите метод getText
чтобы определить результат вычисления.
1
2
|
UiObject2 resultText = device.findObject(By.clazz(«android.widget.EditText»));
String result = resultText.getText();
|
Наконец, используйте assertTrue
чтобы убедиться, что результат равен 18 .
1
|
assertTrue(result.equals(«18»));
|
Ваш тест завершен.
6. Запустите тест
Чтобы запустить тест, на панели инструментов Android Studio выберите класс CalculatorTester
из раскрывающегося списка и нажмите кнопку воспроизведения справа от него.
Как только сборка завершится, тест должен пройти и успешно завершиться. Во время выполнения теста вы должны увидеть, как на вашем Android-устройстве работает автоматизация пользовательского интерфейса.
Вывод
Из этого руководства вы узнали, как использовать среду тестирования UI Automator и UI Automater Viewer для создания тестов пользовательского интерфейса. Вы также видели, как легко запустить тест с помощью Android Studio. Несмотря на то, что мы протестировали довольно простое приложение, вы можете применить полученные здесь концепции для тестирования практически любого приложения для Android.
Вы можете узнать больше о библиотеке поддержки тестирования на сайте разработчиков Android .