Как вы делаете модульный тест, когда результаты меняются? - PullRequest
10 голосов
/ 06 января 2009

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

Веб-служба отправляет обратно страницу HTML или не содержит результатов поиска. Я не могу реально изменить веб-сервис. Мое приложение в основном запрашивает веб-сервис с использованием HTTPURLConnection и получает ответ в виде строки.

Надеюсь, это поможет более подробно.

Ответы [ 5 ]

26 голосов
/ 06 января 2009

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

Посмотрите на jMock для Java-макетов.

6 голосов
/ 06 января 2009

Строго говоря, о модульном тестировании можно тестировать только те модули, которые имеют детерминированное поведение .

Тест, который подключается к внешнему веб-серверу, - это интеграционный тест .

Решение состоит в том, чтобы смоделировать HTTPURLConnection, то есть создать класс в ваших модульных тестах, который наследуется от класса HTTPURLConnection и возвращает жестко закодированное или параметризуемое значение. РЕДАКТИРОВАТЬ : обратите внимание, что это может быть сделано в военном отношении, без каких-либо насмешливых рамок.

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

Вы также можете сделать свой HTTPURLConnectionMock способным генерировать IOException, чтобы проверить условия ошибки . Просто есть метод, чтобы сказать не возвращать результат, а исключение при следующем запросе.

3 голосов
/ 06 января 2009

Ваш вопрос немного открытый, но есть несколько тестируемых вариантов, использующих только приведенную выше информацию:

  1. Вы можете проверить, работает ли запрос вообще. Утвердите, что вы должны получить непустой / ненулевой набор результатов.
  2. Вы можете проверить, является ли результат запроса действительным набором результатов. Утвердите, что результаты должны пройти ваш код проверки (поэтому на данный момент вы знаете, что данные ненулевые, не бессмысленные и, возможно, полезные).
  3. Если вам что-нибудь известно о схеме данных / описании данных, вы можете утверждать, что поля являются разумными по отношению друг к другу. Например, если вы получили результат с вертолетом, он не должен ассоциироваться с высотой минус 100 метров ....
  4. Если вы знаете что-либо о вероятностном распределении данных, вы должны иметь возможность собрать набор данных и утверждать, что полученное вами распределение находится в пределах стандартного отклонения от того, что вы ожидаете увидеть.

Я уверен, что с некоторой дополнительной информацией вы получите кучу полезных советов.

3 голосов
/ 06 января 2009

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

Обычно я ожидаю, что результаты юнит-теста не изменятся или, по крайней мере, будут в пределах диапазона, который вы ожидаете

1 голос
/ 06 января 2009

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

Симптомом этого является то, что ваше приложение работает отлично, проходит все тесты и т. Д. С поддельными данными или новым набором данных, но ужасно ломается, когда вы запускаете приложение на реальных данных.

...