Приложение для Tarantool — это, по сути, набор хранимых процедур, используемых как API. Данные обрабатываются на стороне хранилища, что позволяет значительно повысить производительность. Однако поддержка хранимых процедур может превратиться в кошмар. Может. Но не сегодня. Сегодня мы рассмотрим вопросы обеспечения качества приложения. В частности, поговорим о тестировании, разберемся, как запуститься в production, как использовать коннекторы, а также поговорим о тонкостях миграции схемы данных.  — Часть 1. Хранимые процедуры
— Часть 2. OAuth2-авторизация
— Часть 3. Тестирование и запуск Напомню, что все примеры в этом данном цикле статей основаны на приложении для авторизации пользователей tarantool-authman. Тестирование — только один из способов повысить качество.  В случае с хранимыми процедурами, функциональные тесты — это хороший вариант поддержки актуального API. Для тестирования используется встроенный в Tarantool модуль tap (Test Anything Protocol). Он включает в себя несколько методов для базовых проверок и сравнения Lua-объектов. Давайте протестируем два кейса регистрации пользователя auth.registration(email). Теперь напишем небольшой скрипт для запуска тестов. Не забудем также учесть методы before и after, которые упростят тестирование. Результат запуска тестов: Приложение написано и протестировано, а значит, пришло время разворачивать его в production-среде. Для управления инстансами Tarantool используется встроенная утилита tarantoolctl. Сначала создадим инстанс с приложением. Не забудем добавить пользователя и выдать ему права. Теперь создадим символьную ссылку на этот файл из директории instances.enabled: Запустим tarantoolctl и проверим, что можем подключиться к Tarantool и использовать методы приложения: Если что-то пошло не так, следует посмотреть логи /var/log/tarantool/auth.lua. Подробнее об администрировании сервера Tarantool можно почитать в документации. Одно из преимуществ хранимых процедур — предоставление общего интерфейса для сервисов, написанных на разных языках программирования.  Рассмотрим пример асинхронного использования Tarantool с помощью Python-коннектора. Стоит отметить, что взаимодействовать с Tarantool можно также из другого инстанса Tarantool с помощью встроенного модуля net.box. Подробнее о нём читайте в документации. Распространенная задача, когда приложение уже запущено в бою — изменение схемы данных. Например, пользователю требуется добавить поле gender.  Для этого нужно создать скрипт, изменяющий все данные в space auth_user. Сам скрипт можно добавить в вызов инициализации приложения, а функция box.once ограничит повторный вызов. Несмотря на то, что миграция может выполняться долго, главный поток исполнения не блокируется. Это связано с тем, что метод replace неявно вызывает yield. Для того чтобы явно освободить поток исполнения, нужно вызвать метод fiber.sleep(0). Подробнее об этом можно прочитать в документации. Tarantool не стоит на месте и активно развивается. За рамками этого обучающего цикла статей осталось несколько важных вопросов, на которые стоит обратить внимание при написании собственных сервисов: Напоминаю, что все примеры кода взяты из приложения tarantool-authman. Оно тоже развивается, и теперь может быть использовано как Oauth2-server. Если у вас остались вопросы, выходящие за рамки цикла статей, то задать их можно в телеграм-чате. Отзывчивое сообщество Tarantool, скорее всего, сможет вам помочь. Спасибо всем, кто дождался третьей части. До новых встреч! Python developer