2013-09-04 3 views
2

У меня есть приложение на основе веб-сервисов, то есть каждое действие вызывает конкретный веб-сервис и заполняет данные в представлении. Я еще не проводил никаких тестов, но я был в процессе перехода на Volley и думал, что могу добавить и некоторые тесты.Стратегия тестирования для приложения для Android, основанного на веб-сервисах

Мне было интересно, какие стратегии тестирования должны быть для таких приложений. Я играю с gradle-android-test-plugin, и хотя Robolectric не играет хорошо с Volley, он должен скоро (надеюсь).

В любом случае, поэтому структура я использую для моего приложения заключается в следующем:

  • ObjectJacksonRequest класс, получить данные из веб-сервисов и разбирает их в POJOs
  • RequestQueue стандартной очереди запросов залп
  • BaseActivity родительская активность всех моих приложений, в которых находится объект RequestQueue и другие распространенные вещи
  • Различные абстрактные действия, которые я использую для разделения кода пользовательского интерфейса из сети рабочий код. Например, AbstractAppleActivity расширяется любой деятельностью, для которой требуется яблоко. В абстрактной деятельности делаются такие вещи, как проверка того, остается ли Apple в памяти при возврате, загружать новые, настраивать адаптеры для просмотра списка и т. Д.

Вот вопросы, которые у меня есть. У меня есть интуиция в ответах, но я хочу услышать от сообщества. Я уверен, что есть другие вопросы тоже, что люди могли бы иметь, и мы можем добавить их в этот список:

  • Что такое хороший способ проверить ObjectJacksonRequest объект для различных веб-сервисов? Должен ли я писать отдельный тест для каждой веб-службы, которая возвращает и объект?
  • Должен ли я тестировать сетевые запросы с помощью реальных веб-сервисов или высмеивать ответы?
  • Должен ли я тестировать BaseActivity и абстрактные действия или действия, которые расширяют его для его функциональности?
  • Каков наилучший способ проверить активность, которая не имеет значений, вставленных до тех пор, пока веб-запрос не будет завершен? Например, активность, которая загружает список яблок.

ответ

1
  • Что такое хороший способ проверить ObjectJacksonRequest объект для различных веб-сервисов? Должен ли я писать отдельный тест для каждого веб-сервиса , который возвращает и объект?

Если я понять его правильно вы хотите проверить WebService бэкенд. В этом случае я бы написал тест за вызов или даже несколько тестов на один вызов, каждый из которых тестировал каждый сенариовый ответ.

  • Должен ли я испытывать сетевые запросы с фактическими или веб-сервисов издеваться ответов?

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

  • Должен ли я испытывать BaseActivity и абстрактные деятельности или деятельности, которые расширяют его для его функциональность?

Я бы не проверить BaseActivities, если они не имеют много логики.

  • Что такое лучший способ проверить деятельность, которая не имеет каких-либо значений, вставленные до запроса веб-не будет завершено? Например, операция , которая загружает список яблок.

Отметьте ответ webservice, чтобы он имел значения. Вы можете сделать это с помощью Robolectric. Я считаю, что соответствующий метод Robolectric.addRequestInterceptor

0

У меня больше опыта тестирования теперь так вот мои предложения собраны для различных источников:

- What's a good way to test the ObjectJacksonRequest object for the various web services ? 
- Should I be writing a separate test for each web service that returns an object ? 
- Should I be testing the BaseActivity and the abstract activities or the activities that extend it for it's functionality ? 

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

- Should I be testing network requests with the actual webservices or mock the responses ? 

Это простой способ. Всегда издевайтесь. Как упоминалось в другом ответе, вы рискуете написать тесты flaky, если вы используете настоящие веб-сервисы. Не говоря уже о том, что тестирование веб-сервисов не является вашей ответственностью. Вы должны только тестировать код, за который вы отвечаете.

- What is the best way to test an activity that doesn't have any values inserted until the web request is completed ? For example, an activity that loads a list of apples 

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

Другие Примечания:

Хотя приведенные выше конкретные ответы. В целом я счел полезным сделать некоторые технические решения, которые облегчают не только тестирование, но и модульность ваших приложений. Так вот некоторые из моих советов и доводов от инженерных ошибок, которые у меня были в дизайне приложения, в зависимости от вопроса.

  • Использование пользовательских оберток для сервисов: В моем вопросе я пытаюсь перейти от оригинального HTTP-приложения к Volley. Одной из причин этих проблем является то, что дизайн приложения соединяет приложение с сетевой библиотекой. Один из способов обойти это - использовать в свой код классы-оболочки injected. Затем базовая реализация класса-оболочки может измениться без влияния на другой исходный код. У меня есть сообщение в блоге по этой теме here.
  • Используйте Java-модули: плагин Android-плагинов, основанный на плагине java. Поэтому вы можете создавать модули библиотеки Java в своем проекте приложения для Android. Я нашел, что это лучший способ для unit test вашего кода, который не взаимодействует с Android API. Это проще и быстрее, чем платформа тестирования Android и Robolectric. Я нахожу, что когда я использую модуль библиотеки Java, мой код пользовательского интерфейса становится легче, потому что я стараюсь как можно больше работать в модуле Java.
Смежные вопросы