рассмотреть создание тестирующего приложения на основе 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=QJZb1fNYh9clist=PLB0276A0A62BDEF06index=17
из целого набора видео-уроков "Java для тестировщиков":
https://www.youtube.com/playlist?list=PLB0276A0A62BDEF06.
И еще информация по JUnit: http://habrahabr.ru/post/120101/.
Android SDK включает мощные инструменты для тестирования приложений. Инструменты расширяют JUnit дополнительными возможностями; предоставляют готовые к использованию классы для объектов, имитирующих Android систему; дают контроль над главным приложением во время его тестирования.
В работе используем простое Android приложение из комплекта Android SDK, для которого создадим тестирующее приложение, тем самым продемонстрируем инструменты Android тестирования, включенные в Android IDE.
Ключевые моменты тестирования в Android IDE:
TestCase библиотеки JUnit; Тестирующее приложение содержит методы, которые выполняют следующие тесты:
(рис 6.1) Импорт существующего Android-приложения
Запустите Eclipse, создайте новое Android приложение, используя уже существующее:
New->Project...->Android->Android Project from Existing Code
в открывшемся диалоге выберите расположение проекта, это может выглядеть примерно, как на рис 6.1. Убедитесь, что приложение запускается и что-то выполняет. Разумеется, не обязательно тестировать именно это приложение, можно и лучше использовать для этого Ваше Android приложение.
В Eclipse New->Project...->Android->Android Test Project
Задайте имя проекта, обычно имя тестирующего проекта собирается следующим образом: имя тестируемого проекта + слово Test, в нашем случае получится SpinnerActivityTest. Далее необходимо указать тестируемый проект.
(рис 6.2) Выбор тестируемого проекта.
Теперь у нас есть простейшее Android приложение (SpinnerActivity) и пустое тестирующее приложение (SpinnerActivityTest).
Файл AndroidManifest.xml тестирующего приложения выглядит, как изображено на рис 6.3. В разделе <instrumentation> указано где располагается тестируемый проект.
(рис 6.3) Файл манифеста приложения SpinnerActivityTest
(рис 6.4) Создание класса тестовых сценариев
В пакете, расположенном в папке 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;
Добавим тест начальных условий
Этот тест проверяет, что тестируемое приложение инициализировано корректно. Метод будет проверять следующее:
Код метода:
public void testPreConditions() {
assertTrue(mSpinner.getOnItemSelectedListener() != null);
assertTrue(mPlanetData != null);
assertEquals(mPlanetData.getCount(),ADAPTER_COUNT);
}
В класс тестов необходимо добавить элемент:
public static final int ADAPTER_COUNT = 9;
Добавим тест интерфейса пользователя
Создадим UI тест, который выбирает элементы из виджета спинер. Тест посылает события нажатия клавиш и проверяет, что выбор соответствует ожидаемым результатам.
Для работы со спинером тест должен запросить фокус и затем установить его в известную позицию, для этого используются методы requestFocus() и setSelection(). Оба эти метода взаимодействуют с представлениями тестируемого приложения, поэтому должны вызываться специальным образом.
Код для получения фокуса и установки выделения выглядит следующим образом:
mActivity.runOnUiThread(
new Runnable() {
public void run() {
mSpinner.requestFocus();
mSpinner.setSelection(INITIAL_POSITION);
}
}
);
Необходимо добавить его в метод:
public void testSpinnerUI() {
…
}
Необходимо добавить в класс тестов элемент:
public static final int INITIAL_POSITION = 0;
Далее необходимо сделать выбор элемента спинера для этого передадим событие нажатия кнопки в спинер:
this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
for (int i = 1; i <= TEST_POSITION; i++) {
this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
}
this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
Необходимо добавить в класс тестов элемент:
public static final int TEST_POSITION = 5;
Необходимо импортировать:
import android.view.KeyEvent;
Проверка результатов. Запросить текущее состояние спинера и сравнить его с ожидаемым значением. Вызов метода getSelectedItemPosition() позволит получить текущую выбранную позицию, а метод getItemAtPosition() возвращает элемент, соответствующий этой позиции (представленный в виде строки). Метод assertEquals(); проверяет совпадает ли полученное значение с ожидаемым "Saturn".
Добавьте в метод public void testSpinnerUI() следующий код:
mPos = mSpinner.getSelectedItemPosition(); mSelection = (String)mSpinner.getItemAtPosition(mPos); TextView resultView = (TextView)mActivity.findViewById (com.android.example.spinner.R.id.SpinnerResult); String resultText = (String) resultView.getText(); assertEquals(resultText,mSelection);
Необходимо добавить в класс тестов следующие элементы:
private String mSelection;
private int mPos;
И импортировать:
import android.widget.TextView;
Перед запуском теста необходимо удостовериться, что запущен эмулятор или подключено устройство, на котором будет производиться тестирование.
Для запуска теста в Package Explorer щелкните правой кнопкой на названии проекта тестов (SpinnerActivityTest), а затем выберите Run As→Android JUnit Test
После запуска теста появится новая вкладка JUnit рядом с вкладкой Package Explorer.
(рис 6.5) Вкладка JUnit
Эта вкладка содержит две панели. Верхняя панель содержит информацию о тестах, которые были запущены, нижняя панель содержит запись ошибок.
Информация о запущенных тестах содержит следующие пункты:
Посмотрим, что произойдет в Android IDE, когда тест будет провален. Можно быстро увидеть какой тест-класс был провален, найти метод или методы, которые были провалены, используя запись ошибки точно найти проблему.
Испортим в файле SpinnerActivity.java метод onCreate(), в этом файле есть закомментированная строка:
// spinner.setOnItemSelectedListener(null);
Снимите комментарий, тем самым проверим работу метода testPreCondition() класса SpinnerActivityTest, в этом методе в строке:
assertTrue(mSpinner.getOnItemSelectedListener() != null);
утверждается, что слушатель событий визуального компонента Spinner не равен null. После удаления символов комментария и запуска тестирующего проекта, это утверждение будет выдавать ошибку, т.е. тест будет провален. Результаты таких изменений на рис 6.6. Теперь полоса состояния стала красной, количество провалов равно 2. Очевидно желание разработчика посмотреть на эти провалы и увидеть точно, где они появились.
(рис 6.6) Вкладка JUnit, пример проваленных тестов
Чтобы найти место в коде, на котором был провален тест, достаточно щелкнуть мышью по строке в нижней панели Failure Trace появится список вызовов, который привел к провалу теста. Первая строка в этой панели сообщает об ошибке, чтобы увидеть место в коде, где произошел провал теста достаточно дважды щелкнуть по строке с ошибкой.
Выполненная работа продемонстрировала путь создания тестирующего проекта и способ связывания его с приложением, которое необходимо тестировать. Был выбран и добавлен класс тестовых сценариев, созданы тесты и запущен процесс тестирования: в первом случае без провалов, во втором случае созданы условия для провала тестов, рассмотрена вкладка JUnit с результатами тестирования.
Для дальнейшего развития имеет смысл ознакомиться с основными классами тестовых сценариев:
ActivityInstrumentationTestCase2 — класс функционального тестирования активности;
ActivityUnitTestCase — класс, обеспечивающий изолированное тестирование активности;
ProviderTestCase2 — класс, обеспечивающий тестирование контент-провайдера;
ServiceTestCase – класс, обеспечивающий тестирование сервиса;
Assert — множество методов утверждений;
MoreAsserts — дополнительные методы утверждений;
ViewAsserts – полезные методы для тестирования визуальных компонентов;
TouchUtils – методы, симулирующие сенсорные события активности;
Instrumentation – базовый инструментальный класс;
InstrumentationTestCase – базовый класс сценариев тестов;
InstrumentationTestRunner – стандартный класс запуска Android тестов.
В конце лабораторной работы хочется обратить внимание на статьи, посвященные рассмотрению автоматического тестирования приложений для Android:
http://software.intel.com/ru-ru/articles/automated-android-application-testing;
рассмотреть создание тестирующего приложения на основе 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=QJZb1fNYh9clist=PLB0276A0A62BDEF06index=17
из целого набора видео-уроков "Java для тестировщиков":
https://www.youtube.com/playlist?list=PLB0276A0A62BDEF06.
И еще информация по JUnit: http://habrahabr.ru/post/120101/.
Android SDK включает мощные инструменты для тестирования приложений. Инструменты расширяют JUnit дополнительными возможностями; предоставляют готовые к использованию классы для объектов, имитирующих Android систему; дают контроль над главным приложением во время его тестирования.
В работе используем простое Android приложение из комплекта Android SDK, для которого создадим тестирующее приложение, тем самым продемонстрируем инструменты Android тестирования, включенные в Android IDE.
Ключевые моменты тестирования в Android IDE:
TestCase библиотеки JUnit; Тестирующее приложение содержит методы, которые выполняют следующие тесты:
(рис 6.1) Импорт существующего Android-приложения
Запустите Eclipse, создайте новое Android приложение, используя уже существующее:
New->Project...->Android->Android Project from Existing Code
в открывшемся диалоге выберите расположение проекта, это может выглядеть примерно, как на рис 6.1. Убедитесь, что приложение запускается и что-то выполняет. Разумеется, не обязательно тестировать именно это приложение, можно и лучше использовать для этого Ваше Android приложение.
В Eclipse New->Project...->Android->Android Test Project
Задайте имя проекта, обычно имя тестирующего проекта собирается следующим образом: имя тестируемого проекта + слово Test, в нашем случае получится SpinnerActivityTest. Далее необходимо указать тестируемый проект.
(рис 6.2) Выбор тестируемого проекта.
Теперь у нас есть простейшее Android приложение (SpinnerActivity) и пустое тестирующее приложение (SpinnerActivityTest).
Файл AndroidManifest.xml тестирующего приложения выглядит, как изображено на рис 6.3. В разделе <instrumentation> указано где располагается тестируемый проект.
(рис 6.3) Файл манифеста приложения SpinnerActivityTest
(рис 6.4) Создание класса тестовых сценариев
В пакете, расположенном в папке 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;
Добавим тест начальных условий
Этот тест проверяет, что тестируемое приложение инициализировано корректно. Метод будет проверять следующее:
Код метода:
public void testPreConditions() {
assertTrue(mSpinner.getOnItemSelectedListener() != null);
assertTrue(mPlanetData != null);
assertEquals(mPlanetData.getCount(),ADAPTER_COUNT);
}
В класс тестов необходимо добавить элемент:
public static final int ADAPTER_COUNT = 9;
Добавим тест интерфейса пользователя
Создадим UI тест, который выбирает элементы из виджета спинер. Тест посылает события нажатия клавиш и проверяет, что выбор соответствует ожидаемым результатам.
Для работы со спинером тест должен запросить фокус и затем установить его в известную позицию, для этого используются методы requestFocus() и setSelection(). Оба эти метода взаимодействуют с представлениями тестируемого приложения, поэтому должны вызываться специальным образом.
Код для получения фокуса и установки выделения выглядит следующим образом:
mActivity.runOnUiThread(
new Runnable() {
public void run() {
mSpinner.requestFocus();
mSpinner.setSelection(INITIAL_POSITION);
}
}
);
Необходимо добавить его в метод:
public void testSpinnerUI() {
…
}
Необходимо добавить в класс тестов элемент:
public static final int INITIAL_POSITION = 0;
Далее необходимо сделать выбор элемента спинера для этого передадим событие нажатия кнопки в спинер:
this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
for (int i = 1; i <= TEST_POSITION; i++) {
this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
}
this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
Необходимо добавить в класс тестов элемент:
public static final int TEST_POSITION = 5;
Необходимо импортировать:
import android.view.KeyEvent;
Проверка результатов. Запросить текущее состояние спинера и сравнить его с ожидаемым значением. Вызов метода getSelectedItemPosition() позволит получить текущую выбранную позицию, а метод getItemAtPosition() возвращает элемент, соответствующий этой позиции (представленный в виде строки). Метод assertEquals(); проверяет совпадает ли полученное значение с ожидаемым "Saturn".
Добавьте в метод public void testSpinnerUI() следующий код:
mPos = mSpinner.getSelectedItemPosition(); mSelection = (String)mSpinner.getItemAtPosition(mPos); TextView resultView = (TextView)mActivity.findViewById (com.android.example.spinner.R.id.SpinnerResult); String resultText = (String) resultView.getText(); assertEquals(resultText,mSelection);
Необходимо добавить в класс тестов следующие элементы:
private String mSelection;
private int mPos;
И импортировать:
import android.widget.TextView;
Перед запуском теста необходимо удостовериться, что запущен эмулятор или подключено устройство, на котором будет производиться тестирование.
Для запуска теста в Package Explorer щелкните правой кнопкой на названии проекта тестов (SpinnerActivityTest), а затем выберите Run As→Android JUnit Test
После запуска теста появится новая вкладка JUnit рядом с вкладкой Package Explorer.
(рис 6.5) Вкладка JUnit
Эта вкладка содержит две панели. Верхняя панель содержит информацию о тестах, которые были запущены, нижняя панель содержит запись ошибок.
Информация о запущенных тестах содержит следующие пункты:
Посмотрим, что произойдет в Android IDE, когда тест будет провален. Можно быстро увидеть какой тест-класс был провален, найти метод или методы, которые были провалены, используя запись ошибки точно найти проблему.
Испортим в файле SpinnerActivity.java метод onCreate(), в этом файле есть закомментированная строка:
// spinner.setOnItemSelectedListener(null);
Снимите комментарий, тем самым проверим работу метода testPreCondition() класса SpinnerActivityTest, в этом методе в строке:
assertTrue(mSpinner.getOnItemSelectedListener() != null);
утверждается, что слушатель событий визуального компонента Spinner не равен null. После удаления символов комментария и запуска тестирующего проекта, это утверждение будет выдавать ошибку, т.е. тест будет провален. Результаты таких изменений на рис 6.6. Теперь полоса состояния стала красной, количество провалов равно 2. Очевидно желание разработчика посмотреть на эти провалы и увидеть точно, где они появились.
(рис 6.6) Вкладка JUnit, пример проваленных тестов
Чтобы найти место в коде, на котором был провален тест, достаточно щелкнуть мышью по строке в нижней панели Failure Trace появится список вызовов, который привел к провалу теста. Первая строка в этой панели сообщает об ошибке, чтобы увидеть место в коде, где произошел провал теста достаточно дважды щелкнуть по строке с ошибкой.
Выполненная работа продемонстрировала путь создания тестирующего проекта и способ связывания его с приложением, которое необходимо тестировать. Был выбран и добавлен класс тестовых сценариев, созданы тесты и запущен процесс тестирования: в первом случае без провалов, во втором случае созданы условия для провала тестов, рассмотрена вкладка JUnit с результатами тестирования.
Для дальнейшего развития имеет смысл ознакомиться с основными классами тестовых сценариев:
ActivityInstrumentationTestCase2 — класс функционального тестирования активности;
ActivityUnitTestCase — класс, обеспечивающий изолированное тестирование активности;
ProviderTestCase2 — класс, обеспечивающий тестирование контент-провайдера;
ServiceTestCase – класс, обеспечивающий тестирование сервиса;
Assert — множество методов утверждений;
MoreAsserts — дополнительные методы утверждений;
ViewAsserts – полезные методы для тестирования визуальных компонентов;
TouchUtils – методы, симулирующие сенсорные события активности;
Instrumentation – базовый инструментальный класс;
InstrumentationTestCase – базовый класс сценариев тестов;
InstrumentationTestRunner – стандартный класс запуска Android тестов.
В конце лабораторной работы хочется обратить внимание на статьи, посвященные рассмотрению автоматического тестирования приложений для Android:
http://software.intel.com/ru-ru/articles/automated-android-application-testing;
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.