#android #testing
#Android #тестирование
Вопрос:
Я пишу приложение для Android, которому иногда требуется запрашивать данные через HTTP из REST API. Я использую Apache DefaultHttpClient для выполнения запросов. Есть ли способ написать тесты для этого приложения и «заменить» ответ DefaultHttpClient при запуске тестов, чтобы результаты тестирования всегда были согласованными?
В качестве примера того, что я хотел бы протестировать, одна из веб-служб, к которым я обращаюсь, принимает строку и выполняет текстовый поиск, возвращая постраничный список объектов. Мне нужно протестировать случаи, когда список пуст, список помещается на первой странице или список больше страницы, и приложению необходимо выполнить несколько запросов, чтобы получить полный список.
Я не являюсь разработчиком этого веб-API и не могу изменять его ответы, поэтому я не могу изменить то, что он возвращает. В приведенном выше примере, если я хочу протестировать случай, когда возвращаемый список пуст, я мог бы просто выполнить поиск строки, которая, я уверен, не вернет никаких результатов, но в двух других случаях сложнее, потому что то, что может вернуть служба, постоянно меняется.
Я думаю, в идеале у меня был бы способ получить измененный DefaultHttpClient при запуске тестов, который возвращает жестко запрограммированный результат для запросов к заданному URL вместо фактического выполнения сетевого запроса. Таким образом, я всегда получал бы согласованные результаты независимо от ответа реального веб-сервиса.
В настоящее время я использую Robotium для тестирования, но я открыт и для использования других инструментов.
Комментарии:
1. Смотрите github.com/fabiolnm/FakeWeb-Android-Project , реализация, которая соответствует предложениям dmon.
Ответ №1:
Да, вы определенно можете «подделать» ответы при использовании фреймворка HttpClient. Это довольно запутанный процесс, и мне придется оставить большинство деталей на ваше усмотрение, но я дам вам краткий обзор:
-
Реализуйте
ClientHttpRequestFactory
, главным образом для того, чтобы вы могли переопределитьcreateRequest()
метод, чтобы вы могли… -
Верните свою пользовательскую реализацию
ClientHttpRequest
, в которой вы можете переопределитьexecute()
метод, чтобы вы могли… -
Верните свою пользовательскую реализацию
ClientHttpResponse
, вgetBody()
которой вы, наконец, сможете возвращать свои поддельные данные ответа, например,getHeaders()
можете возвращать содержимое файла, вы можете жестко закодировать заголовки в, и т.д.
Остальное выясняет, как наилучшим образом привязать все эти махинации к вашему уровню обслуживания.
Комментарии:
1. Я хотел бы отметить, что мы также используем Robotium для тестирования, так что вы на правильном пути.
Ответ №2:
Вы могли бы дать Чарльзу попробовать что-то подобное. Своего рода некодовое решение.
Я использую обратные прокси Чарльза и инструмент map local для подобных вещей.
Что вы делаете, так это направляете свой запрос в свой локальный ящик на обратном прокси-порту. Charles, в свою очередь, может быть настроен на предоставление статического жестко запрограммированного плоского файла, но для вашего приложения это выглядит как 100% подлинный ответ веб-службы.
Есть много других интересных вещей, которые вы можете делать с Charles — отслеживать трафик из вашего приложения Android на ваш сервер и с вашего сервера и точки останова (что позволяет вам настраивать запросы и ответы до их отправки и получения). Определенно стоит проверить.
Ответ №3:
Другой вариант — использовать внедрение зависимостей, чтобы вы могли изменять HttpClient при запуске тестов. Проверьте Guice, если вам интересно.
Ответ №4:
Я предполагаю, что вы заинтересованы в написании функциональных тестов с использованием стандартной платформы тестирования Android Junit. Таким образом, вы могли бы просто реализовать части API, которые вы используете, на своем собственном веб-сервере и указывать на этот сервер при запуске ваших тестов.
Если вы предпочитаете, чтобы ваши тесты были автономными, вы могли бы реализовать Http-сервер, который работает на устройстве. Примеры использования Http-сервера, доступного в библиотеке классов Android, находятся здесь и здесь.