Автоматизация тестирования пользовательского интерфейса на Android
Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)
Введение
Библиотека поддержки тестирования Android включает в себя фреймворк UIAutomator, который может использоваться для автоматического тестирования черного ящика в приложениях для Android. Внедренный в API-уровне 18, фреймворк позволяет разработчикам моделировать действия пользователей над виджетами, составляющими пользовательский интерфейс приложения.
В этом уроке я расскажу вам, как использовать фреймворк для создания и запуска теста базового пользовательского интерфейса для приложения калькулятора.
Предпосылки
Чтобы следовать уроку, вам нужно:
- последняя версия Android Studio
- устройство или эмулятор, работающий под управлением Android 4.3 или выше
- базовое понимание JUnit
1. Установка зависимостей
Чтобы использовать фреймворк UI Automator в вашем проекте, отредактируйте файл build.gradle в каталоге app вашего проекта, добавив следующие зависимости:
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'
Теперь кнопка Sync Now должна появиться на экране. Когда вы нажмете на нее, вы должны увидеть следующую ошибку:



Нажмите ссылку Установить репозиторий и синхронизировать проект, чтобы установить Android Support Repository.
Если вы используете библиотеку appcompat-v7 версии 22.1.1, вам нужно добавить следующую зависимость, чтобы убедиться, что приложение и его тесты используют одну и ту же версию com.android.support:support-annotations
:
androidTestCompile 'com.android.support:support-annotations:22.1.1'
Далее, из-за ошибки в Android Studio, вам нужно исключить файл с именем LICENSE.txt с помощью packagesOptions
. Если вы не сделаете этого, это приведет к следующей ошибке при попытке запустить тест:
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:
android { packagingOptions { exclude 'LICENSE.txt' } }
2. Создайте тестовый класс
Создайте новый тестовый класс CalculatorTester
, создав файл с именем CalculatorTester.java внутри каталога androidTest. Чтобы создать тест UI Automator, ваш класс должен наследоваться от InstrumentationTestCase
.



Нажмите Alt + Insert, а затем нажмите SetUp Method, чтобы переопределить метод setUp
.



Нажмите Alt + Insert еще раз и нажмите Test Method, чтобы создать новый тестовый метод. Назовите этот метод testAdd
. Класс CalculatorTester
теперь должен выглядеть следующим образом:
public class CalculatorTester extends InstrumentationTestCase{ @Override public void setUp() throws Exception { } public void testAdd() throws Exception { } }
3. Расмотрим пользовательский интерфейс Launcher
Подключите Android-устройство к компьютеру и нажмите кнопку «домой» на вашем устройстве, чтобы перейти на главный экран.
Вернитесь на свой компьютер и используйте свой проводник или терминал для поиска в каталоге, где установлен Android SDK. Затем перейдите в каталог tools внутри него и запустите uiautomatorviewer. Это запустит UI Automater Viewer. Вам должен быть представлен экран, который выглядит следующим образом:



Нажмите кнопку, похожую на телефон, чтобы сделать снимок экрана вашего устройства Android. Обратите внимание, что снятый снимок экрана является интерактивным. Нажмите значок «Приложения» внизу. В разделе Детали узла справа вы можете увидеть различные детали вашего выбора, как показано ниже.



Чтобы взаимодействовать с элементами на экране, фреймворк тестирования UI Automator должен иметь возможность однозначно идентифицировать их. В этом учебнике вы будете использовать либо text
, и content-desc
, либо class
элемента, чтобы однозначно идентифицировать его.
Как вы можете видеть, значок Приложения не имеет text
, но у него есть content-desc
. Запишите его значение, потому что вы будете использовать его на следующем шаге.
Выберите Android-устройство и нажмите значок «Приложения», чтобы перейти к экрану, на котором отображаются приложения, установленные на устройстве. Вернитесь в UI Automator Viewer и сделайте еще один снимок экрана. Поскольку вы будете писать тест для приложения Calculator, щелкните его значок, чтобы просмотреть его детали.



На этот раз content-desc
пустой, но text
содержит значение Calculator. Запомните это.
Если на вашем Android-устройстве запущен другой ланчер или другая версия Android, экраны и детали узла будут разными. Это также означает, что вам придется внести некоторые изменения в свой код в соответствии с операционной системой.
4. Подготовка тестовой среды
Вернитесь в Android Studio, чтобы добавить код в метод setUp
. Как следует из его названия, метод setUp
должен использоваться для подготовки тестовой среды. Другими словами, здесь вы указываете, что нужно сделать, прежде чем запускать фактический тест.
Теперь вы будете писать код, чтобы имитировать то, что вы сделали на своем устройстве Android на предыдущем шаге:
- Нажмите кнопку home, чтобы перейти на главный экран.
- Нажмите значок «Приложения», чтобы просмотреть все приложения.
- Запустите приложение «Калькулятор», нажав на его значок.
В своем классе объявите поле типа UiDevice
и назовите его device
. Это поле представляет собой Android-устройство, и вы будете использовать его для имитации взаимодействия с пользователем.
private UiDevice device;
В методе setUp
инициализируйте device
, вызвав метод UiDevice.getInstance
, передав экземпляр Instrumentation
, как показано ниже.
device = UiDevice.getInstance(getInstrumentation());
Чтобы имитировать нажатие кнопки home на устройстве, вызовите метод pressHome
.
device.pressHome();
Затем вам нужно смоделировать событие click на значке Apps. Вы не можете сделать это немедленно, потому что Android-устройству потребуется время, чтобы перейти на главный экран. Попытка щелкнуть значок «Приложения» до того, как он будет виден на экране, вызовет исключение во время выполнения.
Чтобы подождать, чтобы что-то произошло, вам нужно вызвать метод wait
у экземпляра UiDevice
. Чтобы дождаться появления значка Apps на экране, используйте метод Until.hasObject
.
Чтобы определить значок приложения, используйте метод By.desc
и передайте ему значение Apps. Вам также необходимо указать максимальную продолжительность ожидания в миллисекундах. Установите его на 3000. Это приводит к следующему коду:
// Wait for the Apps icon to show up on the screen device.wait(Until.hasObject(By.desc("Apps")), 3000);
Чтобы получить ссылку на значок «Приложения», используйте метод findObject
. После того, как у вас есть ссылка на значок Приложения, вызовите метод click
для имитации щелчка.
UiObject2 appsButton = device.findObject(By.desc("Apps")); appsButton.click();
Как и раньше, нам нужно подождать, пока значок Калькулятора появится на экране. На предыдущем шаге вы видели, что значок калькулятора можно однозначно идентифицировать по его полю text
. Мы вызываем метод By.text
, чтобы найти значок, передавая Calculator
.
// Wait for the Calculator icon to show up on the screen device.wait(Until.hasObject(By.text("Calculator")), 3000);
Используйте методы findObject
и click
, чтобы получить ссылку на значок калькулятора и эмулировать клик.
UiObject2 calculatorApp = device.findObject(By.text("Calculator")); calculatorApp.click();
5. Инспектируем пользовательский интерфейс калькулятора
Запустите приложение «Калькулятор» на своем устройстве Android и используйте UI Automater Viewer, чтобы инспектировать его. После захвата снимка экрана щелкните кнопки, чтобы увидеть, как вы можете однозначно идентифицировать их.
Для этого тестового примера вы заставим калькулятор вычислить значение 9 + 9 = и проверим, показывает ли он 18 в качестве результата. Это означает, что вам нужно знать, как идентифицировать кнопки с метками 9, + и =.



На моем устройстве я собрал следующее из инспекции:
- Кнопки, содержащие цифры, имеют соответствующие значения
text
. - Кнопки, содержащие символы + и =, имеют значения
content-desc
, установленные как plus и equals соответственно. - Результат показан в виджетах
EditText
.
Обратите внимание, что эти значения могут отличаться на вашем устройстве, если вы используете другую версию приложения Calculator.
6. Создаем тест
На предыдущих шагах вы уже узнали, что вы можете использовать метод findObject
вместе с By.text
или By.desc
, чтобы получить ссылку на любой объект на экране. Вы также знаете, что вам нужно использовать метод click
для имитации клика на объекте. Следующий код использует эти методы для выполнения вычисления 9 + 9 =. Добавьте его в метод testAdd
класса CalculatorTester
.
// 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 мс.
device.waitForIdle(3000);
Получите ссылку на объект EditText
с помощью методов findObject
и By.clazz
. Когда у вас есть ссылка, вызовите метод getText
, чтобы определить результат вычисления.
UiObject2 resultText = device.findObject(By.clazz("android.widget.EditText")); String result = resultText.getText();
Наконец, используйте assertTrue
, чтобы проверить, что результат равен 18.
assertTrue(result.equals("18"));
Теперь ваш тест завершен.
6. Запуск теста
Чтобы запустить тест, на панели инструментов Android Studio выберите класс CalculatorTester
из раскрывающегося списка и нажмите кнопку play справа.



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



Заключение
В этом уроке вы узнали, как использовать фреймворк тестирования Automator UI и UI Automater Viewer для создания тестов пользовательского интерфейса. Вы также видели, как легко запускать тесты с помощью Android Studio. Несмотря на то, что мы протестировали довольно простое приложение, вы можете применить концепции, которые вы здесь изучили, для тестирования практически любого приложения для Android.
Вы можете узнать больше об библиотеке поддержки тестирования на веб-сайте разработчиков Android.