Test framework for Picodata plugin
Описание
Picotest - это фреймворк для тестирования плагинов, созданных в окружении pike.
Для использования Picotest требуется выполнить следующие действия:
- Установить pike:
- Добавить зависимости в
Cargo.tomlплагина:
Совместимость с Picodata
| Picotest | Picodata |
|---|---|
| >= 1.4.0 | 25.2.1 |
| >= 1.4.0 | 25.1.2 |
| < 1.4.0 | 25.1.1 |
Интеграционное тестирование
Макрос #[picotest] используется для написания интеграционных тестов и может применяться как к функциям, так и к модулям.
Использование #[picotest]
При использовании макроса на модуле picotest автоматически пометит все функции модуля, названия которых начинаются с test_, как rstest-функции.
use *;
Совместимость с rstest
Макрос #[picotest] является оберткой над rstest, поэтому поддерживает использование:
fixture.
once
case
use picotest;
Атрибуты макроса #[picotest]
| Attribute | Description | Default |
|---|---|---|
path |
Путь до директории, содержащей файл топологии плагина (topology.toml) | Определяется автоматически |
timeout |
Таймаут перед запуском первого теста (seconds) | 5 |
Применение конфигурации плагина к запущенному кластеру Picodata
Picotest позволяет менять конфигурацию сервисов плагина во время исполнения интеграционного теста.
Изменение конфигурации происходит с помощью метода Cluster::apply_config, который доступен при использовании макроса #[picotest].
Формат конфигурации должен соответствовать маппингу YAML, заданному в plugin_config.yaml.
Пример:
Допустим конфигурация плагина с одним сервисом "router" задана следующим образом:
router:
rpc_endpoint: "/hello"
max_rpc_message_size_bytes: 1024
max_rpc_message_queue_size: 2048
Тогда интеграционный тест, изменяющий данную конфигурацию, может выглядеть следующим образом:
Подробнее в описании метода Cluster::apply_config.
Управление кластером в Picotest
Жизненный цикл и изоляция кластера
Picotest обеспечивает полную изоляцию тестовых окружений за счет автоматического управления жизненным циклом кластера:
Архитектура тестирования
Ключевые особенности:
Изоляция на уровне файлов:
- Каждый
.rsфайл вtests/компилируется как самостоятельный исполняемый модуль - Для каждого файла создается отдельный экземпляр кластера
Создание кластера вручную
Picotest позволяет создавать и удалять кластер без использования макроса #[picotest].
use rstest;
Модульное тестирование
Макрос #[picotest_unit] используется для написания юнит-тестов для плагинов, созданных с помощью утилиты pike.
Запуск тестов
Тесты запускаются через интерфейс cargo test:
Ограничения
#[picotest_unit]не может использоваться в модуле под#[cfg(test)].
Пример неверного использования макроса:
Пример верного использования макроса:
По скольку каждый юнит-тест компилируется и линкуется в динамическую библиотеку плагина (см. Структура плагина), он не должен быть задан в конфигурации, отличной от debug. В противном случае при сборке тестов они будут проигнорированы компилятором.
#[picotest_unit]не может использоваться совместно с другими атрибутами.
Все атрибуты используемые совместно с макросом будут отброшены.
В примере ниже #[should_panic] будет отброшен в процессе компиляции.
Подключение по Postrges протоколу
Picotest при запуске создаст дополнительного пользователя и назначит права на создание таблиц
User: Picotest
Password: Pic0test
Пример использования pgproto
use *;
use ;
use ;
Тестирование RPC ручек плагина
Для тестирования RPC ручек плагинов, предлагается использовать функцию PicotestInstance::execute_rpc, вызванную на конкретном инстансе, на котором задан RPC endpoint.
Аргументы функции:
- plugin_name - имя плагина
- path - имя эндпоинта, например
/test - service_name - имя сервиса, например
main - plugin_version - версия плагина, например
0.1.0 - input - тело запроса, например структура
User { ... }
Тип тела запроса и возвращаемого значения определяется через шаблонные параметры.
Для тестов необходим асинхронный рантайм, поэтому необходимо указать макрос #[tokio::test] и добавить к самому тесту модификатор async.
Пример теста:
async
Покдлючение к admin консоле и выполнение sql/lua
Для выполнения кода из консоли администратора на первом инстансе воспользуйтесь:
Если существует необходимость выполнить скрипт на любом другом инстансе: