Рубрики
Uncategorized

Сравнение призма, hoverfly и hmt- Часть 2

Подробное сравнение призмы, Hoverfly и HMT с API нашивки. Помечено с API, WEB, DEVOPS, тестированием.

Это вторая статья серии из двух частей, сравнивающая призму, Hoverfly и HMT. В этой статье ориентирована на использование всех трех инструментов для создания макета API GitHub V3, тогда как то первая статья фокусируется на высоком сравнении уровня инструментов.

Команда HMT занятая здание HMT.

В предыдущей статье мы увидели, как создать сервер призма из спецификации Openapi. Мы также видели, как Hoverfly может воспроизводить записи сервера трафика. Наконец, мы видели, как HMT смешивает спецификации и записи Openapi в Mock Server.

В этой статье мы рассмотрим, как все три инструмента могут издеваться над нашими API.

Призма

Чтобы издеваться над полосой API с призмом, мы сначала скачаем STRIPE V3 Openapi Spec.

$ wget https://github.com/stripe/openapi/blob/master/openapi/spec3.yaml?raw=true

Затем мы раскрутим сервер призма, который будет издеваться над нашими API в соответствии с спецификацией.

$ prism mock spec3.yaml

Давайте проверим API, используя некоторые общие полосовые конечные точки. Например, мы можем проверить конечную точку баланса, позвонив /v1/баланс Отказ

$ curl http://localhost:4010/v1/customers

Призма предоставляет полезную информацию в консоли, поскольку она подтверждает URI.

$ [7:50:52 PM] » [HTTP SERVER] get /v1/customers i  info      Request
received
[7:50:52 PM] »     [NEGOTIATOR] i  info      Request contains an accept header: */*
[7:50:52 PM] »     [VALIDATOR] ‼  warning   Request did not pass the validation rules
[7:50:52 PM] »     [NEGOTIATOR] √  success   Created a 401 from a default response
[7:50:52 PM] »     [NEGOTIATOR] √  success   Found response 401. I'll try with it.
[7:50:52 PM] »     [NEGOTIATOR] √  success   The response 401 has a
schema. I'll keep going with this one

К сожалению, именно здесь я столкнулся с трудностями, поскольку призма служит ответ.

{
  "type": "https://stoplight.io/prism/errors#UNKNOWN",
  "title": "Your schema contains $ref. You must provide specification in the third parameter.",
  "status": 500,
  "detail": ""
}

В то время как призма хороша в издевании большинства спецификаций API, он боролся, когда он столкнулся с полосой спецификации. Я уверен, что команда исправит это в предстоящей версии призмы. Тем временем давайте посмотрим, как призма обрабатывает повсеместное PetStore.yml спецификация

$ prism mock petstore.yml

Теперь, когда мы запрашиваем /домашние питомцы Мы получаем следующий результат.

[
  {
    "id": -9223372036854776000,
    "properties": {
      "isCat": true
    },
    "name": "string",
    "tag": "string"
  }
]

Вывод: Призма создаст издевательства из коробки для многих API. Хотя он боролся с полосой, он работает для большинства спецификаций Openapi. У него также есть полезные журналы.

Hoverfly

Чтобы создать макет Hoverfly, мы сначала должны записывать звонки на API, которые мы хотели бы издеваться. Я буду использовать мою тестовую учетную запись, где я создал три издевательства клиентов. Например, вот информация для клиента имени Джейн Доу.

Если мы назовем полосу /V1/Клиенты Конечная точка, мы получаем информацию по всем трем клиентам.

$ curl -u **redacted** https://api.stripe.com/v1/customers

И вот сокращенные JSON.

{
  "object": "list",
  "data": [
    {
      "id": "cus_GhmXKD3awekHyV",
      "object": "customer",
      "account_balance": -755,
      "address": {
        "city": "Elk Grove",
        "country": "US",
        "line1": "12 McKenna Dr",
        "line2": "",
        "postal_code": "95757",
        "state": "CA"
      }
      ...
    }
    ...
  ],
  "has_more": false,
  "url": "/v1/customers"
}

Теперь давайте будем стрелять Hoverfly и записывать наши взаимодействия с некоторыми полосой конечных точек. Во-первых, нам нужно будет получить сертификат SSL Hoverfly SSL, чтобы мы могли вызвать конечную точку нашивки HTTPS.

$ wget https://raw.githubusercontent.com/SpectoLabs/hoverfly/master/core/cert.pem

Мы записываем несколько разных результатов, включая сбои.

$ hoverctl start
$ hoverctl mode capture
$ curl --proxy localhost:8500 https://api.stripe.com/v1/customers # leave out the key
$ curl --proxy localhost:8500 -u **redacted** https://api.stripe.com/v1/customers # include the key
$ curl --proxy localhost:8500 -u **redacted** https://api.stripe.com/v1/customers/cus_GhmV4PbooARHhM --cacert cert.pem # getting one customer # get one customer
$ curl --proxy localhost:8500 -u **redacted** -X POST -d email="susan@example.com" -d name="Susan McLane" -d description="Our secret favorite customer" https://api.stripe.com/v1/customers/cus_GhmV4PbooARHhM --cacert cert.pem # add one customer
$ curl --proxy localhost:8500 -u **redacted** -X DELETE https://api.stripe.com/v1/customers --cacert cert.pem # try to delete all customers, will fail!
$ curl --proxy localhost:8500 -u **redacted** -X DELETE https://api.stripe.com/v1/customers/cus_GhmV4PbooARHhM --cacert cert.pem # try to delete one customer, will succeed
$ curl --proxy localhost:8500 -u  -X DELETE https://api.stripe.com/v1/customers/cus_GhmV4PbooARHhM --cacert cert.pem # leave out the key, will fail
$ curl --proxy localhost:8500 -u **redacted** -X DELETE https://api.stripe.com/v1/customers/cus_GhmV4PbooARHhM # delete a customer that doesn't exist, will fail
$ hoverctl export stripe-simulation.json
$ hoverctl stop

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

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

$ hoverctl start webserver
$ hoverctl import stripe-simulation.json

Теперь давайте тестируем извлечение одного клиента.

$ curl http://localhost:8500/v1/customers/foobar -u **redacted**

Hoverfly производит полезное сообщение об ошибке, указывающее, что пошло не так. Это также дает предложения, как исправить сопоставление для создания результата. Вот усеченное сообщение об ошибке:

Hoverfly Error!

There was an error when matching

Got error: Could not find a match for request, create or record a valid matcher first!

The following request was made, but was not matched by Hoverfly:

{
    "Path": "/v1/customers/foobar",
    "Method": "GET",
    ...
}

Whilst Hoverfly has the following state:

{}

But it did not match on the following fields:

[path]

Which if hit would have given the following response:

{
    "status": 200,
    "body": "...",
}

Давайте будем следовать его предложению и добавить подстановочный знак к Slipe-Simulation.json Отказ Раньше файл содержал это.

[
  {
    "matcher": "exact",
    "value": "/v1/customers/cus_GhmV4PbooARHhM"
  }
]

И теперь мы изменим это к этому.

[
  {
    "matcher": "glob",
    "value": "/v1/customers/*"
  }
]

Запустив наш запрос скручиваемости снова, мы получаем записанный ответ. W00T! Вот укороченная версия ответа.

{
  "id": "cus_GhmV4PbooARHhM",
  "object": "customer",
  "account_balance": 0,
  "address": {
    "city": "Melbourne",
    "country": "AU",
    "line1": "1 Batman Way",
    "line2": "",
    "postal_code": "3000",
    "state": "NSW"
  },
  ...
  "tax_info": null,
  "tax_info_verification": null
}

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

HMT

Первый шаг в создании издевательства с помощью Toolkit HTTP Mocking Toolkit (HMT) совпадает с издевателем Prism — мы загружаем SPECT OPRAPI.

$ wget https://github.com/stripe/openapi/blob/master/openapi/spec3.yaml?raw=true

Мы создадим папку под названием полоса-макет , где мы будем перемещать спецификацию.

$ mkdir stripe-spec && mv spec3.yaml ./stripe-spec

Уже здесь мы можем начать HMT в режиме сервера Исследовать некоторые результаты.

$ hmt mock -a ./stripe-spec
$ curl -i -X GET http://localhost:8000/v1/clients

В систе мы видим, что в результате результат — это массив пользователей Mock, созданные с использованием Spec Spec Specipe Spec.

{
  "data": [
    {
      "created": 74675021,
      "id": "dolor enim minim culpa ipsum",
      "livemode": true,
      "object": "customer",
      ...
    }
    ...
  ],
  "has_more": true,
  "object": "list",
  "url": "/v1/customers"
}

Теперь давайте обогатим спецификацию с тем же набором записей, которые мы сделали при строительстве нашего Hoverfly Mock. Смешивание Spec Openapi с записанным трафиком сервера имеет два основных преимущества:

  • Это позволяет HMT подобрать функции спецификации, не присутствующих в записях и наоборот.
  • Вы можете чередовать сервировочные записи Rote Rockings и синтетическими данными.

Например, давайте записываем звонок на /V1/Клиенты Как мы сделали в предыдущем примере.

$ hmt record --log_dir ./stripe-logs
$ curl -u **redacted** http://localhost:8500/https/api.stripe.com/v1/customers
$ curl http://localhost:8000/https/api.stripe.com/v1/customers # leave out the key
$ curl -u **redacted** http://localhost:8000/https/api.stripe.com/v1/customers # include the key
$ curl -u **redacted** http://localhost:8000/https/api.stripe.com/v1/customers/cus_GhmV4PbooARHhM --cacert cert.pem # getting one customer # get one customer
$ curl -u **redacted** -X POST -d email="susan@example.com" -d name="Susan McLane" -d description="Our secret favorite customer" http://localhost:8000/https/api.stripe.com/v1/customers/cus_GhmV4PbooARHhM --cacert cert.pem # add one customer
$ curl -u **redacted** -X DELETE http://localhost:8000/https/api.stripe.com/v1/customers --cacert cert.pem # try to delete all customers, will fail!
$ curl -u **redacted** -X DELETE http://localhost:8000/https/api.stripe.com/v1/customers/cus_GhmV4PbooARHhM --cacert cert.pem # try to delete one customer, will succeed
$ curl -u  -X DELETE http://localhost:8000/https/api.stripe.com/v1/customers/cus_GhmV4PbooARHhM --cacert cert.pem # leave out the key, will fail
$ curl -u **redacted** -X DELETE http://localhost:8000/https/api.stripe.com/v1/customers/cus_GhmV4PbooARHhM # delete a customer that doesn't exist, will fail

Теперь давайте построим спецификацию, используя этому издеванию. Мы будем использовать Ген режим. Это означает, что если наш макет работает на клиента, он не записал, он создаст клиента MOCK на лету.

$ hmt build -i ./stripe-logs/ --mode gen -o build
$ hmt mock -s build/
$ curl http://localhost:8500/v1/customers -u **redacted**
$ curl http://localhost:8500/v1/customers/cus_x410fdsfxfs -u **redacted**

Вывод

В этой статье мы увидели, как три издевающихся инструментов — призма, Hoverfly и HMT — могут создать макет нашивки API. Я надеюсь, что в прохождении этого вы получили чувство различий между тремя инструментами. Короче:

  • Призма может создать макет спецификации Openapi
  • Hoverfly может служить записи
  • HMT может служить смесью записей и синтетических данных

Нам любопытно услышать ваше мнение о всех трех инструментах. Пожалуйста, оставьте комментарий ниже, позволяя нам знать, что вы думаете!

Оригинал: «https://dev.to/meeshkan/comparing-prism-hoverfly-and-meeshkan-part-2-139i»