Разработка приложений для смартфонов на ОС Аndroid

Основы тестирования и отладки приложений на смартфоне

Разбить на страницы
Показывать лекцию целиком

Задачи лабораторной работы

рассмотреть создание тестирующего приложения на основе 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

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. (рис 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

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

    Информация о запущенных тестах содержит следующие пункты:

  • общее время, затраченное на исполнение теста;
  • количество запусков (Runs) — количество тестов в классе;
  • количество ошибок (Errors) — количество ошибок и исключений, обнаруженных в приложении за время работы теста;
  • количество провалов (failures) – количество неудачных испытаний во время работы теста;
  • полоса состояния, если тесты прошли успешно, полоса остается зеленой, если тест провален, полоса становится красной;
  • под полосой состояния можно увидеть описание каждого класса в тестирующем приложении, можно просмотреть результаты каждого метода тест-класса.
  • Спровоцируем провал некоторых тестов

    Посмотрим, что произойдет в 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;

    http://habrahabr.ru/post/219655/.

    Страницы:

    Задачи лабораторной работы

    рассмотреть создание тестирующего приложения на основе 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

    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. (рис 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

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

    Информация о запущенных тестах содержит следующие пункты:

  • общее время, затраченное на исполнение теста;
  • количество запусков (Runs) — количество тестов в классе;
  • количество ошибок (Errors) — количество ошибок и исключений, обнаруженных в приложении за время работы теста;
  • количество провалов (failures) – количество неудачных испытаний во время работы теста;
  • полоса состояния, если тесты прошли успешно, полоса остается зеленой, если тест провален, полоса становится красной;
  • под полосой состояния можно увидеть описание каждого класса в тестирующем приложении, можно просмотреть результаты каждого метода тест-класса.
  • Спровоцируем провал некоторых тестов

    Посмотрим, что произойдет в 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;

    http://habrahabr.ru/post/219655/.

    Вернуться к учебному плану