Написание модульных тестов для REST-ful API - PullRequest
10 голосов
/ 12 сентября 2011

Я планирую написать модульные тесты для API-интерфейса REST, и мне интересно, какой подход я должен использовать.

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

Ответы [ 2 ]

9 голосов
/ 12 сентября 2011

Вопрос в том, что вы хотите проверить.Как вы думаете, что сломается на самом верхнем api-слое (то есть слое, получающем HTTP-запрос)?

Обычно написание юнит-теста restful-api звучит немного похоже на оксюморон;) По определению юнит-тесты гораздо меньше, чем использование точки входа HTTP в базу данных.Более того, ваш вопрос основан на том, как написать большие тесты (или приемочные, сквозные тесты).

Остерегайтесь того, что реализация таких крупных тестов (сквозных тестов) требуетусилие:

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

В моем опыте главное - разнообразие гранулярности теста, поэтому я смешиваю / комбинирую подходы:

  • юнит-тестирование для API-интерфейсов (например, несколько более сложных требований к отображению), аутентификация, сложные правила проверки, сложная логика if / else, ...)
  • выполнение дымовых тестов на более грубом уровне, HTTP-клиент взаимодействует с API, то есть тестирует интеграцию.Эти тесты покажут мне: сервер может запускаться, основные сценарии использования API работают.В качестве инструмента я рекомендую soap-ui .
  • относительно состояния базы данных: я часто начинаю с большинства базовых данных (например, существующих api-пользователей или предварительно определенных неизменяемых тестовых данных).Данные теста для каждого теста должны быть изолированы.Если мой тест включает более сложный поток (например, весь сценарий использования распределен по нескольким HTTP-вызовам), тестовые данные могут зависеть от шагов теста (т. Е. Call-2 может зависеть от состояния сервера, которое было изменено вызовом1)

Может быть, вы можете дать больше информации о конкретном сценарии использования, который вы хотите протестировать, так что можете дать больше помощи?

5 голосов
/ 12 сентября 2011

Обычно в модульных тестах вы пытаетесь удалить все зависимости за пределами модуля (обычно это функция / класс / объект), который вы тестируете.Классический способ сделать это в вашем случае (для баз данных) - использовать макеты.http://en.wikipedia.org/wiki/Mock_object

По сути, вы реализуете "FakeDatabase", которая разделяет API фактической базы данных, которая возвращает известные значения.

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