Не даем роботу падать. Тестирование Android-приложений, Дмитрий Ситников, Rus Wizards

+10

No comments posted yet

Comments

Slide 6

Подумать, может убрать совсем.

Slide 18

Придумать новый заголовок с Syncplicity

Slide 1

Не даем роботу падать Тестирование Android приложений Дмитрий Ситников

Slide 2

Инструменты Написание тестов Android unit tests Robotium Robolectric Дополнительные иснструменты Monkeyrunner UI/Application Exerciser Monkey Roboguice Android-mock …

Slide 3

Android unit tests Junit 3, только в профиль Использует собственный InstrumentationTestRunner Запускается на Dalvik

Slide 4

Android unit tests, архитектура

Slide 5

Основные классы AndroidTestCase – основной класс для unit тестов ActivityUnitTestCase – для тестирования в изоляции, можно внедрить свои Context и Application. ActivityInstrumentationTestCase2 – для запуска activity в нормальной среде c контекстом и объектом приложения. Context и Application нельзя заменять mock-объектами, но можно запускать любой свой Intent SingleLaunchActivityTestCase – для продолжительного тестирования одного Activity в неизменной среде, не предполагает внедрения mock-объектов ApplicationTestCase ServiceTestCase – для Unit тестов с поддержкой mock-ов ProviderTestCase

Slide 6

Android unit tests & Activities // “Запускаем” Activity mActivity = getActivity(); // Получаем объект из активити, это спинер (аналог комбо-бокса) mSpinner = (Spinner)mActivity.findViewById(com.android.example.spinner.R.id.Spinner01); // Устанавливаем спинеру позицию mActivity.setSpinnerPosition(TEST_STATE_DESTROY_POSITION); // Останавливаем Activity - Метод onDestroy() должен сохранить состояние спинера mActivity.finish(); // Рестартуем Activity - Метод onResume() должен восстановить его состояние mActivity = getActivity(); // Узнаем позицию спинера int currentPosition = mActivity.getSpinnerPosition(); // Проверяем, что она не изменилась assertEquals(TEST_STATE_DESTROY_POSITION, currentPosition); Unit тесты не запрещают тестирование Activities

Slide 7

Robotium  Как селениум, но для Android Надстройка над unit-тестами Тестирование на эмуляторе и реальных устройствах Имеет средства для кликов прокрутки поиска текста Умеет искать элементы по id по тексту

Slide 8

Robotium, тонкие моменты Ищет текст только вниз от текущей позиции Не «знает» про виртуальную клавиатуру Требует отключения блокировки экрана Не умеет работать с чужими Activity Работает медленно

Slide 9

 Robolectric Большой набор заглушек для полноценной работы на JVM Удобный механизм для тестирования Http запросов Можно использовать свои mock, DI в том числе roboguice Shadow-классы как замена mock+DI

Slide 10

 Robolectric, shadow-классы

Slide 11

 Robolectric, shadow-классы

Slide 12

 Robolectric, тонкие моменты Тесты Activity != UI тестам SQLite не обязательно будет работать так, как работает на устройстве Сложно тестировать системы с большим числом зависимостей Сложности со сторонними библиотеками По умолчанию логи не попадут LogCat

Slide 13

Приложени протестировано, в нем нет ошибок? Конечно есть!

Slide 14

ACRA, если все-таки упал

Slide 15

ACRA, если все-таки упал Stack trace + дополнительные данные Не нужен Google API Не нужен Play Store Настраиваемый сервер сбора отчетов Настраиваемый набор параметров + можно получить репорт даже если ничего не упало

Slide 16

Тесты готовы, отчеты работают, это все? Конечно нет!

Slide 17

Непрерывная интеграция Для сборки – Ant/Maven Для запуска тестов – Android JUnit Report Test Runner Для скриншотов – android-screenshot-library Monkeyrunner – скриптинг запуска тестов на Python

Slide 18

Тесты в Syncplicity

Slide 19

Почему не TDD? Маленькой команде не хватало ресурсов поддерживать объем тестов, растущий пропорционально объему кода Тесты устаревали быстрее чем становились полезными Архитектура, ориентированная на тесты, хуже архитектуры, ориентированной на бизнес-задачу

Slide 20

Почему не TDD? Код, написанный для решения задач Код, написанный для тестов

Slide 21

Когда же все-таки TDD? Когда удается удержаться в рамках Black-box тестирования Когда тестируются ключевые особенности системы Когда планируется масштабный рефакторинг

Slide 22

Спасибо за внимание! Дмитрий Ситников fo2rist fo2rist dsitnikov@ruswizards.com

URL: