Тестирование сервисов


Android содержит фреймворк тестирования для объектов сервисов, который может запускать их в изоляции и позволяет использовать mock объекты. Класс тестов для объектов сервисов – ServiceTestCase. Так как класс сервиса, предположительно, отделен от своих клиентов, вы можете тестировать объект сервиса без использования instrumentation.

Этот документ описывает методы тестирования объектов сервисов. Если вы не знакомы с классом сервиса, пожалуйста, прочитайте Application Fundamentals. Если вы не знакомы с тестированием в Android, пожалуйста, прочитайте Основы тестирования Android приложений.

Дизайн сервиса и тестирование

При проектировании сервиса, вы должны рассмотреть, как тесты могут проверить различные состояния жизненного цикла сервиса. Если методы жизненного цикла, которые запускают ваш сервис, такие как OnCreate() или onStartCommand() не устанавливают глобальные переменные, чтобы указать об успешности своего выполнения, вы можете предоставить такую переменную в целях тестирования.

В большинстве своем тестированию способствуют методы тестового класса ServiceTestCase. Например методGetService() возвращает дескриптор сервиса во время тестирования, с помощью которого вы можете убедиться, что служба работает, даже в конце каждого теста.

ServiceTestCase

ServiceTestCase расширяет класс JUnit TestCase методами для тестирования permissions приложения и для управления тестируемым приложением и сервисом. Он также предоставляет mock объекты приложения и контекста, которые изолируют ваш тест от остальной системы.

ServiceTestCase откладывает инициализацию среды тестирования до вызова ServiceTestCase.startService() илиServiceTestCase.bindService(). Это позволяет вам настроить среду тестирования, в частности ваши mock объекты, до запуска сервиса.

Обратите внимание, что параметры ServiceTestCase.bindService() отличаются от параметров дляService.bindService(). Для версии ServiceTestCase вы предоставляете только Intent. Вместо возвращения boolean,ServiceTestCase.bindService() возвращает объект – подкласс IBinder.

Метод setUp() для ServiceTestCase вызывается перед каждым тестом. Он устанавливает фикстуру теста, делая копию текущего контекста системы до того момента, как методы теста затронут его. Вы можете получить этот контекст вызвавgetSystemContext(). Если вы переопределите этот метод, то вам нужно вызвать super.setUp() в качестве первого оператора в переопределении.

Методы setApplication() и SetContext(Context) позволяют задавать mock Context или mock Application (или оба сразу) для сервиса, прежде чем запустить его. Эти mock объекты описаны ниже в разделе Классы mock объектов.

По умолчанию, ServiceTestCase выполняет тестовый метод testAndroidTestCaseSetupProperly(), который подтверждает что базовый тестовый класс успешно создал контекст перед запуском.

Классы mock объектов

ServiceTestCase предполагает, что вы будете использовать mock Context или mock Application (или оба сразу) для среды тестирования. Эти объекты изолируют среду тестирования от остальной системы. Если вы не предоставите ваши собственные экземпляры этих объектов прежде чем запустить сервис, то ServiceTestCase создаст свои собственные внутренние экземпляры и внедрит их в сервис. Вы можете переопределить это поведение путем создания и внедрения собственный экземпляров перед запуском сервиса.

Чтобы внедрить mock Application объект в тестируемый сервис, сначала нужно создать подкласс MockApplication.MockApplication является подклассом Application, в котором все методы генерируют исключения, поэтому, чтобы использовать его эффективно ваш подкласс должен переопределить нужные вам методы. Затем он внедряется в сервис с помощью метода setApplication(). Этот mock объект позволяет контролировать значения приложения, которые видит сервис, и изолирует их от реальной системы. Кроме того, какие-либо скрытые зависимости вашего сервиса с приложением проявляются как исключения при выполнении теста.

Mock Context внедряется в сервис с помощью метода SetContext(). Классы mock Context, которые можно использовать, описаны более подробно в Основы тестирования Android приложений.

Что тестировать

В теме What To Test перечислены общие соображений тестирования Android компонентов. Вот некоторые конкретные рекомендации по тестированию сервисов:

  • Убедитесь, что OnCreate() вызывается в ответ на Context.startService() или Context.bindService(). Кроме того, вы должны убедиться, что OnDestroy() вызывается в ответ на Context.stopService(), Context.unbindService(), stopSelf(), илиstopSelfResult().
  • Протестируйте, что ваш сервис корректно обрабатывает множественные вызовы от Context.startService(). Только первый вызывает триггеры Service.onCreate(), а все остальные вызовы триггера вызываютService.onStartCommand().Кроме того, помните, что вызовы StartService() не вкладываются, поэтому один вызов Context.stopService()или Service.stopSelf() (но не stopSelf(int)) остановит сервис. Вы должны проверить, что ваш сервис останавливается в нужном месте.
  • Тестирование любой бизнес-логики, которую осуществляет ваш сервис. Бизнес-логика включает в себя проверку на недопустимые значения, финансовые и арифметические вычисления и так далее.

Источник

Перевод kraY

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *