From a900e2648711352a31f19c18731adfb34dd6245b Mon Sep 17 00:00:00 2001 From: Aleksey Ko Date: Tue, 7 May 2024 14:55:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B8=20=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B5?= =?UTF-8?q?=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- documentation/docs/features/events.md | 178 ++++++++++++++++++ .../images/test-settings-events-tree.png | Bin 0 -> 42570 bytes .../ЮТСобытияСлужебный/Module.bsl | 53 ++++-- .../Subsystems/{СобытияИсполненияТестов => ИсполнениеТестов}/CommandInterface.cmi | 0 .../СобытияИсполненияТестов.mdo => ИсполнениеТестов/ИсполнениеТестов.mdo} | 4 +- .../Subsystems/ОбработчикиСобытий/ОбработчикиСобытий.mdo | 2 +- 6 files changed, 220 insertions(+), 17 deletions(-) create mode 100644 documentation/docs/features/images/test-settings-events-tree.png rename exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/{СобытияИсполненияТестов => ИсполнениеТестов}/CommandInterface.cmi (100%) rename exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/{СобытияИсполненияТестов/СобытияИсполненияТестов.mdo => ИсполнениеТестов/ИсполнениеТестов.mdo} (84%) diff --git a/documentation/docs/features/events.md b/documentation/docs/features/events.md index 67c86fe0..5845eda2 100644 --- a/documentation/docs/features/events.md +++ b/documentation/docs/features/events.md @@ -67,3 +67,181 @@ YAxUnit также использует события для работы вн * Выполнять начальную подготовку базы или настройку движка перед прогонами * Реализовывать свои механизмы (например удаление данных с использованием подписок) * Формировать отчеты о тестировании online. + +### Подписка на события движка + +Для подключения своих обработчиков событий вам необходимо: + +1. Создание структуры подсистем + 1. Создать свою подсистему (не рекомендуется использовать подсистемы движка) с именем оканчивающимся на `ЮТПодключаемыеМодули`, например, `Тесты_ЮТПодключаемыеМодули`. + 2. У созданной подсистемы снять флаг `ВключатьВКомандныйИнтерфейс`. + 3. Внутри нее создать подсистему с именем `ОбработчикиСобытий`. + 4. Внутри подсистемы `ОбработчикиСобытий` создать подсистемы для нужной группы событий: + * Инициализация + * ЗагрузкаТестов + * ИсполнениеТестов +2. Добавить общий модуль (или использовать подходящий существующий) в котором будут размещены обработчики событий. +3. Сигнатура и описание обработчиков описаны ниже, примеры многих из них можно увидеть в движке. + +#### Пример + +Задача: необходимо по умолчанию включить настройку `ВТранзакции` для всех тестов. + +Для этого необходимо подписаться на событие [`УстановитьПараметрыЗапускаПоУмолчанию`](#установитьпараметрызапускапоумолчаниюпараметрызапуска), которое относится к блоку [`Инициализация`](#инициализация) + +Структура подсистем: +![Структура подсистем](images/test-settings-events-tree.png) + +```bsl title="НастройкаYAxUnit" +#Область СлужебныйПрограммныйИнтерфейс + +// Установить настройки по умолчанию. +// +// Параметры: +// ПараметрыЗапуска - см. ЮТФабрика.ПараметрыЗапуска +Процедура УстановитьПараметрыЗапускаПоУмолчанию(ПараметрыЗапуска) Экспорт + + ПараметрыЗапуска.settings.ВТранзакции = Истина; + +КонецПроцедуры + +#КонецОбласти + +``` + +## Описание событий движка + +### Инициализация + +#### УстановитьПараметрыЗапускаПоУмолчанию(ПараметрыЗапуска) + +`&НаКлиенте`. + +Подписка на это событие позволяет: + +* выполнить базовую настройку параметров запуска +* эту настройку можно переопределить параметрами запуска (json файл с тройками) +* может быть полезно при расширении возможностей движка новыми л механизмами +* обработчик может (а точнее, должен) изменять `ПараметрыЗапуска` + +Параметры: + +* ПараметрыЗапуска - см. [ЮТФабрика.ПараметрыЗапуска](/api/ЮТФабрика#параметрызапуска) + +#### ИнициализацияКонтекста(ДанныеКонтекста) + +`&НаСервере` и `&НаКлиенте`. + +Вызывается при первичной инициализации глобального контекста. +Используется для первоначального заполнения контекста, параметра `ДанныеКонтекста`. + +Параметры: + +* ДанныеКонтекста - Структура + +#### Инициализация(ПараметрыЗапуска) + +`&НаКлиенте` + +Вызывается после инициализации контекстов и загрузки настроек. +Позволяет выполнить настройку различных механизмов движка. + +:::note В этом обработчике нельзя менять параметр `ПараметрыЗапуска`. +::: + +Параметры: + +* ПараметрыЗапуска - см. [ЮТФабрика.ПараметрыЗапуска](/api/ЮТФабрика#параметрызапуска) + +### ЗагрузкаТестов + +#### ПередЧтениеСценариев() + +`&НаКлиенте` + +Вызывается перед загрузкой тестов. + +#### ПередЧтениемСценариевМодуля(МетаданныеМодуля) + +`&НаКлиенте`/`&НаСервере` в зависимости от доступности модуля. + +Вызывается перед чтением сценариев конкретного модуля (вызовом метода `ИсполняемыеСценарии`). +Позволяет настроить базовые параметры перед чтением настроек тестов модуля. +Параметры: + +* МетаданныеМодуля - см. ЮТФабрикаСлужебный.ОписаниеМодуля + +#### ПослеЧтенияСценариевМодуля(МетаданныеМодуля, ИсполняемыеСценарии) + +`&НаКлиенте`/`&НаСервере` в зависимости от доступности модуля. + +Позволяет настроить/обработать параметры загруженных настроек тестов модуля + +Параметры: + +* МетаданныеМодуля - см. ЮТФабрикаСлужебный.ОписаниеМодуля +* ИсполняемыеСценарии - см. ЮТТестыСлужебный.СценарииМодуля + +#### ПослеЧтенияСценариев(Сценарии) + +`&НаКлиенте` + +Вызывается после загрузки всех тестов. + +#### ПослеФормированияИсполняемыхНаборовТестов(ИсполняемыеТестовыеМодули) + +`&НаКлиенте` + +Вызывается после формирования исполняемых тестов, сформированных на основе зарегистрированных тестов. + +Например, из одного клиент-серверного теста формируется 2 исполняемых теста (для сервера и для клиента) + +### ИсполнениеТестов + +#### ПередВыполнениемТестов(ИсполняемыеМодули) + +`&НаКлиенте` + +Перед запуском всех тестов. + +#### ПередВсемиТестамиМодуля(ОписаниеСобытия) + +`&НаКлиенте`/`&НаСервере` в зависимости от доступности модуля. + +Смотрите описание [выше](#события-тестов) + +#### ПередТестовымНабором(ОписаниеСобытия) + +`&НаКлиенте`/`&НаСервере` в зависимости от доступности модуля. + +Смотрите описание [выше](#события-тестов) + +#### ПередКаждымТестом(ОписаниеСобытия) + +`&НаКлиенте`/`&НаСервере` в зависимости от доступности модуля. + +Смотрите описание [выше](#события-тестов) + +#### ПослеКаждогоТеста(ОписаниеСобытия) + +`&НаКлиенте`/`&НаСервере` в зависимости от доступности модуля. + +Смотрите описание [выше](#события-тестов) + +#### ПослеТестовогоНабора(ОписаниеСобытия) + +`&НаКлиенте`/`&НаСервере` в зависимости от доступности модуля. + +Смотрите описание [выше](#события-тестов) + +#### ПослеВсехТестовМодуля(ОписаниеСобытия) + +`&НаКлиенте`/`&НаСервере` в зависимости от доступности модуля. + +Смотрите описание [выше](#события-тестов) + +#### ПослеВыполненияТестов(РезультатТестирования) + +`&НаКлиенте` + +После выполнения всех тестов. diff --git a/documentation/docs/features/images/test-settings-events-tree.png b/documentation/docs/features/images/test-settings-events-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..968ecf352316dffc2ef984bf2104698743222701 GIT binary patch literal 42570 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
    7x}b9%xAt*jWBPara1I6^R`m9 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 literal 0 HcmV?d00001 diff --git a/exts/yaxunit/src/CommonModules/ЮТСобытияСлужебный/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТСобытияСлужебный/Module.bsl index f99212e0..cc1d3aee 100644 --- a/exts/yaxunit/src/CommonModules/ЮТСобытияСлужебный/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТСобытияСлужебный/Module.bsl @@ -20,6 +20,15 @@ #Область Инициализация +// Подписка на это событие позволяет: +// +// * выполнить базовую настройку параметров запуска +// * эту настройку можно переопределить параметрами запуска (json файл с настройками) +// * может быть полезно при расширении возможностей движка новыми настраиваемыми механизмами +// * обработчик может (а точнее, должен) изменять `ПараметрыЗапуска` +// +// Параметры: +// ПараметрыЗапуска - см. ЮТФабрика.ПараметрыЗапуска Процедура УстановитьПараметрыЗапускаПоУмолчанию(ПараметрыЗапуска) Экспорт Параметры = ЮТКоллекции.ЗначениеВМассиве(ПараметрыЗапуска); @@ -27,13 +36,12 @@ КонецПроцедуры -Процедура Инициализация(ПараметрыЗапуска) Экспорт - - Параметры = ЮТКоллекции.ЗначениеВМассиве(ПараметрыЗапуска); - ВызватьПодключаемыйОбработчикСобытия("Инициализация", "Инициализация", Параметры); - -КонецПроцедуры - +// Вызывается при первичной инициализации глобального контекста. +// Используется для первоначального заполнения контекста, параметра `ДанныеКонтекста` +// Вызывается и для сервера, и для клиента +// +// Параметры: +// ДанныеКонтекста - Структура Процедура ИнициализацияКонтекста(ДанныеКонтекста) Экспорт Параметры = ЮТКоллекции.ЗначениеВМассиве(ДанныеКонтекста); @@ -41,6 +49,20 @@ КонецПроцедуры +// Вызывается после инициализации контекстов и загрузки настроек. +// Позволяет выполнить настройку различных механизмов движка. +// +// Важно: В этом обработчике нельзя менять параметр `ПараметрыЗапуска`. +// +// Параметры: +// ПараметрыЗапуска - см. ЮТФабрика.ПараметрыЗапуска +Процедура Инициализация(ПараметрыЗапуска) Экспорт + + Параметры = ЮТКоллекции.ЗначениеВМассиве(ПараметрыЗапуска); + ВызватьПодключаемыйОбработчикСобытия("Инициализация", "Инициализация", Параметры); + +КонецПроцедуры + #КонецОбласти #Область СобытияИсполненияТестов @@ -145,7 +167,7 @@ Процедура ПередВыполнениемТестов(ИсполняемыеМодули) Экспорт Параметры = ЮТКоллекции.ЗначениеВМассиве(ИсполняемыеМодули); - ВызватьПодключаемыйОбработчикСобытия("ПередВыполнениемТестов", "СобытияИсполненияТестов", Параметры); + ВызватьПодключаемыйОбработчикСобытия("ПередВыполнениемТестов", "ИсполнениеТестов", Параметры); КонецПроцедуры @@ -156,7 +178,7 @@ Процедура ПослеВыполненияТестов(РезультатТестирования) Экспорт Параметры = ЮТКоллекции.ЗначениеВМассиве(РезультатТестирования); - ВызватьПодключаемыйОбработчикСобытия("ПослеВыполненияТестов", "СобытияИсполненияТестов", Параметры); + ВызватьПодключаемыйОбработчикСобытия("ПослеВыполненияТестов", "ИсполнениеТестов", Параметры); КонецПроцедуры @@ -165,6 +187,7 @@ #Область СобытияЗагрузкиТестов // Обработка события "ПередЧтениеСценариев" +// Вызывается перед загрузкой тестов. Процедура ПередЧтениеСценариев() Экспорт Параметры = Новый Массив(); @@ -173,7 +196,9 @@ КонецПроцедуры // Обработчик события "ПередЧтениемСценариевМодуля" -// Позволяет настроить базовые параметры перед чтением настроек тестов модуля +// Вызывается перед чтением сценариев конкретного модуля (вызовом метода `ИсполняемыеСценарии`). +// Позволяет настроить базовые параметры перед чтением настроек тестов модуля. +// // Параметры: // МетаданныеМодуля - см. ЮТФабрикаСлужебный.ОписаниеМодуля Процедура ПередЧтениемСценариевМодуля(МетаданныеМодуля) Экспорт @@ -187,7 +212,7 @@ // Позволяет настроить/обработать параметры загруженных настроек тестов модуля // Параметры: // МетаданныеМодуля - см. ЮТФабрикаСлужебный.ОписаниеМодуля -// ИсполняемыеСценарии - см. ЮТТесты.СценарииМодуля +// ИсполняемыеСценарии - см. ЮТТестыСлужебный.СценарииМодуля Процедура ПослеЧтенияСценариевМодуля(МетаданныеМодуля, ИсполняемыеСценарии) Экспорт Параметры = ЮТКоллекции.ЗначениеВМассиве(МетаданныеМодуля, ИсполняемыеСценарии); @@ -251,7 +276,7 @@ Если ПропуститьОбработчикТестовогоМодуля Тогда Параметры = ЮТКоллекции.ЗначениеВМассиве(ОписаниеСобытия); - Ошибки = ВызватьПодключаемыйОбработчикСобытия(ИмяСобытия, "СобытияИсполненияТестов", Параметры); + Ошибки = ВызватьПодключаемыйОбработчикСобытия(ИмяСобытия, "ИсполнениеТестов", Параметры); ЗарегистрироватьОшибкиСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибки); Иначе ВызватьОбработкуСобытияИсполненияТестов(ИмяСобытия, ОписаниеСобытия); @@ -266,11 +291,11 @@ Параметры = ЮТКоллекции.ЗначениеВМассиве(ОписаниеСобытия); Если ЭтоСобытиеПеред(ИмяСобытия) Тогда - Ошибки = ВызватьПодключаемыйОбработчикСобытия(ИмяСобытия, "СобытияИсполненияТестов", Параметры); + Ошибки = ВызватьПодключаемыйОбработчикСобытия(ИмяСобытия, "ИсполнениеТестов", Параметры); ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия); Иначе ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия); - Ошибки = ВызватьПодключаемыйОбработчикСобытия(ИмяСобытия, "СобытияИсполненияТестов", Параметры); + Ошибки = ВызватьПодключаемыйОбработчикСобытия(ИмяСобытия, "ИсполнениеТестов", Параметры); КонецЕсли; ЗарегистрироватьОшибкиСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибки); diff --git a/exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/СобытияИсполненияТестов/CommandInterface.cmi b/exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/ИсполнениеТестов/CommandInterface.cmi similarity index 100% rename from exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/СобытияИсполненияТестов/CommandInterface.cmi rename to exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/ИсполнениеТестов/CommandInterface.cmi diff --git a/exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/СобытияИсполненияТестов/СобытияИсполненияТестов.mdo b/exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/ИсполнениеТестов/ИсполнениеТестов.mdo similarity index 84% rename from exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/СобытияИсполненияТестов/СобытияИсполненияТестов.mdo rename to exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/ИсполнениеТестов/ИсполнениеТестов.mdo index 1acdbce1..cabd5580 100644 --- a/exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/СобытияИсполненияТестов/СобытияИсполненияТестов.mdo +++ b/exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/Subsystems/ИсполнениеТестов/ИсполнениеТестов.mdo @@ -1,9 +1,9 @@ - СобытияИсполненияТестов + ИсполнениеТестов ru - События исполнения тестов + Исполнение тестов true CommonModule.МокитоСлужебный diff --git a/exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/ОбработчикиСобытий.mdo b/exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/ОбработчикиСобытий.mdo index aca9b957..ee846d2a 100644 --- a/exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/ОбработчикиСобытий.mdo +++ b/exts/yaxunit/src/Subsystems/ЮТПодключаемыеМодули/Subsystems/ОбработчикиСобытий/ОбработчикиСобытий.mdo @@ -13,6 +13,6 @@ CommonModule.ЮТЛогированиеСлужебный ЗагрузкаТестов Инициализация - СобытияИсполненияТестов + ИсполнениеТестов Subsystem.ЮТПодключаемыеМодули