Back to Top

Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Тестируем с Espresso

Espresso - это фреймворк для тестирования. Раньше распространялась как отдельная библиотека, но начиная с версии 2.0, Espresso стала частью репозитория Android Support Repository, что позволило быстро и удобно добавить поддержку тестов в ваш проект. Работает на устройствах и эмуляторе.

Писать тесты на Espresso очень удобно, так как много функционала она берёт на себя. Например, не нужно делать фокус на кнопке, проверять доступна ли она на экране и т.д., достаточно обратится к кнопке по её идентификатору или text/description и Espresso уже всё сделает за вас, если кнопка не видна или не доступна на экране то тест автоматом уже не пройдёт.

Espresso использует синхронизацию с основным потоком Main Thread.

Перед чтением статьи перечитайте материал Тестирование приложения, в котором даны основы тестирования.

Сейчас в студии необходимые записи вставляются автоматически.

В секции defaultConfig файла build.gradle модуля есть строка:


defaultConfig {
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

А также прописаны зависимости.


dependencies {
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
}

Перед тестированием следует отключить системные анимации. В настройках Settings | Developer options есть три опции для анимации, которые желательно отключить.

На этом подготовка закончена.

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

Espresso имеет несколько основных классов для тестирования:

  • Espresso – основной класс. Содержит в себе статические методы, такие как нажатия на системные кнопки (Back, Home), вызвать/спрятать клавиатуру, открыть меню, обратится к компоненту
  • ViewMatchers – позволяет найти компонент на экране в текущей иерархии
  • ViewActions – позволяет взаимодействовать с компонентом (click, longClick, doubleClick, swipe, scroll и т.д.)
  • ViewAssertions – позволяет утвердить состояние компонента

Тест первый - onView()

Допустим, у нас есть приложение из двух экранов. На первом пользователь должен ввести своё имя и нажать на кнопку для перехода на вторую активность, в которой выводится приветственное сообщение. Нечто подобное мы делали в примере Передача данных между активностями. Можете взять пример за основу.

В сокращённом виде код для двух активностей.


// Щелчок кнопки у первой активности
public void onClick(View view) {
    EditText nameEditText = (EditText) findViewById(R.id.editTextName);
    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
    intent.putExtra("name", nameEditText.getText().toString());

    startActivity(intent);
}

// Запускается вторая активность
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    String user = "";
    user = getIntent().getExtras().getString("name");

    TextView infoTextView = (TextView)findViewById(R.id.textViewInfo);
    infoTextView.setText("Hello " + user);
}

Для тестирования в студии уже есть пакет имя_пакета (androidTest), содержащий класс ExampleInstrumentedTest. Не обращаем на него внимания. Вам нужно открыть свой класс MainActivity (или любой другой класс для тестирования) и нажать комбинацию клавиш Ctrl+Shift+T. Появится диалоговое окно с предложением создать новый тест Create New Test.... Соглашаемся, появится диалоговое окно. Отмечаем методы, которые нас интересуют.

Далее указываем местоположение класса.

В созданной заготовке MainActivityTest.java пишем необходимый код.


package ru.alexanderklimov.as22;

import android.support.test.rule.ActivityTestRule;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;

public class MainActivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
            MainActivity.class);

    @Before
    public void setUp() throws Exception {

    }

    @Test
    public void onClick() throws Exception {
        onView(withId(R.id.editTextName)).perform(typeText("Barsik"));
        onView(withId(R.id.button)).perform(click());
        onView(withId(R.id.textViewInfo)).check(matches(withText("Hello Barsik")));
    }
}

Тестирование можно запустить через правый щелчок мыши на имени тестируемого класса. В нашем примере в текстовом поле должен напечататься текст "Barsik", произойти щелчок кнопки и проверка текстовой метки во второй активности на наличие текста "Hello Barsik". Если тест будет пройдён, то появится сообщение, подсвеченное зелёным цветом. Для проверки можете в текстовом поле ввести какой-нибудь текст. Тогда, во время тестирования к этому тексту припишется "Barsik", и сравнение на "Hello Barsik" не сработает. Или удалите вторую активность.

Кроме нажатия кнопки (click()) доступны и другие действия над компонентами:

  • ViewActions.click()
  • ViewActions.typeText()
  • ViewActions.pressKey()
  • ViewActions.clearText()
  • ViewActions.swipeRight()

Также доступно тестирование адаптеров, потоков и других вещей. По ссылкам можно изучить другие примеры.

Дополнительное чтение

Square Island: Espresso: Custom Idling Resource

Square Island: Espresso: Elapsed time

Кофе с огурцами (Espresso + Cucumber)

Introduction to Android Espresso – Android Research Blog

Реклама