Написание единичных тестов для API REST-ful

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

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

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

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

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

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

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

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

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

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

В принципе, вы реализуете «FakeDatabase», которая использует API фактической базы данных, которая возвращает известные значения.