заглушка данных в API REST для больших системных/интеграционных тестов

Эта проблема

Скажем, у меня есть классный REST-ресурс /account.

Я могу создавать новые учетные записи

POST /account
{accountName:"matt"}

который может привести к некоторому ответу json, например:

{account:"/account/matt", accountName:"matt", created:"November 5, 2013"}

и я могу найти учетные записи, созданные в диапазоне дат, позвонив:

GET /account?created-range-start="June 01, 2013"&created-range-end="December 25, 2013"

который также может производить что-то вроде:

{accounts: {account:"/account/matt", accountName:"matt", created:"November 5, 2013"}, {...}, ...}

Теперь предположим, что я хочу настроить некоторые образцы данных и написать несколько тестов для ресурса GET /account в пределах определенного диапазона дат создания.

Например хочу как то вставить в систему следующие аккаунты

name=account1, created=January 1, 2010
name=account2, created=January 2, 2010
name=account3, created=December 29, 2010
name=account4, created=December 30, 2010

тогда позвони

GET /account?created-range-start="January 2, 2010"&created=range-end="December 29,2010"

и убедитесь, что возвращаются только учетные записи 2 и 3.

Как мне вставить эти примеры учетных записей, чтобы написать тесты?

Возможные решения

1) Я мог бы использовать инверсию управления и позволить пользователю указывать дату создания новых учетных записей.

POST /account
{account:"matt", created="June 01, 2013"}

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

2) Я мог бы добавить один или несколько ресурсов конфигурации тестирования

PUT /account/creationDateTimestampProvider
{provider="DefaultProvider"}

or

PUT /account/creationDateTimestampProvider
{provider="FixedDateProvider", date="June 01, 2013"}

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

3) Я мог бы напрямую взаимодействовать с базой данных, минуя API REST, чтобы установить свои образцы данных.

INSERT INTO ACCOUNTS ...

GET /account?...

Однако это может позволить мне попасть в состояния, в которые использование REST API может не позволить мне попасть, и по мере развития модели базы данных поддержка этих сценариев sql также может быть проблемой.

Итак... как мне проверить свой ресурс GET/account? Есть ли другой способ, о котором я не думаю, более элегантный?


person Matthew Madson    schedule 09.10.2013    source источник


Ответы (2)


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

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

Этот сообщение служит хорошим примером по крайней мере, для настойчивости.

Между прочим, не меняйте API вашего сервиса только для облегчения теста. Может быть, я неправильно понял, и вы в любом случае не так, но я подумал, что упомяну на всякий случай.

Надеюсь, это поможет.

person Vidya    schedule 10.10.2013
comment
если я вас правильно понял, вы поддерживаете третий подход с базой данных в памяти (по крайней мере, во время тестов) и, возможно, с рабочей базой данных для создания образцов данных. - person Matthew Madson; 10.10.2013
comment
В тестировании да. Я бы тесно связал операции с базой данных с самим тестом, выполнив их в setup/teardown. Для меня это хороший пример тесной связи, поэтому я могу увидеть, каковы предварительные условия для моего теста. Я не могу говорить о производстве, потому что там обычно много соображений. - person Vidya; 10.10.2013
comment
Кстати, мы пропустили фазу тестирования, когда тестировщики будут предоставлять данные. Эта база данных будет меняться гораздо реже, а скрипты будут выполняться гораздо реже. Проверьте это для работы с изменениями базы данных: amazon.com/< /а> - person Vidya; 10.10.2013
comment
Спасибо за отзыв, Видья! - person Matthew Madson; 10.10.2013
comment
Без проблем. Конечно, принятие ответа или, по крайней мере, голосование еще никому не повредило, ха-ха. - person Vidya; 12.10.2013

Что бы это ни стоило, в эти дни я в основном использую второй подход для большинства моих тестов на системном уровне (черный ящик).

Я создаю бэкдор для администрирования/тестирования API с требованиями безопасности, к которым могут получить доступ только мои системные тесты. Эти сверхмощные API позволяют мне засеивать данные. Я стараюсь максимально ограничить объем этих API-интерфейсов, чтобы они не были чрезмерно связаны с конкретными деталями реализации, но были достаточно гибкими, чтобы можно было указать все, что необходимо для желаемых начальных данных.

Причина, по которой я предпочитаю этот подход решению базы данных, предоставленному Vidya, заключается в том, что мои тесты не привязаны к конкретной технологии хранения данных. Если я решу переключиться с монго на динамо или что-то в этом роде; использование admin API освобождает меня от необходимости обновлять все мои тесты — вместо этого мне нужно только обновить admin api/impl.

person Matthew Madson    schedule 28.12.2018