В данной статье мы рассмотрим процедуру тестирования приложения под ОС Android. И вместе с тем разберем фреймворк Espresso, поставляемый вместе с AndroidSupportRepository, позволяющий вам довольно просто писать тестовые скрипты. Мощь Espresso — в ее простоте.
В Espresso сильный упор сделан именно на UI. При этом тесты легко читаемы, так как состоят из довольно простых команд, вроде возьми эту кнопку, нажми ее и посмотри, как изменилось содержимое вон той текстовой метки.
Перед началом работы зайдите в SDK Manager и проверьте, установлен ли у вас AndroidSupportRepository. Если нет, то загрузите его.
Теперь пропишите все зависимости:
1 2 3 4 5 6 |
dependencies{ androidTestCompile 'com.android.support.test:testing-support-lib:0.1' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' } |
В defaultConfig добавьте следующую строку для запуска тестов:
1 2 3 4 5 |
defaultConfig{ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } |
Виды, действия и проверки.
Работа с этими составляющими вам и предстоит при написании тестов с Espresso. Фреймворк включает в себя три основные части. Их довольно легко запомнить:
- ViewMatchers — поиска какого-то нужно View на экране.
- ViewActions — выполнение действий с этим View, например, щелчок на кнопке или установка текста.
- ViewAssertions — проверка состояния View, например, того факта, что указанная текстовая метка содержит нужный текст.
Примеры.
Допустим, что наше приложение состоит всего из двух активностей. На первой активности мы вводим свое имя и планету, с которой прилетели. А на второй нас торжественно встречают:)
Теперь как написать тест? Во-первых, тест должен располагаться в папке androidTest и наследоваться от ActivityInstrumentationTestCase2.
Во-вторых, тест должен иметь конструктор, который в качестве аргумента конструктора суперкласса принимает класс тестируемой активности:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class EspressoHelloTest extends ActivityInstrumentationTestCase2<MainActivity> { public EspressoHelloTest() { super(MainActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); getActivity(); } } |
Метод setUp() вызывается перед стартом любых тестовых методов и предназначен для выполнения подготовительных действий. Теперь взглянем на текст самого теста:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@SmallTest public void testHello() { //заполняем textview onView(withId(R.id.nameEditText)).perform(typeText("Leo")); onView(withId(R.id.planetEditText)).perform(typeText("Mars")); //нажимаем на кнопку onView(withId(R.id.btnNext)).perform(click()); //проверяем полученный результат String result = "Приветствуем тебя, Leo, с планеты Mars"; onView(withId(R.id.textView)).check(matches(withText(result))); } |
В тесте мы просто указываем конкретные элементы по их id на экране. Если элемент на экране отсутствует, то тест завалится. perform() — это уже выполняемое действие, в скобках указано само действие, например, typeText() — напечатать текст, а click() означает нажатие клавиши.
Далее нам нужно провести проверку и сравнить полученный результат во втором окне с ожидаемым нами. На первом экране мы ввели имя и наименование планеты. Было бы неплохо, чтобы на другом окне нас действительно поприветствовали! Сначала мы находим текстовую метку, на которой должно отобразиться приветствие, а затем вызываем метод check() для проверки, совпадает ли ее содержимое с ожидаемым результатом.
Обратите внимание, что в тесте мы никак не указываем, что перешли на другую активность, а продолжаем просто оперировать идентификаторами элементов! Теперь кликните правой кнопкой мыши на файле с тестом и нажмите Run.
Тест успешно пройден! В случае неудачи тест завалится и выведет вам сообщение об ошибке.
Списки и метод onData().
Для взаимодействия с компонентами, представленными в виде списка и использующими адаптер, например, ListView или Spinner, придется освоить специальный метод onData().
Допустим, что теперь в нашем приложении планету мы не вводим в текстовое поле, а выбираем из выпадающего списка(Spinner).
Теперь взглянем на код теста, в нем изменилось не так уж и много.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@SmallTest public void testHello() { //заполняем textview onView(withId(R.id.nameEditText)).perform(typeText("Leo")); //находим spinner onView(withId(R.id.spinner)).perform(click()); //проверяем, что элемент является строкой и эквивалентен указанному нами значению, затем нажимаем на него onData(allOf(is(instanceOf(String.class)), is("Mars"))).perform(click()); //нажимаем на кнопку onView(withId(R.id.btnNext)).perform(click()); //проверяем полученный результат String result = "Приветствуем тебя, Leo, с планеты Mars"; onView(withId(R.id.textView)).check(matches(withText(result))); } |
Спасибо за статью. А подскажите пожалуйста как запускать последовательно несколько тестов?
не за что)рад, если статья оказалась полезной. Чтобы запустить несколько тестов сразу, можно щелкнуть на папке с тестами и нажать Select ‘Tests’. Потом запустить тесты на выполнение
Privet. Izvinite chto ne russkimi bukvami. Mne nujna pomosh s espresso dlya android. U vas est vremya ili jelanie pomoch mne s etim? Mojet znaete cheloveka ili kursi? Po oplate pogovorim esli est vozmojnost pozanimatsa so mnoi.
Spasibo.