Как вы делаете unit test, когда результаты меняются?

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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