Подделка ответов HTTP-запросов для тестирования в Android - PullRequest
4 голосов
/ 17 мая 2011

Я пишу приложение для Android, которому иногда требуется запрашивать данные через HTTP из REST API. Я использую Apache DefaultHttpClient для выполнения запросов. Есть ли способ написать тесты для этого приложения и «заменить» ответ DefaultHttpClient при запуске тестов, чтобы результаты тестов всегда были согласованы?

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

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

Я думаю, что в идеале у меня был бы способ получить модифицированный DefaultHttpClient при запуске тестов, который возвращает жестко запрограммированный результат для запросов к заданному URL-адресу вместо того, чтобы фактически выполнять сетевой запрос. Таким образом, я всегда получал бы последовательные результаты независимо от ответа реального веб-сервиса.

В настоящее время я использую Robotium для тестирования, но я открыт и для других инструментов.

Ответы [ 4 ]

2 голосов
/ 17 мая 2011

Вы могли бы попробовать Чарльза за что-то подобное. Сорта не кодовое решение.

http://www.charlesproxy.com/

Я использую обратные прокси Чарльза и локальный инструмент карты для подобных вещей.

То, что вы делаете, это направляет запрос в локальный ящик на обратном прокси-порту. Чарльза, в свою очередь, можно настроить для предоставления статически жестко закодированного плоского файла, но для вашего приложения это выглядит как 100% подлинный ответ веб-службы.

Есть много других интересных вещей, которые вы можете сделать с Чарльзом - наблюдать за трафиком из вашего приложения для Android и с вашего сервера и точек останова (что позволяет настраивать запросы и ответы до их отправки и получения). Определенно стоит проверить.

2 голосов
/ 17 мая 2011

Да, вы можете определенно «подделывать» ответы при использовании инфраструктуры HttpClient.Это довольно запутанно, и мне придется оставить большинство деталей на ваше усмотрение, но я дам вам краткий обзор:

  1. Реализация ClientHttpRequestFactory, главным образом, чтобы вы могли переопределитьcreateRequest() метод, чтобы вы могли ...

  2. Вернуть вашу пользовательскую реализацию ClientHttpRequest, в которой вы можете переопределить метод execute(), чтобы вы могли ...

  3. Возвращает пользовательскую реализацию ClientHttpResponse, в которой вы, наконец, сможете возвращать свои поддельные данные ответа, например, getBody() может возвращать содержимое файла, вы можете жестко закодировать заголовки в getHeaders() и т. Д.

Остальные выясняют, как наилучшим образом связать все эти махинации с уровнем обслуживания.

0 голосов
/ 17 сентября 2012

Полагаю, вы заинтересованы в написании функциональных тестов с использованием стандартной среды тестирования Android Junit. Таким образом, вы можете просто реализовать части API, которые вы используете, на своем веб-сервере и указывать на этот сервер при запуске ваших тестов.

Если вы хотите, чтобы ваши тесты были автономными, вы можете использовать Http-сервер, работающий на устройстве. Примеры использования Http-сервера, доступного в библиотеке классов Android: здесь и здесь .

0 голосов
/ 17 мая 2011

Другим вариантом является использование Dependency Injection, чтобы вы могли изменить HttpClient при запуске тестов. Проверьте Guice , если вы заинтересованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...