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

Что такое васаби?

Wasabi — это приложение NodeJS, предназначенное для сквозного тестирования API. Он использует Mocha для запуска тестов и Chai в качестве основы для утверждений. Мы также разработали собственный клиентский модуль HTTP, а также специальный модуль Консул, который мы используем для блокировки приборов, используемых в наших тестах.

Почему мы создали васаби?

У Hootsuite было несколько предыдущих методов для тестирования наших API, и ни один из них не дал того, что мы хотели. Одной из наших первых попыток была комбинация тестов PyUnit, прикрепленных к старому пользовательскому HTTP-клиенту, который никогда не работал очень хорошо. У него были большие проблемы с одновременным запуском тестов и очисткой нашей тестовой установки после неудачного теста, и довольно быстро мы решили, что нам нужно что-то получше.

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

У нас также есть ряд интеграционных тестов Scala, многие из которых все еще используются. Это была наша лучшая попытка написать хорошие тесты до Wasabi, но синтаксический анализ JSON намного сложнее в Scala, чем в Javascript. В конце концов, мы решили, что нам нужно что-то получше, поэтому создали васаби.

Васаби был разработан, чтобы решить все проблемы, которые существовали в наших предыдущих тестах. Он решает проблемы с параллелизмом и очисткой, которые преследовали наше решение Python, а разработка его собственными силами означает, что нам не нужно полагаться на внешний продукт, который трудно интегрировать с нашим кодом. Разбирать ответы JSON с помощью Wasabi гораздо проще, чем с помощью Scala, что упрощает написание и понимание наших тестов. Wasabi может выполнять сквозное тестирование для всех наших внешних API более надежно, чем предыдущие решения, и у него есть забавные смайлики для использования в Slack.

Как писать сквозные тесты API?

Независимо от того, используете ли вы Wasabi или какую-либо другую среду тестирования API, шаги, необходимые для написания тестов API, довольно последовательны. В тестировании API есть два основных элемента: создание фикстур и написание самих тестов.

Фиксаторы:

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

Написание тестов:

После того, как у вас есть свои фикстуры, вы можете перейти к написанию самих тестов. Удачный тест API Hootsuite обычно можно разбить на следующие компоненты:

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

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

Пример теста с васаби

Суть теста — последний шаг, проверяющий ответ. Этот шаг должен быть слишком подробным, чтобы вы точно знали, что не так, когда ваш тест не пройден. Хорошей практикой является начать с проверки того, что ответ выглядит так, как вы ожидаете, на высоком уровне, а затем двигаться вниз. Типичная иерархия проверки будет выглядеть так:

  • Код ответа HTTP правильный
  • ответ имеет тело
  • тело содержит массив данных
  • массив данных не пустой
  • массив данных имеет поля, которые вы ожидаете
  • каждое поле имеет ожидаемый контент

Какие текущие проблемы с васаби?

Wasabi проводит сквозные тесты во внутренней сети Hootsuite. Это означает, что стабильность этой сети в значительной степени зависит от ее правильной работы. Медленные соединения могут вызывать тайм-ауты (особенно это проблема нашего ужасного Wi-Fi). Обновления на первый взгляд несвязанных проектов могут привести к неожиданному сбою тестов, что является особенно серьезной проблемой в нашей постоянно меняющейся среде разработки. Часто трудно сказать, вызван ли новый сбой теста изменениями в коде или не связанными с этим изменениями в нашей инфраструктуре. Это не обязательно проблемы с самим васаби, но они накладывают ограничения на то, как мы можем его использовать. Мы вообще не запускаем тесты Wasabi в нашей среде разработки, вместо этого используем их в качестве окончательной проверки в производстве перед тем, как отправить обновление всем пользователям. Это помогло сократить время, которое мы тратим на борьбу с неудачными тестами, и в то же время обеспечить тщательное тестирование нашего продукта перед выпуском.

Об авторе

Джейкоб Брюнетт — разработчик программного обеспечения в команде разработчиков Hootsuite. Джейкоб изучает информатику в Университете Британской Колумбии. Свяжитесь с ним в LinkedIn.