Это то, что беспокоило меня некоторое время. На самом деле стоит модульное тестирование клиента API?
Допустим, вы создаете небольшой класс, чтобы абстрагировать вызовы API-интерфейса REST. PetShop - очень простой API, и у него есть базовый набор методов:
listProducts()
getProductDetails(ProductID)
addProduct(...)
removeProduct(ProductID)
При тестировании мы должны были создать поддельный сервис или смоделировать ответы. Но это кажется излишним; Я понимаю, что мы хотим убедиться, что наши методы не перестают работать из-за опечаток / синтаксических ошибок, но поскольку мы пишем функции, вызывающие удаленные методы, а затем создаем ложные ответы из этих удаленных методов, это выглядит так: пустая трата усилий и что мы тестируем что-то, что не может действительно потерпеть неудачу. Хуже того, если удаленный метод изменится, наши модульные тесты пройдут, пока использование не будет завершено.
Я почти уверен, что что-то упустил, или у меня не тот конец палки, или я не вижу дрова для деревьев. Может кто-нибудь поставить меня на правильный путь?
источник
Ответы:
Задача удаленного API-клиента - выполнять определенные вызовы - не больше и не меньше. Поэтому его тест должен проверить, что он выполняет эти вызовы - ни больше, ни меньше.
Конечно, если провайдер API изменит семантику своих ответов, ваша система не будет работать. Но это не вина вашего клиентского класса; это то, что можно поймать только в интеграционных тестах. Полагаясь на код, который не находится под вашим контролем, вы отказались от возможности проверять правильность с помощью внутреннего тестирования - это был компромисс, и это цена.
Тем не менее, тестирование класса, который состоит только из делегаций другому классу, может быть низким приоритетом, потому что существует сравнительно небольшой риск возникновения сложных ошибок. Но это относится к любому классу, который состоит только из однорядных одинарных строк, он не имеет ничего общего с вызовом кода другого поставщика.
источник
foo()
раньшеbar()
, но это не значит, что вызовfoo()
раньшеbar()
- правильная вещь; подобный модульный тест прошел бы, даже если код неправильный. И если это все, что делает клиент, то настройка макетов, которые проверяют, вызывается лиfoo()
раньше,bar()
является относительно проблематичной для чего-то, что можно проверить беглым взглядом на код клиента.add()
метод добавляет два числа правильно, но это не означает, что добавление - это то, что нужно сделать в данный момент в алгоритме -add()
модульное тестирование пройдет успешно, даже если ваша программа неверна. Если это не то, то вашlevenshteinDistance()
метод виноват, а неadd()
метод. Это точно так же. Смысл разделения кода на методы всегда заключается в том, что каждый метод должен заботиться только об одном .Краткий ответ:
Все методы должны быть проверены юнитом.
Длинный ответ:
Да. Оно того стоит.
Вот некоторые вещи, которые должны тестировать юнит-тесты этих методов вызова API:
Те вещи, которые вызывает вызываемый метод, могут изолировать меня от насмешек над службой API, и, хорошо проверив их, гарантируют, что ошибки не возникли из-за ошибки в клиентском коде, который вызывает API.
источник
Это не будут модульные тесты, потому что вы тестируете вход и выход вашей системы, скорее ограниченные тесты интеграции.
Будьте очень осторожны, когда говорите: «Это кажется пустой тратой усилий, и мы тестируем что-то, что не может действительно потерпеть неудачу» - оно может потерпеть неудачу, оно потерпит неудачу, возможно, оно потерпит неудачу способами, которые вы не можете предвидеть, неудачи будут хуже, если у вас нет тестов на месте.
Ошибка, которую вы делаете здесь, состоит в том, что вы сделали изобретение колес: звонки в удаленные сервисы и API-интерфейсы - очень распространенный сценарий, поэтому есть несколько довольно хороших инструментов, которые помогут вам проверить это. В прошлый раз, когда я работал над приложением, которое подключалось к удаленным сервисам, я использовал SoapUIкоторый может смотреть на службу и делать ложные вызовы этой службы или вести себя как локальная копия сервера, с которым вы можете делать тестовые вызовы и отслеживать запросы и ответы. Установка заняла несколько минут, а также очень быстро обновилась, если изменился удаленный интерфейс. Я не использовал его в сценарии REST, но даже если он не работает для этого (или, возможно, кто-то читает этот ответ в будущем, когда существуют лучшие инструменты), вы сможете найти инструмент, который может макетировать сервис для вас, и когда придет время для развертывания вашего кода, вы будете рады, что вы сделали.
источник