Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
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 имеет несколько основных классов для тестирования:
Допустим, у нас есть приложение из двух экранов. На первом пользователь должен ввести своё имя и нажать на кнопку для перехода на вторую активность, в которой выводится приветственное сообщение. Нечто подобное мы делали в примере Передача данных между активностями. Можете взять пример за основу.
В сокращённом виде код для двух активностей.
// Щелчок кнопки у первой активности
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()) доступны и другие действия над компонентами:
Также доступно тестирование адаптеров, потоков и других вещей. По ссылкам можно изучить другие примеры.
Square Island: Espresso: Custom Idling Resource
Square Island: Espresso: Elapsed time
Кофе с огурцами (Espresso + Cucumber)
Introduction to Android Espresso – Android Research Blog