phpunit - поддельный ответ API или реальный ответ на подключение к службе?

Я создал несколько методов в классе обслуживания для подключения к внешнему сервису/поставщику через Guzzle с использованием запроса API POST.

Мне нравится использовать phpunit для тестирования — должен ли я использовать поддельный ответ HTTP Json без подключения к службе или он должен подключаться к службе, чтобы получить реальный ответ от службы?


person I'll-Be-Back    schedule 03.09.2017    source источник
comment
Мок службы позволяет вам возвращать различные ответы, особенно те, которые трудно проверить (например, ошибки).   -  person Nigel Ren    schedule 03.09.2017
comment
@NigelRen Вы должны ответить более подробно и как издеваться над сервисом   -  person I'll-Be-Back    schedule 03.09.2017
comment
Если у вас был какой-то код, это может помочь, не знаю, что ответить. Попробуйте просмотреть guzzle3.readthedocs.io/testing/unit-testing.html. .   -  person Nigel Ren    schedule 03.09.2017
comment
Любите быстрые тесты? Вам нравятся медленные, ненадежные тесты?   -  person localheinz    schedule 03.09.2017
comment
надежные тесты @localheinz   -  person I'll-Be-Back    schedule 04.09.2017
comment
Это служба, которой вы владеете, или это внешняя служба? Это важно.   -  person localheinz    schedule 04.09.2017
comment
@localheinz Мне не принадлежит. внешняя служба   -  person I'll-Be-Back    schedule 04.09.2017
comment
@localheinz хорошо?   -  person I'll-Be-Back    schedule 10.09.2017


Ответы (2)


Общий принцип тестирования: «Не высмеивайте то, чем не владеете». Имитация этих вызовов API делает ваши тесты менее надежными и дает вам ложное чувство безопасности, поскольку вы, скорее всего, получите ложные срабатывания.

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

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

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

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

person dbrumann    schedule 03.09.2017
comment
Вы сделали очень хорошее замечание о тестировании реального API. Во время производства. Есть ли способ автоматически запускать тест каждые x часов, чтобы убедиться, что настоящая служба API все еще работает? - person I'll-Be-Back; 03.09.2017
comment
Да, я знаю места, где они запускают тесты для производственной системы с интервалами в дополнение к тестированию на основе ветвей. Вам просто нужно быть осторожным, чтобы как-то пометить данные, чтобы иметь возможность отличить их от реальных данных, особенно при ведении электронной коммерции. Например, вы можете настроить запланированные задания с помощью Jenkins, а затем использовать специальный заголовок X-TEST в запросе, который распознается вашим приложением. - person dbrumann; 04.09.2017
comment
Вы также можете сделать это с заданиями cron, запускающими набор тестов, если ваш CI/CD-сервер не поддерживает запланированные задания. Опять же, если вы делаете это, будьте осторожны, например. с операциями, которые изменяют состояние базы данных (или, что еще хуже, очищают базу данных). Я рекомендую иметь для этого отдельный набор тестов, чтобы снизить риск вредных побочных эффектов. - person dbrumann; 04.09.2017
comment
Разве это не случай правильного использования инструментов? Любой инструмент, на который полагаются для решения всех ваших проблем, вероятно, не подходит. Это также тот случай, когда необходимо обновлять тесты, когда что-то меняется — что-то, что происходит внутри и снаружи. Это также может помочь в поиске места поломки — библиотеки не безошибочны. Вот почему возможность протестировать каждый слой, чтобы проверить, работает ли он «как ожидалось», имеет неоценимое значение, даже если «ожидаемое» на самом деле неверно. - person Nigel Ren; 04.09.2017
comment
Абсолютно @NigelRen. Совершенно правильно просто убедиться, что только ваша часть кода работает, как указано. Ничто не мешает вам написать как быстрые (модульные) тесты для макета, так и медленные приемочные тесты для реального API. Затем вы можете решить, когда запускать каждый тест. Все эти подходы имеют компромиссы, и вы должны решить, что для вас важно. Для меня это обычно зависит от того, разрабатывается ли API самостоятельно, насколько это критично для моего приложения, например. не сломается ли проверка, если она работает неправильно, и насколько я доверяю API, чтобы он был стабильным/не ломал BC. - person dbrumann; 04.09.2017
comment
Например, невозможность достоверно воспроизвести некоторые пограничные случаи, как вы предлагаете в своем комментарии, является совершенно допустимой вещью для тестирования через имитированный API. Конечно, это может измениться, и тест может дать вам ложноположительный результат, но если предположить, что это не какое-то поведение по умолчанию, это может быть не так важно, как убедиться, что этот неверный/пограничный ответ на случай обрабатывается правильно. - person dbrumann; 04.09.2017
comment
С пограничными случаями трудно иметь дело, и обычно их трудно предсказать. Попытка заставить живую среду вести себя плохо обычно заставляет менеджеров и клиентов немного волноваться, а бумажная работа вылетает из моих ушей. Итак, что-то, что я когда-либо мог только смоделировать. В целом согласен с тем, что вы говорите, но, как обычно, речь идет о правильном балансе. - person Nigel Ren; 04.09.2017
comment
Это неправда. Если вы решите протестировать фактический API, вы будете делать это с версией dev/test этого API, а не с рабочей версией, поэтому у вас не будет никакого спокойствия в отношении критических изменений. Ваши тесты должны проверять строгость вашего собственного кода. Поставщик API должен убедиться, что его код работает правильно. - person omarjebari; 26.06.2019

Вы должны издеваться над внешними вызовами API. Ваши тесты предназначены для проверки ВАШЕГО кода, а не внешнего API.

Примечание. В конечном счете, если вы ДЕЙСТВИТЕЛЬНО используете внешний API в своих тестах, вы, вероятно, будете подключаться к тестовой версии API (отличной от реальной версии API, к которой будет подключаться ваша производственная среда), поэтому вы на самом деле не гарантируете согласованность ответа API в любом случае.

person omarjebari    schedule 26.06.2019