Подделка ответов на HTTP-запросы для тестирования в Android

#android #testing

#Android #тестирование

Вопрос:

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

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

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

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

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

Комментарии:

1. Смотрите github.com/fabiolnm/FakeWeb-Android-Project , реализация, которая соответствует предложениям dmon.

Ответ №1:

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

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

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

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

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

Комментарии:

1. Я хотел бы отметить, что мы также используем Robotium для тестирования, так что вы на правильном пути.

Ответ №2:

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

http://www.charlesproxy.com/

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

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

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

Ответ №3:

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

Ответ №4:

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

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