Основы тестирования и отладки приложений на смартфоне
Задачи лабораторной работы
рассмотреть создание тестирующего приложения на основе JUnit
Введение
К вопросам тестирования мобильных приложений, разработанных под Android, имеет непосредственное отношение работа с эмулятором, который позволяет тестировать приложения без привлечения реальных устройств. Android SDK позволяет создавать эмулятор и запускать его на компьютере разработчика, существует набор ключевых клавиш для управления эмулятором, таблица ключевых клавиш:
http://developer.android.com/tools/help/emulator.html
Часто необходимо тестировать поведение приложения при поступлении входящего вызова, при получении SMS, а также работу приложений использующих дополнительные возможности смартфона: камеру, приемник GPS и другие возможности. Описание работы с эмулятором:
http://developer.android.com/tools/devices/emulator.html
Среда Android тестирования основана на использовании библиотеки JUnit, поэтому необходимо иметь представление о том, как устроена эта библиотека и как с ней работать, для первичного ознакомления можно порекомендовать видео-урок:
https://www.youtube.com/watch?v=QJZb1fNYh9c&list=PLB0276A0A62BDEF06&index=17
из целого набора видео-уроков "Java для тестировщиков":
https://www.youtube.com/playlist?list=PLB0276A0A62BDEF06.
И еще информация по JUnit: http://habrahabr.ru/post/120101/.
Инструменты тестирования в Android SDK
Android SDK включает мощные инструменты для тестирования приложений. Инструменты расширяют JUnit дополнительными возможностями; предоставляют готовые к использованию классы для объектов, имитирующих Android систему; дают контроль над главным приложением во время его тестирования.
В работе используем простое Android приложение из комплекта Android SDK, для которого создадим тестирующее приложение, тем самым продемонстрируем инструменты Android тестирования, включенные в Android IDE.
Ключевые моменты тестирования в Android IDE:
- Android тест сам является приложением, которое связано с тестируемым приложением, что отражено в его файле AndroidManifest.xml;
- вместо Adnroid-компонентов приложение тестов содержит один или более тестовых сценариев, каждый из которых является отдельным классом;
- классы Android тестов расширяют класс TestCase библиотеки JUnit;
- классы Android тестов для активностей расширяют JUnit и связываются с тестируемым приложением, можно передавать события: нажатие кнопки или касания экрана напрямую в пользовательский интерфейс;
- класс теста выбирается в соответствии с типом тестируемого компонента (приложение, активность, контент-провайдер или сервис);
- в Eclipse/ADT существуют дополнительные инструменты, обеспечивающие интегрированную поддержку создания тест-приложения, запуска его и просмотра результатов.
Тестирующее приложение содержит методы, которые выполняют следующие тесты:
- Тест начальных условий проверяет, что тестируемое приложение корректно инициализировано, тестируется метод onCreate(). Данный тест обеспечивает степень достоверности для последующих тестов.
- Тест пользовательского интерфейса (UI) проверяет, что главный UI процесс работает корректно. Данный тест демонстрирует аппаратные особенности доступные в тестировании активностей, показывает, что можно автоматизировать тестирование пользовательских интерфейсов, передавая события кнопок из тест-приложения в главное приложение.
- Тест управления состояниями демонстрирует возможности инструмента для запуска тестов, которые доступны при тестировании любого компонента.
Создание тестирующего приложения
- В качестве приложения для тестирования будем использовать уже готовое приложение, входящее в набор созданных разработчиками Android SDK примеров, приложение называется Spinner и содержится в наборе примеров (Samples). Мы взяли приложение из набора примеров для API 8.
Запустите Eclipse, создайте новое Android приложение, используя уже существующее:
New->Project...->Android->Android Project from Existing Code
в открывшемся диалоге выберите расположение проекта, это может выглядеть примерно, как на рис. 6.1. Убедитесь, что приложение запускается и что-то выполняет. Разумеется, не обязательно тестировать именно это приложение, можно и лучше использовать для этого Ваше Android приложение.
- Создадим тестирующее приложение.
В Eclipse New->Project...->Android->Android Test Project
Задайте имя проекта, обычно имя тестирующего проекта собирается следующим образом: имя тестируемого проекта + слово Test, в нашем случае получится SpinnerActivityTest. Далее необходимо указать тестируемый проект.
Теперь у нас есть простейшее Android приложение (SpinnerActivity) и пустое тестирующее приложение (SpinnerActivityTest).
Файл AndroidManifest.xml тестирующего приложения выглядит, как изображено на рис. 6.3. В разделе <instrumentation> указано где располагается тестируемый проект.
- Создадим класс тестов.
В пакете, расположенном в папке src/ проекта SpinnerActivityTest, создадим новый класс. Имя класса: SpinnerActivityTest, суперкласс:
android.test.ActivityInstrumentationTestCase2<SpinnerActivity>
Класс ActivityInstrumentationTestCase2 спроектирован для выполнения функционального тестирования одной или нескольких активностей приложения.
Чтобы была возможность обращаться к SpinnerActivity необходимо в файл SpinnerActivityTest.java добавить следующую строчку:
import com.android.example.spinner.SpinnerActivity;
Добавим конструктор класса тестов:
public SpinnerActivityTest(){ super("com.android.example.spinner", SpinnerActivity.class); }
Добавим метод начальных установок
Метод setUp() вызывается перед каждым тестом, используется для инициализации переменных и очистки значений после предыдущих тестов. Также можно использовать метод tearDown(), который вызывается после каждого теста, в этой лабораторной работе мы его рассматривать не будем.
Код метода:
@Override protected void setUp() throws Exception { super.setUp(); setActivityInitialTouchMode(false); mActivity = getActivity(); mSpinner = (Spinner)mActivity.findViewById (com.android.example.spinner.R.id.Spinner01); mPlanetData = mSpinner.getAdapter(); }
Рассмотрим метод:
- super.setUp()— вызывает конструктор суперкласса для setUp(), как этого требует JUnit;
- setActivityInitialTouchMode(false) – выключает режим касаний на эмуляторе и устройстве, если какой-то из ваших тестов передает события нажатия кнопок в приложение, необходимо отключать режим касаний перед запуском любой активности, иначе вызовы будут игнорироваться;
- getActivity() – получает ссылку на тестируемую активность, этот вызов также запускает активность, если это до сих пор не сделано;
- findViewById(int) – получает ссылку на виджет Spinner в тестируемом приложении;
- getAdapter() – получает ссылку на адаптер (массив строк) соответствующий Spinner.
В класс тестов необходимо добавить следующие элементы:
private SpinnerActivity mActivity;
private Spinner mSpinner;
private SpinnerAdapter mPlanetData;
И импортировать следующие пакеты:
import android.widget.Spinner;
import android.widget.SpinnerAdapter;