1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-KSQL

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
klip-32-sql-testing-tool.md 17 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 07:33 e6dfb69

KLIP 32 — инструмент тестирования SQL

Автор: agavra | Целевая версия: TBD | Статус: обсуждение | Обсуждение: TBD

Краткое содержание: представить YATT (Yet Another Testing Tool), который написан и управляется в основном с помощью синтаксиса на основе SQL, чтобы обеспечить покрытие тестовых случаев, требующих чередования операторов и вставок. В конечном итоге цель состоит в том, чтобы заменить внешний ksql-test-runner и, возможно, тесты (R)QTT.

Мотивация и предпосылки

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

В списке ниже перечислены мотивирующие принципы проектирования:

  1. Инструмент должен поддерживать императивные тесты, позволяя чередовать операторы/вставки/утверждения.
  2. Инструмент должен позволять писать тесты преимущественно на SQL, избегая специальных синтаксических директив, когда это возможно.
  3. Инструмент должен использовать как можно больше возможностей движка ksqlDB, сводя код, специфичный для тестирования, к минимуму. Всякий раз, когда нам требуется новая функциональность для инструмента тестирования, мы сначала рассмотрим возможность поддержки её непосредственно в ksqlDB.
  4. Инструмент должен быстро выполнять множество тестов с возможностью распараллеливания тестовых прогонов.

Ещё одно небольшое преимущество инструмента тестирования на основе SQL заключается в возможности добавлять комментарии, описывающие утверждения и операторы.

Почему не использовать повторно?

Зачем вводить YATT, когда у нас уже есть три существующих варианта? Есть несколько факторов:

  • Основная мотивация носит практический характер: нам нужно чередующееся тестирование для работы над обновлением запросов, и встраивание этого в QTT потребует, по сути, полной переделки как существующего инструмента, так и исторического выполнения тестов при сохранении или миграции всех исторических планов. Чтобы быстро предоставить обновления запросов (см. KLIP-28), мы начнём работу над YATT, сохраняя поддержку тестов QTT.
  • Со временем ksql-test-runner и (R)QTT значительно отошли от движка ksqlDB и требуют большого количества пользовательского кода (модуль ksqldb-functional-test содержит 11 тыс. строк Java). В частности, пользовательский формат JSON требует поддержания параллельной, предназначенной только для тестирования структуры и serde для преобразования входных данных/выходов в желаемый формат сериализации. Вместо этого мы должны использовать производственную функциональность выражения SQL для создания данных.
  • Предоставление инструмента тестирования на базе SQL лучше впишется в наше предложение продуктов, позволяя пользователям писать тесты, не выходя из «мышления SQL».

Объём работ

Этот KLIP охватывает:

  • дизайн формата тестового файла;
  • разработку директив для тестирования;
  • определение функций, которые необходимо реализовать для замены (R)QTT/инструмента тестирования.

Этот KLIP не охватывает:

  • реализацию пути миграции от (R)QTT/инструмента тестирования, но мы планируем отказаться от ksql-test-runner в течение следующих нескольких выпусков. На момент его удаления мы создадим несколько удобных сценариев, помогающих генерировать файлы SQL YATT.
  • создание исторических планов из тестов YATT SQL.

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

Дизайн

Лучший способ описать инструмент тестирования — привести мотивирующий пример, такой как тестовый файл ниже:

---------------------------------------------------------------------------------------------------
--@test: dml - stream - add filter
----------------------------------------------------------------0-------------------------------------

CREATE **СТРУКТУРА ТЕСТОВ**

YATT принимает в качестве параметра каталог, содержащий файлы тестирования, и запускает все тесты в каталоге на одной виртуальной машине Java (JVM). В качестве альтернативы он может принимать один тестовый файл для запуска только ограниченного подмножества тестов, а также какие тесты запускать внутри файла на основе регулярного выражения.

Каждый тестовый файл может содержать один или несколько тестов, разделённых директивой `--@test`. Это улучшит существующий ksql-test-runner, которому для одного теста требуется три файла. Имя теста представляет собой объединение времени тестового файла и содержимого директивы `--@test`.

Затем тест может содержать любое количество чередующихся операторов, поддерживаемых средством тестирования. Данные будут вставлены в темы с помощью `INSERT INTO`, а утверждения будут выполняться с использованием нового синтаксиса `ASSERT` (описано ниже).

Будут дополнительные «мета» директивы, которые позволят тестировать функциональность, например ожидаемые исключения.

**УТВЕРЖДЕНИЕ (ASSERT)**

`ASSERT`  это основной способ обеспечения условий в YATT, который будет проанализирован и реализован с использованием `AstBuilder` ksqlDB, чтобы убедиться, что YATT может использовать существующую поддержку анализа выражений.

Сначала операторы `ASSERT`, отправленные на рабочий сервер, завершатся ошибкой, но мы можем рассмотреть возможность разрешения `ASSERT` в будущем, чтобы разрешить тестирование/эксперименты на основе REPL.

**`ASSERT DATA`**

Оператор `ASSERT DATA` утверждает, что данные существуют со смещением (или иначе последовательно на основе последнего `ASSERT DATA`) с заданными значениями. Если `ASSERT DATA` не указывает определённые столбцы, они будут проигнорированы (что позволяет пользователям утверждать, что только подмножество столбцов соответствует ожидаемому).

Значения будут созданы так же, как значения создаются с помощью `INSERT INTO`:
```sql
ASSERT DATA source_name [OFFSET at_offset] ( { column_name } [, ...] ) VALUES ( value [, ...] );

Оператор ASSERT DATA позволит пользователям также указывать псевдостолбцы, такие как ROWTIME, и когда ksqlDB поддерживает такие конструкции, как PARTITION и/или заголовки, YATT унаследует эти псевдостолбцы.

ASSERT NO DATA

Оператор ASSERT NO DATA позволяет пользователям гарантировать, что в указанном источнике больше нет данных:

ASSERT NO DATA source_name [OFFSET from_offset];

ASSERT SOURCE

Операторы ASSERT (TABLE | STREAM) утверждают, что данный поток или таблица имеют указанные столбцы и физические свойства:

ASSERT (STREAM | TABLE) source_name ( { column_name data_type [[PRIMARY] KEY] } [, ...] )
    WITH (property_name = expression [, ...] );

ASSERT TYPE

Оператор ASSERT TYPE гарантирует, что пользовательский тип имеет ожидаемый тип. Это особенно полезно при объединении нескольких CREATE TYPE. 2_test.sql


Затем они пишут следующие файлы и просят инструмент рекурсивно просмотреть каталог верхнего уровня и запустить все тесты. Этот тест использует некоторый синтаксис (`--@depends`) для демонстрации того, как мы могли бы использовать это в конвейере CI/CD для объединения тестов вместе, а также для сопоставления тестов с соответствующими производственными файлами SQL.

```sql
-- 1_create_foo_bar.sql
CREATE STREAM foo (id INT KEY, col1 VARCHAR) WITH (...)
CREATE STREAM bar AS SELECT * from FOO;
-- 1_test.sql
--@test: 1_test
RUN SCRIPT '1_create_foo_bar.sql`;
ASSERT STREAM foo (...) WITH (...);
INSERT INTO foo ...;
-- 2_update_bar.sql
CREATE OR REPLACE STREAM bar AS SELECT * FROM foo WHERE foo.id > 0;
--@test: 2_test
--@depends: 1/1_test.sql
RUN_SCRIPT '2_update_bar.sql';
INSERT INTO foo ...;
ASSERT DATA bar ...;

Реализация

Есть два способа реализации такого инструмента тестирования:

  1. на основе нескольких топологических тестовых драйверов, по одному для каждого запроса;
  2. на базе реального кластера Kafka.

Первоначальная реализация будет ограничена только первой реализацией, чтобы обеспечить быстрое выполнение теста. Поскольку YATT поможет в разработке, необходимо, чтобы тесты выполнялись быстро — как в пакетном режиме, так и в качестве отдельных тестовых случаев.

Расширения

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

  • BYO Kafka: мы можем разрешить пользователям «подключать свой собственный кластер Kafka» и запускать эти тесты против реального кластера Kafka. Это позволит пользователям создавать любые данные, которые они хотят, вне этого инструмента, смягчая ограничения, описанные выше. Это также позволит им «отлаживать» дальше, когда что-то идёт не так, как они хотят, путём изучения входных/выходных тем через ksqlDB.
  • YaaS: (YAAT как услуга) мы можем рассмотреть вариант развёртывания, при котором YAAT просто следит за каталогом в каком-либо долгосрочном развёртывании, запуская новые тесты всякий раз, когда каталог изменяется.

План тестирования

Это инструмент тестирования! Он самотестируется в том смысле, что мы будем использовать его для тестирования обновлений запросов и утверждать, что он работает так, как ожидается. Мы также позаботимся о том, чтобы были отрицательные тесты, чтобы гарантировать, что он должен потерпеть неудачу, когда предполагается, что он потерпит неудачу.

Этапы поставки

  1. (S) Базовая функциональность тестирования, необходимая для тестирования обновления запросов.
  2. (S) Поддержка выполнения связанных операторов (т. е. один CSAS в качестве входных данных для другого).
  3. (S) Поддерживаемые метадирективы, отличные от --@expected.error.
  4. (M) Расширение ksqlDB для поддержки языковых пробелов.
  5. (M) Исторические планы.
  6. (L) Миграция (R)QTT вариантов использования.

Документация

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

Последствия для безопасности

N/A

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-KSQL.git
git@api.gitlife.ru:oschina-mirror/mirrors-KSQL.git
oschina-mirror
mirrors-KSQL
mirrors-KSQL
master