При написании модульных тестов обычно используются фиксаторы: мало тестируемых данных, поэтому мы можем сказать: 1. Получить все клиенты должны включать Вилли Вонка. 2. Удалите клиента 3, и теперь клиенты не должны включать Вилли Вонка больше.
Это хорошо для юнит-тестов. Используйте setup / teardown, чтобы повторно загрузить приборы или откатить транзакцию. Таким образом, тестирование создает, обновляет и удаляет внутри транзакции . Новые временные данные сохраняются только на протяжении этого теста, а затем сбрасываются.
Но как насчет того, когда мы отделили REST-сервер от REST-клиента?
Мы хотим убедиться, что наш REST-клиент не только правильно читает, но и правильно создает, обновляет и удаляет.
Я не смог найти ни одного примера или предложения о том, как сделать это с удаленным тестовым сервером REST.
Предполагая, что у меня есть тестовый сервер REST, обслуживающий только приборы. Вся природа HTTP без сохранения состояния означает, что было бы трудно отправлять сообщения типа «BEGIN TRANSACTION» и «ROLLBACK TRANSACTION» или «RELOAD FIXTURES», верно?
Я не могу быть первым, кто хочет сделать это, поэтому у меня такое чувство, что мне нужен другой способ думать об этом.
Какие-либо предложения?
источник
Ответы:
Программные системы в идеале имеют четко определенные системные границы и интерфейсы между ними. Службы REST являются хорошими примерами этого.
С этой целью, я рекомендовал бы против делать то , что вы пытаетесь сделать.
В частности:
Вместо этого я бы предложил:
Построение тестов для вашего клиента REST, чтобы убедиться, что он ведет себя правильно, с учетом конкретного ввода и вывода. Учитывайте хорошие (ожидаемые) и плохие (неожиданные) значения.
Построение тестов для вашей службы REST (если вы управляете ею), чтобы вести себя в соответствии с ее назначением
Держите тесты близко к их проблемной области, чтобы они могли помочь в разработке и разработке того, что важно в этом контексте
источник
Здесь нужно учитывать два угла:
источник
Я думаю, что подделка ответов сервера REST - лучший способ проверить клиента.
Для Ruby есть гем FakeWeb, который вы можете использовать для создания ложных ответов - https://github.com/chrisk/fakeweb .
Также в JavaScript вы можете использовать что-то вроде Sinon.JS, что дает вам поддельный сервер - http://sinonjs.org/docs/#fakeServer .
источник
Как уже говорили другие, если вы тестируете клиента, вам не нужно заходить так далеко, как создавать, удалять и т. Д. На сервере. Большую часть времени вам даже не нужно издеваться над сервером вообще. Вам действительно нужно только убедиться, что вы делаете правильные запросы и правильно обрабатываете ответы, написаны ли они на Ruby, Python, PHP или чем-то еще, в какой-то момент ваш клиент, вероятно, собирается использовать метод из библиотеки HTTP, чтобы сделать запрос, и этого достаточно, чтобы смоделировать этот метод, проверить, как он вызывается, и вернуть результат теста.
Возьмите гипотетический клиент Python, который использует
urllib2
для выполнения запросов. Возможно, у вас есть какой-то метод в клиенте, давайте его назовемget()
, который имеет вызовurllib2.Request()
. Вам действительно нужно высмеивать вызов вашего классаget()
.В этом очень упрощенном примере библиотека Python Mock используется для проверки гипотетического
your.Client
класса с помощьюget_object()
метода, который генерирует правильный URL-адрес для получения чего-либо из некоторого API. Чтобы сделать запрос, клиент вызывает свойget()
метод с этим URL. Здесь этот метод является поддельным (your.Client.get
«исправлен», так что он находится под контролемyour_mock
), и тест проверяет, была ли запрошена правильная конечная точка.Метод mocked возвращает сконфигурированный ответ JSON (
your_mock.return_value
), который должен обработать клиент, и вы сделаете дополнительные утверждения, чтобы проверить, что он обработал ожидаемые данные ожидаемым образом.источник
То, что вы описываете, является сценарием интеграционного тестирования. Они обычно немного неудобны для установки и разрушения. Это заставляет их медленно бегать и довольно часто ломко.
Подход с фикстурами такой же неуклюжий и неуклюжий, но он используется по умолчанию для некоторых фреймворков, например, Rails, и он уже поддерживается. Им нужен абстрактный контрольный пример или что-то подобное для подготовки базы данных с фиксаторами. (Остерегайтесь необычного именования категорий тестов в Rails, юнит-тесты с фиксаторами БД, строго говоря, также являются интеграционными тестами.)
То, как я могу описать ваш сценарий, это согласиться на то, чтобы иметь определенный контроль над состоянием приложения API или его базы данных. Вы можете иметь дополнительные конечные точки для настройки и демонтажа, которые присутствуют только в тестовой среде. Или, в качестве альтернативы, вы общаетесь с базой данных (или с тем, что вы используете) за задней частью вашего приложения / API.
Если вы чувствуете, что это слишком много (в смысле неоправданных) усилий, то учтите, что подход с фиксаторами для баз данных делает именно это: используя дополнительные, специфичные для теста средства для манипулирования базой данных или состоянием приложения.
Я не думаю, что это обсуждение имеет отношение к природе HTTP без состояния. HTTP не имеет состояния, но в большинстве случаев это не так. Это немного похоже на вас, где вы ищете REST строгости. Точно так же вы можете иметь все ресурсы, которые можно создавать, читать и удалять. В этом случае вы можете просто выполнить все настройки и демонтаж с помощью обычных средств API. Однако на практике это часто не делается, потому что вы не хотите включать определенные операции из бизнес-понимания вашего приложения, по крайней мере, за пределами тестовой среды.
источник
Monkey Patch
В своей работе мы делаем ATDD, используя существующую платформу xUnit и обезьяны, исправляющие сетевые вызовы между клиентом и сервером. В том же пространстве процесса мы загружаем клиента, обезьяна подключает сетевой вызов к вершине кода стека сервера REST. Все звонки затем отправляются клиентом, как обычно, и серверный код получает запросы именно так, как они обычно выглядят.
Льготы
компромиссы
источник