Статьи

Схема: свойство-тестирование для схем API

Многие компании перешли от монолитов к микросервисам для лучшей масштабируемости и ускорения циклов разработки, как и на Kiwi.com . У нас все еще есть монолитные приложения, однако они со временем тают, и множество блестящих микросервисов постепенно вытесняет их.

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

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

Вам также может понравиться: Начало работы со спецификацией OpenAPI

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

Есть много разных подходов, которые пытаются синхронизировать схемы, приложения и документацию. Наиболее распространенные подходы:

  • Хранить отдельно, синхронизировать вручную;
  • Создать схему из приложения (например, apispec);
  • Предоставить логику приложения из объявленной схемы ( connexion).

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

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

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

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

Для этого мы решили исследовать применимость тестирования на основе свойств (PBT) к схемам Open API. Сама концепция не нова. Впервые он был реализован в библиотеке Haskell под названием QuickCheck Коеном Клессеном и Джоном Хьюзом. В настоящее время инструменты PBT реализованы на большинстве языков программирования, включая Python, наш основной внутренний язык. В приведенных ниже примерах я собираюсь использовать гипотезу Дэвида Р. Макивера.

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


питон