Настройка среды для разработки Android приложений и автоматизации на Robotium

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

Что нам для этого понадобится.

А теперь обо всем, по-порядку. Выполняйте действия в описаной последовательности и все получится! Но если что пошло не так - пишите комментарии к статье, будем разбираться.

1. Установка Java

Как проверить установлена ли нужная версия java? Открываем консоль и пишем

java -version

 Должны получить что-то вроде

``` java version "1.6.0_29" Java(TM) SE Runtime Environment (build 1.6.0_29-b11) Java HotSpot(TM) Client VM (build 20.4-b02, mixed mode, sharing) ```

Если же получаем

``` "java" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. ```

тогда нужно скачать дистрибутив и установить со стандартной конфигурацией.

 

2. Установка Eclipse IDE

Скачиваем с официального сайта. Распаковываем в удобную директорию. Я устанавливаю в папку tools, где у меня находятся все инструменты касательно разработки (некоторые инструменты могут нестабильно работать из-за пробела в пути “Program Files”). Запускаем Eclipse

 

3.Установка Android SDK

Заходим на официальный портал для разработчиков Android. Скачиваем Android SDK и устанавливаем в удобную директорию.

После установки добавляем пути d:\tools\android\android-sdk\tools;d:\tools\android\android-sdk\platform-tools в системную переменную PATH

 

4. Установка нужных платформ

Открываем ADB Manager и устанавливаем все платформы. Установка может занять несколько часов, зависимо от вашего канала связи. 

 

5. Устанавливаем плагин для Eclipse 

Для этого, на главном меню Eclipse, выбираем Help -> Install new software

Нажимаем Add  и добавляем путь к репозиторию для установки

https://dl-ssl.google.com/android/eclipse/

Устанавливаем Developer Tools

Перезапускаем среду разработки, чтобы продолжить.

Указываем путь к Android SDK в Eclipse IDE. Для этого нажимаем Windows -> Preferences

 

5. Подготовка тестируемого приложения

За основу возьмем  семпловое приложение из директории семплов Android SDK. Например Notepad.

Для начала создадим проект в EclipseFile -> New -> Android Project

Указываем имя и выбираем Create project from existing sample

 

Выбираем API, например 7. На следующем окне выбираем приложение NotePad и нажимаем Finish.

Получаем созданный проект. Давайте запустим сборку приложения и проверим его функционал.

Должны получить следующее сообщение в консоле. 

``` [2012-01-15 11:30:11 - Notepad] ------------------------------ [2012-01-15 11:30:11 - Notepad] Android Launch! [2012-01-15 11:30:11 - Notepad] adb is running normally. [2012-01-15 11:30:11 - Notepad] Performing com.example.android.notepad.NotesList activity launch [2012-01-15 11:30:11 - Notepad] Automatic Target Mode: launching new emulator with compatible AVD 'Default' [2012-01-15 11:30:11 - Notepad] Launching a new emulator with Virtual Device 'Default' ```

Ждем пока запустится эмулятор.

Это может занять от 1 минуты и иногда до 10ти. Эмулятор самое узкое место в написании программ под Android. В дальнейшем мы поговорим, какие есть альтернативы.

После запуска получаем наше приложение и можем ознакомиться с его функциональными возможностями.

6. Создаем тестовый проект

Создаем тестовый проект, используя проект существующего приложения. Для этого нажимаем правой клавишей мыши на проекте и выбираем Android Tools -> New Test Project

Получили еще один проект, но уже в нем будут храниться наши тесты.

 

7. Подключаем библиотеку Robotium

Загружаем Robotium jar файл в удобную директорию. Последняя версия, на момент написания статьи, robotium-solo-3.1.jar.

Подключаем библиотеку к тестовому проекту. Правый клик мышкой на тестовом проекте -> Build Path -> Configure Build Path -> Add External JARs...

 

Все готово для начала автоматизации!

8. Пишем тесты

Создаем первый  тестовый класс в пакете com.example.android.notepad.test. С вот таким содержимым

package com.example.android.notepad.test;

import android.test.ActivityInstrumentationTestCase2;

import com.example.android.notepad.NotesList;
import com.jayway.android.robotium.solo.Solo;

/**
 * Add note test
 * Example of simple Robotium test
 * 
 * @author adzynia
 *
 */
public class AddNoteTest extends ActivityInstrumentationTestCase2<NotesList>{
    
    private static final String APP_PACKAGE_NAME = "com.example.android.notepad";
    protected Solo solo;

    public AddNoteTest() {
        super(APP_PACKAGE_NAME, NotesList.class);
    }

    public void setUp() throws Exception {
        solo = new Solo(getInstrumentation(), getActivity());
    }
    
    public void testAddNote() throws Exception {
        solo.clickOnMenuItem("Add note");
        //Assert that NoteEditor activity is opened
        solo.assertCurrentActivity("Expected NoteEditor activity", "NoteEditor"); 
        //In text field 0, add TestNote
        String note = "TestNote";
        solo.enterText(0, note);
        solo.goBack();
        //Assert that TestNote is found
        assertTrue("Note 1 is not found", solo.searchText(note)); 
    }
    
    @Override
    public void tearDown() throws Exception {
        //Robotium will finish all the activities that have been opened
        solo.finishOpenedActivities();
    }
}

2 лайка

Также ОЧЕНЬ желательно:

1. английское имя учётной записи (касается всех систем), иначе могут быть самые разнообразные глюки: не заливается проект, эмуляторы в бут-луп уходят и тп.

Лечится переносом папки с эмуляторами из папки учетной запись в другое место и правкой пути к файлам в конфигах.

2. Путь к SDK не старайтесь сделать покороче.

3. Как Андрей говорил JAVA 1.6! С 1.7 тоже космические глюки бывают на ровном месте.

 

Вообщем я написал код теста для Robotium для .apk файла
Расставил Breakpoints. 

1. Как его запустить в Dedug (Eclipse)? Какую кнопку нажимать для возобновления (выполнения строки где стоит поинт)

2. Как избежать остановки запуска всех тестов, когда происходит первый fail. Т.е я запускаю все тесты, находит первый fail (прилага падает) и останавливается проверка последующих тестов.  Вот код

public void testForYouOpen() throws Exception {
    try {
        solo.waitForActivity("LoginActivity");
        assertTrue(
            "Wait for button (id: com.parrot.rhapsody.R.id.login_button_ok) failed.",
            solo.waitForView(solo.findViewById(
                "com.parrot.rhapsody.R.id.login_button_ok"), 20000, true));
        solo.clickOnView(solo.findViewById(
            "com.parrot.rhapsody.R.id.login_button_ok"));
        solo.waitForActivity("MainActivity");
        assertTrue("Wait for list failed.", solo.waitForView(AbsListView.class,
            1, 20000, true));
        solo.clickInList(2);
        boolean expected = false;
        boolean actual = solo.waitForText("Search");
        assertEquals("Search test is not found", expected, actual);
    } catch (AssertionFailedError e) {
        solo.fail("TestRhapsodyNameMenu.TestNameMenu.testRecorded_scr_fail", e);
        throw e;

    } catch (Exception e) {
        solo.fail("TestRhapsodyNameMenu.TestNameMenu.testRecorded_scr_fail", e);
        throw e;

    }
Послу окончания теста пишет это:
 
Test failed to run to completion. Reason: 'Instrumentation run 
failed due to 'java.lang.NullPointerException''.
Check device logcat for details

Эх, жаль все картинки потерялись.

Картинки починил, просто урлы поломались при миграции данных.

1 лайк

Если нужно тестировать / выполнять действия за пределами приложения,
рекомендую посмотреть в сторону RoboRemote — он позволяет одновременно писать тесты с использованием Robotium и UiAutomator.

Михаил, поправьте, пожалуйста, ссылку на анонс курсов – она не открывается.

Видео не доступно.

Увы видео уже недоступно. Удалил соответствующее упоминание из статьи.

Михаил, я заинтересовался автотестами на роботиуме и делал все по инструкции. И в конце при попытке запустить тесты, нажав в Эклипс на папке с проектом:

folder Notepad -> right click -> Run as: android JUnit test

получаю с консоли результат:

[2015-07-09 08:41:20 - NotePad] Android Launch!
[2015-07-09 08:41:20 - NotePad] adb is running normally.
[2015-07-09 08:41:20 - NotePad] Performing android.test.InstrumentationTestRunner JUnit launch
[2015-07-09 08:41:20 - NotePad] Automatic Target Mode: Preferred AVD 'VD' is available on emulator 'emulator-5554'
[2015-07-09 08:41:22 - NotePad] Application already deployed. No need to reinstall.
[2015-07-09 08:41:22 - NotePad] Launching instrumentation android.test.InstrumentationTestRunner on emulator-5554
[2015-07-09 08:41:22 - NotePad] Failed to launch test

Я в джава новичок, и, скорее всего, в спецификации проекта что-то не указал, например, подозреваю, в AndroidManifest.xml:

там я добавил android.test.InstrumentationTestRunner и направил его на пакет com.example.android.notepad.test

Соответствующий пакет com.example.android.notepad.test создал в папке tests (Notepad/tests->Notepad/tests/src/com/example/android/Notepad/test), путем создания папки test и помещения туда:
rightclick -> new -> class ‘MyTest’ и копипаст кода, приведенного Вами выше.

upd: Добавлял Тестовый проект неправильно, добавил через Android Tools - New Test Project. Сразу появился правильный пакет.

Также в Вашем сниппете кодировка кавычек поменялась: < и >