Тесты для etl-блоков¶
Введение¶
Разработка etl-блоков выполняется в локальном режиме без подключения к экземпляру Analytic Workspace.
Для проверки корректности блока используются автоматические тестирующие функции, описываемые разработчиком параллельно с созданием исходных текстов блока.
Вдальнейшем, подготовленные автотесты помогут в поддержание его стабильной работы при внесении правок и доработок.
Инструменты¶
pytest¶
Для создания и запуска тестов etl-блоков в AW используется фреймворк pytest
.
Он устанавливается в виртуальное окружение вместе с клиентской библиотекой analytic-workspace-client
Visual Studio Code¶
Если для разработки блоков вы используете Visual Studio Code, то внутри этой IDE есть возможность настроить запуск тестов из графического интерфейса.
Для этого откройте раздел "Testing" и нажмите кнопку "Configure Python Tests"
Далее выберите пункт "pytest".
В следующем вопросе рекомендуется выбрать "Root directory", но в целом вы можете указать папку конкретного теста.
В завершении настройки вы увидете структуру ваших автотестов.
Расположение тестов¶
Код тестовых функций рекомендуется размещать в файле с названием test_%uid блока%.py
.
├── block_code.py
├── block_meta.json
├── test_aw_sql_block.py
└── README.md
При большом количестве тестов, тестирующие функции можно разбить на несколько файлов.
.
├── block_code.py
├── block_meta.json
├── test_aw_sql_block_meta.py
├── test_aw_sql_block_data.py
└── README.md
План тестирования¶
План тестирования etl-блока должен включать в себя следующие проверки:
- Проверка правильности заполнения метаданных;
- Проверка функции получения схемы данных;
- Проверка функции обработки данных;
- Проверка обработчиков действий (при их наличии в блоке).
Кроме этого, рекомендуется добавить в тесты не только позитивные сценарии (когда пользователь вложил в блок все нужные объекты и корректно заполнил параметры блока), но и негативные:
- Пользователь не добавил внутрь блока ни одного объекта;
- Пользователь добавил внутрь блока объекты, над которыми блок не может выполнить корректную обработку данных;
- Пользователь не указал (или указал, но неправильно) параметры блока и так далее.
С проверками негативных сценариев вы можете ознакомиться в блоке Декоратор из раздела Примеры.
Здесь, вы можете
увидеть как проверяется поведение функций block_schema
и block_data
, когда пользователь не указал
имя функции (тесты test_block_schema_empty_function_name
и test_block_data_empty_function_name
).
Тестовые данные¶
Для работы большинства etl-блоков требуются данные для вложенных в блок объектов. Поэтому, в тестовом модуле нужно указать, с какими данными вложенных объектов будут запускать тесты блока.
При описании тестовых данных используются объекты класса ModelObjectTestData
.
Тестовые данные указываются в аргументах функций по запуску механизмов получения схемы данных, обработке данных и запуска обработчиков действий.
- Функция
get_etl_block_schema
используется запуска механизма получения схемы данных блока. - Функция
get_etl_block_data
используется запуска механизма обработки данных блока. - Функция
run_block_action
используется запуска обработчиков действий.
Где указывать тестовые данные
Так как тестовые данные могут встречаться сразу в нескольких тестовых функциях, то имеет смысл размещать объявление
объектов с тестовыми данными на самом верхнем уровне модуля с тестами block_test.py
.
В примере выше так и сделано.
Запуск тестов¶
Запуск тестов выполнятся командой pytest
. Для этого, активируйте виртуальное окружение перейдите в папку блока и выполните её.
Можно запускать тесты сразу для нескольких блоков. Для этого перейдите в папку с вашими тестами и запустите команду pytest там.
Если для разработки тестов вы используете Visual Studio Code и настроили запуск тестов, то можете запускать тесты (по одной функции, по одному блоку, по всем блокам сразу) прямо из IDE.
API¶
Метаданные блока ETLBlockMeta
¶
Объект для хранения метаданных блока.
Атрибут | Тип | Описание |
---|---|---|
uid |
string |
Уникальный идентификатор блока |
name |
string |
Название блока |
description |
string |
Описание блока |
author |
string |
Строка с указанием автора |
version |
string |
Строка с указанием версии |
updated_at |
datetime |
Строка с временной меткой последнего изменения блока |
params |
list |
Список параметров блока |
Тестовые данные ModelObjectTestData
¶
За объявление тестовых данных отвечает класс ModelObjectTestData
из модуля aw_client.etl_blocks
.
Атрибут | Тип | Обязательно | Описание |
---|---|---|---|
model_name |
string |
Да | Название объекта с тестовыми данными в модели. По этому названию код блока обращается к вложенным в него датафреймам и структуре. |
rows |
list[dict] |
Да | Список словарей со строками тестовых данных |
schema |
list[dict] |
Нет | Описание схемы тестовых данных |
Про model_name
Значение model_name
соответствует названию объекта при просмотре структуры вложенных объектов на форме настройки блока.
Типы в схеме тестовых данных
В описании схемы данных schema
тестового объекта указываются названия ключей из словарей rows
и тип данных simple_type
.
Возможные типы данных:
string
- строка;number
- число (целое или с плавающей запятой);bool
- логическое (булево) значение;date
- дата и время.
Если в параметре simple_type
указано значение не из этого типа, то считается, что оно равно string
.
Значение параметра schema
не является обязательным. Если не указано (или указано schema=None
), то система попытается
автоматически вывести схему данных на основе значений первого словаря данных из rows
.
Загрузка метаданных блока¶
Выполняется функцией get_etl_block_meta
из модуля aw_client.etl_blocks
.
Аргументы¶
Аргумент | Тип | Обязательно | Описание |
---|---|---|---|
block_path |
Path |
Да | Путь к папке, в которой хранятся исходные файлы. В указанной папке должен находиться файл block_meta.json |
Возвращаемое значение¶
Функция возвращает объект класса ETLBlockMeta
с метаданными блока.
Исключительные ситуации¶
Исключение | Когда возникает |
---|---|
Exception | В папке block_path не найден файл block_meta.json |
VaildationError | Содержимое файла block_meta.json не прошло форматно-логический контроль |
Получение схемы данных блока¶
Выполняется функцией get_etl_block_schema
из модуля aw_client.etl_blocks
.
Аргументы¶
Аргумент | Тип | Обязательно | Описание |
---|---|---|---|
block_path |
Path |
Да | Путь к папке, в которой хранятся исходные файлы. В указанной папке должен находиться файл block_meta.json |
test_data |
Список объектов ModelObjectTestData |
Да | Список тестовых данных для вложенных объектов. Если у блока нет вложенных объектов, то указывается пустой список [] |
params |
dict |
Да | Словарь с параметрами, указанные пользователем на форме настройки блока |
run_mode |
string |
Нет | Режим выполнения блока |
vault |
Vault |
Нет | Хранилище чувствительных параметров модели |
model_script_code |
string |
Нет | Исходный код скрипта модели |
Возвращаемое значение¶
Возвращает объект StructType
со схемой данных блока.
Исключительные ситуации¶
Исключение | Когда возникает |
---|---|
Exception | 1. В папке block_path не найден файл block_code.py ;2. Файл block_code.py содержит синтаксические ошибки;3. Скрипт модели из аргумента model_script_code содержит синтаксические ошибки. |
Также, может появиться любая другая исключительная ситуация, выброшенная кодом функции block_schema()
из модуля блока.
Получение данных блока¶
Выполняется функцией get_etl_block_data
из модуля aw_client.etl_blocks
.
Аргументы¶
Аргумент | Тип | Обязательно | Описание |
---|---|---|---|
block_path |
Path |
Да | Путь к папке, в которой хранятся исходные файлы. В указанной папке должен находиться файл block_meta.json |
test_data |
Список объектов ModelObjectTestData |
Да | Список тестовых данных для вложенных объектов. Если у блока нет вложенных объектов, то указывается пустой список [] |
params |
dict |
Да | Словарь с параметрами, указанные пользователем на форме настройки блока |
run_mode |
string |
Нет | Режим выполнения блока |
vault |
Vault |
Нет | Хранилище чувствительных параметров модели |
model_script_code |
string |
Нет | Исходный код скрипта модели |
Возвращаемое значение¶
Возвращает датафрейм DataFrame
с обработанными данными.
Исключительные ситуации¶
Исключение | Когда возникает |
---|---|
Exception | 1. В папке block_path не найден файл block_code.py ;2. Файл block_code.py содержит синтаксические ошибки;3. Скрипт модели из аргумента model_script_code содержит синтаксические ошибки. |
Также, может появиться любая другая исключительная ситуация, выброшенная кодом функции block_data()
из модуля блока.
Выполнение действия¶
Выполняется функцией run_block_action
из модуля aw_client.etl_blocks
.
Аргументы¶
Аргумент | Тип | Обязательно | Описание |
---|---|---|---|
block_path |
Path |
Да | Путь к папке, в которой хранятся исходные файлы. В указанной папке должен находиться файл block_meta.json |
action_name |
string |
Да | Код действия, обработчик которого нужно запустить |
test_data |
Список объектов ModelObjectTestData |
Да | Список тестовых данных для вложенных объектов. Если у блока нет вложенных объектов, то указывается пустой список [] |
params |
dict |
Да | Словарь с параметрами, указанные пользователем на форме настройки блока |
run_mode |
string |
Нет | Режим выполнения блока |
vault |
Vault |
Нет | Хранилище чувствительных параметров модели |
model_script_code |
string |
Нет | Исходный код скрипта модели |
Возвращаемое значение¶
Возвращает объект класса ETLBlockActionResult
с результатами запуска
обработчика действия.
Объекты тестирования¶
Метаданные блока¶
Тест метаданных проверяет, что файл с метаданными блока block_meta.json
проходит форматно-логический контроль.
Как тестировать:
- Загрузить метаданные тестируемого блока, используя функцию
get_etl_block_meta
; - Если
block_meta.json
не проходит проверки, то будет выброшено исключениеValidationError
.
Пример теста на проверку метаданных | |
---|---|
Построение схемы данных¶
Тест построения схемы блока проверяет, что функция block_meta()
из модуля блока работает корректно.
Как тестировать:
- Заполнить словарь с входными параметрами блока так, как их указывает пользователь;
- Вызвать функцию
get_etl_block_schema
, передав в неё словарь параметров и список тестовых данных вложенных в блок объектов; - Проверить с помощью выражений
assert
, что функция вернула ожидаемую схему данных блока.
Обработка данных¶
Тест обработки данных блока проверяет, что функция block_data()
из модуля блока работает корректно.
Как тестировать:
- Заполнить словарь с входными параметрами блока так, как их указывает пользователь;
- Вызвать функцию
get_etl_block_data
, передав в неё словарь параметров и список тестовых данных вложенных в блок объектов; - У результирующего датасета вызвать функцию
collect()
для преобразования его содержимого в обычный список записей; - Проверить с помощью выражений
assert
, что функция вернула ожидаемые данные.