Автор: agavra | Целевая версия: TBD | Статус: обсуждение | Обсуждение: TBD
Краткое содержание: представить YATT (Yet Another Testing Tool), который написан и управляется в основном с помощью синтаксиса на основе SQL, чтобы обеспечить покрытие тестовых случаев, требующих чередования операторов и вставок. В конечном итоге цель состоит в том, чтобы заменить внешний ksql-test-runner и, возможно, тесты (R)QTT.
Существующая инфраструктура тестирования мощна и может справиться со многими существующими сценариями использования. Однако ей не хватает гибкости, чтобы быть полезной при тестировании обновлений запросов: ни одна из фреймворков не поддерживает чередование операторов/вставок/утверждений. Этот KLIP предлагает новый императивный инструмент тестирования для покрытия этого варианта использования и описывает способ замены существующих инструментов этой функциональностью.
В списке ниже перечислены мотивирующие принципы проектирования:
Ещё одно небольшое преимущество инструмента тестирования на основе SQL заключается в возможности добавлять комментарии, описывающие утверждения и операторы.
Зачем вводить YATT, когда у нас уже есть три существующих варианта? Есть несколько факторов:
Этот KLIP охватывает:
Этот KLIP не охватывает:
Цель этого 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 ...;
Есть два способа реализации такого инструмента тестирования:
Первоначальная реализация будет ограничена только первой реализацией, чтобы обеспечить быстрое выполнение теста. Поскольку YATT поможет в разработке, необходимо, чтобы тесты выполнялись быстро — как в пакетном режиме, так и в качестве отдельных тестовых случаев.
Существуют некоторые расширения для YATT, которые мы, возможно, захотим рассмотреть. Я перечисляю их здесь, потому что сейчас думаю о них и не хочу забыть!
Это инструмент тестирования! Он самотестируется в том смысле, что мы будем использовать его для тестирования обновлений запросов и утверждать, что он работает так, как ожидается. Мы также позаботимся о том, чтобы были отрицательные тесты, чтобы гарантировать, что он должен потерпеть неудачу, когда предполагается, что он потерпит неудачу.
--@expected.error
.Документация для этого инструмента тестирования станет ещё одной статьёй в наборе документации, который мы в настоящее время ведём. Она будет содержать перечисление специальных директив, а также любых неподдерживаемых операций.
N/A
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )