Skip to content

Commit

Permalink
Merge pull request #124 from potoyalo/feature/ext-test-suite
Browse files Browse the repository at this point in the history
Переопределение обработчиков событий тестового модуля
  • Loading branch information
alkoleft authored Jul 31, 2023
2 parents aaea780 + 7b7242f commit 68df8ed
Show file tree
Hide file tree
Showing 13 changed files with 355 additions and 34 deletions.
28 changes: 22 additions & 6 deletions documentation/docs/user-api/context.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,30 @@ tags: [Начало, Контекст]

# Контекст

## Механизм контекстов

Одним из важнейших блоков работы тестового движка является механизм контекстов.

Он позволяет:

1. хранить промежуточные данные и обеспечивать работу механизма текучих выражений
2. передавать между тестами необходимые данные
3. удалять тестовые данные (пока только временные файлы)
1. Хранить промежуточные данные и обеспечивать работу механизма текучих выражений.
2. Передавать между тестами необходимые данные.
3. Удалять тестовые данные.

И имеет несколько ограничений:

1. Не синхронизируется между клиентом и сервером
2. Тестовые контексты имеют ограниченное время жизни, например, контекст теста "живет" только в рамках теста и событиях "ПередКаждымТестом", "ПослеКаждогоТеста".
1. Не синхронизируется между клиентом и сервером.
2. Тестовые контексты имеют ограниченное время жизни. Например, контекст теста "живет" только в рамках теста и событиях "ПередКаждымТестом", "ПослеКаждогоТеста".

Для различных механизмов движка существуют различные контексты, такие как контекст утверждений, контекст теста и тд.

## Контексты тестового модуля

Разработчику тестов будут интересны следующие контексты:

* Контекст теста (`ЮТест.КонтекстТеста`) - живет в рамках одного теста, также доступен в обработчиках событий `ПередКаждымТестом` и `ПослеКаждогоТеста`
* Контекст теста (`ЮТест.КонтекстТеста`) - живет в рамках одного теста. Доступен в каждом тесте и в обработчиках событий
* `ПередКаждымТестом`
* `ПослеКаждогоТеста`
* Контекст тестового набора (`ЮТест.КонтекстТестовогоНабора`) - живет в рамках набора тестов. Доступен в каждом тесте набора и в обработчиках событий
* `ПередТестовымНабором`
* `ПослеТестовогоНабора`
Expand All @@ -34,3 +40,13 @@ tags: [Начало, Контекст]
* `ПослеТестовогоНабора`
* `ПередКаждымТестом`
* `ПослеКаждогоТеста`

На каждом уровне исполнения есть возможность переопределить обработчики событий соответствующего контекста исполнения при помощи методов `Перед()` и `После()`. Настроенный обработчик события будет вызван _вместо_ основного. Пример:
```bsl
ЮТТесты
.ДобавитьТестовыйНабор("Набор1") // Будет вызван основной обработчик ПередТестовымНабором()
.ДобавитьТест("Тест1")
.ДобавитьТестовыйНабор("Набор2").Перед("Перед_Набор2") // Будет вызван обработчик Перед_Набор2()
.ДобавитьТест("Тест2");
```
32 changes: 32 additions & 0 deletions exts/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,38 @@

КонецФункции

// Контекст исполнения текущего уровня.
//
// Возвращаемое значение:
// - Неопределено
// - См. ЮТФабрика.ОписаниеТестовогоМодуля
// - См. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// - См. ЮТФабрика.ОписаниеИсполняемогоТеста
Функция КонтекстИсполненияТекущегоУровня() Экспорт

Уровни = ЮТФабрика.УровниИсполнения();
КонтекстИсполнения = КонтекстИсполнения();

Если КонтекстИсполнения.Уровень = Уровни.Модуль Тогда

Возврат КонтекстИсполнения.Модуль;

ИначеЕсли КонтекстИсполнения.Уровень = Уровни.НаборТестов Тогда

Возврат КонтекстИсполнения.Набор;

ИначеЕсли КонтекстИсполнения.Уровень = Уровни.Тест Тогда

Возврат КонтекстИсполнения.Тест;

Иначе

Возврат Неопределено;

КонецЕсли;

КонецФункции

Функция ОписаниеКонтекста() Экспорт

Описание = Новый Структура;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,36 @@

КонецФункции

Функция ЗначениеНастройкиТеста(ИмяНастройки, ЗначениеПоУмолчанию) Экспорт
Функция Перед() Экспорт

ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().Перед;

Возврат ЗначениеНастройкиТеста(ИмяПараметра, "", Истина);

КонецФункции

Функция После() Экспорт

ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().После;

Возврат ЗначениеНастройкиТеста(ИмяПараметра, "", Истина);

КонецФункции

Функция ЗначениеНастройкиТеста(ИмяНастройки, ЗначениеПоУмолчанию, СтрогийУровеньИсполнения = Ложь) Экспорт

Значение = ЗначениеПоУмолчанию;
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();

Если КонтекстИсполнения.Тест <> Неопределено И КонтекстИсполнения.Тест.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Если СтрогийУровеньИсполнения Тогда

ТекущийКонтекстИсполнения = ЮТКонтекст.КонтекстИсполненияТекущегоУровня();

Если ТекущийКонтекстИсполнения <> Неопределено Тогда
Значение = ЮТОбщий.ЗначениеСтруктуры(ТекущийКонтекстИсполнения.НастройкиВыполнения, ИмяНастройки, ЗначениеПоУмолчанию);
КонецЕсли;

ИначеЕсли КонтекстИсполнения.Тест <> Неопределено И КонтекстИсполнения.Тест.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда

Значение = КонтекстИсполнения.Тест.НастройкиВыполнения[ИмяНастройки];

Expand Down
109 changes: 90 additions & 19 deletions exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,7 @@
КонецЕсли;
#КонецЕсли

ВызватьОбработкуСобытия("ПередКаждымТестом", ОписаниеСобытия);
ВызватьОбработкуСобытия("ПередТестом", ОписаниеСобытия);
ВызватьОбработкуСобытий(ЮТОбщий.ЗначениеВМассиве("ПередКаждымТестом", "ПередТестом"), ОписаниеСобытия);

КонецПроцедуры

Expand All @@ -105,8 +104,7 @@

ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор, Тест);

ВызватьОбработкуСобытия("ПослеТеста", ОписаниеСобытия);
ВызватьОбработкуСобытия("ПослеКаждогоТеста", ОписаниеСобытия);
ВызватьОбработкуСобытий(ЮТОбщий.ЗначениеВМассиве("ПослеТеста", "ПослеКаждогоТеста"), ОписаниеСобытия);

#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Если ЮТНастройкиВыполнения.ВТранзакции() Тогда
Expand Down Expand Up @@ -218,23 +216,39 @@

#Область СлужебныеПроцедурыИФункции

Процедура ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия)
Процедура ВызватьОбработкуСобытий(События, ОписаниеСобытия)

Для ы = 0 По События.ВГраница() Цикл
ИмяСобытия = События[ы];
ПропуститьОбработчикТестовогоМодуля => 0 И ОбработчикСобытияПереопределен(ИмяСобытия));
Если ПропуститьОбработчикТестовогоМодуля Тогда

Параметры = ЮТОбщий.ЗначениеВМассиве(ОписаниеСобытия);
Ошибки = ВызватьОбработчикРасширения(ИмяСобытия, Параметры);
ЗарегистрироватьОшибкиСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибки);

Иначе

ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия);

КонецЕсли;
КонецЦикла;

ЭтоСобытиеПеред = СтрНачинаетсяС(ИмяСобытия, "Перед");
КонецПроцедуры

Процедура ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия)

Параметры = ЮТОбщий.ЗначениеВМассиве(ОписаниеСобытия);

Если ЭтоСобытиеПеред Тогда
Если ЭтоСобытиеПеред(ИмяСобытия) Тогда
Ошибки = ВызватьОбработчикРасширения(ИмяСобытия, Параметры);
ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия);
Иначе
ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия);
Ошибки = ВызватьОбработчикРасширения(ИмяСобытия, Параметры);
КонецЕсли;

Для Каждого Ошибка Из Ошибки Цикл
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибка);
КонецЦикла;
ЗарегистрироватьОшибкиСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибки);

КонецПроцедуры

Expand All @@ -247,10 +261,10 @@
Если ЮТОбщий.МетодМодуляСуществует(ИмяМодуля, ИмяСобытия) Тогда
ПолноеИмяМетода = СтрШаблон("%1.%2", ИмяМодуля, ИмяСобытия);
Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода, ПараметрыСобытия);
КонецЕсли;

Если Ошибка <> Неопределено Тогда
Ошибки.Добавить(Ошибка);
Если Ошибка <> Неопределено Тогда
Ошибки.Добавить(Ошибка);
КонецЕсли;
КонецЕсли;

КонецЦикла;
Expand All @@ -265,21 +279,78 @@
// ИмяСобытия - Строка - Имя вызываемого метода обработки события
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
//
Процедура ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия)
Процедура ВызватьОбработчикТестовогоМодуля(Знач ИмяСобытия, ОписаниеСобытия)

ОбработчикСобытияПереопределен = ОбработчикСобытияПереопределен(ИмяСобытия);
Если ОбработчикСобытияПереопределен Тогда
ИмяСобытия = ПереопределенноеИмяСобытия(ИмяСобытия);
КонецЕсли;

ИмяМодуля = ОписаниеСобытия.Модуль.МетаданныеМодуля.Имя;
Ошибка = Неопределено;

ЧастиКоманды = СтрРазделить(ИмяСобытия, ".");
Если ЧастиКоманды.Количество() = 2 Тогда
ИмяМодуля = ЧастиКоманды[0];
ИмяСобытия = ЧастиКоманды[1];
КонецЕсли;

Ошибки = Новый Массив();
Команда = СтрШаблон("%1.%2()", ИмяМодуля, ИмяСобытия);
Если ЮТОбщий.МетодМодуляСуществует(ИмяМодуля, ИмяСобытия) Тогда

Команда = СтрШаблон("%1.%2()", ИмяМодуля, ИмяСобытия);
Ошибка = ЮТОбщий.ВыполнитьМетод(Команда);

Если Ошибка <> Неопределено Тогда
Ошибки.Добавить(Ошибка);
КонецЕсли;

ИначеЕсли ОбработчикСобытияПереопределен Тогда

ТекстИсключения = СтрШаблон("Не найден обработчик тестового модуля %1", Команда);
ВызватьИсключение ТекстИсключения

КонецЕсли;

Если Ошибка <> Неопределено Тогда
ЗарегистрироватьОшибкиСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибки);

КонецПроцедуры

Процедура ЗарегистрироватьОшибкиСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибки)

Для Каждого Ошибка Из Ошибки Цикл
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибка);
КонецЕсли;
КонецЦикла;

КонецПроцедуры

Функция ОбработчикСобытияПереопределен(ИмяСобытия)

Возврат ЗначениеЗаполнено(ПереопределенноеИмяСобытия(ИмяСобытия));

КонецФункции

Функция ПереопределенноеИмяСобытия(ИмяСобытия)

Если ЭтоСобытиеПеред(ИмяСобытия) Тогда
Возврат ЮТНастройкиВыполнения.Перед();
ИначеЕсли ЭтоСобытиеПосле(ИмяСобытия) Тогда
Возврат ЮТНастройкиВыполнения.После();
Иначе
Возврат "";
КонецЕсли;

КонецФункции

Функция ЭтоСобытиеПеред(ИмяСобытия)

Возврат СтрНачинаетсяС(ИмяСобытия, "Перед");

КонецФункции

Функция ЭтоСобытиеПосле(ИмяСобытия)

Возврат СтрНачинаетсяС(ИмяСобытия, "После");

КонецФункции

#КонецОбласти
30 changes: 30 additions & 0 deletions exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,36 @@

КонецФункции

// Устанавливает настройку переопределения обработчика события Перед...
//
// Параметры:
// ВыполнитьПеред - Строка - Имя обработчика события, который будет выполнен вместо основного
//
// Возвращаемое значение:
// ОбщийМодуль - Этот же модуль, для замыкания
Функция Перед(ВыполнитьПеред = "") Экспорт

НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().Перед, ВыполнитьПеред);

Возврат ЮТТесты;

КонецФункции

// Устанавливает настройку переопределения обработчика события После...
//
// Параметры:
// ВыполнитьПосле - Строка - Имя обработчика события, который будет выполнен вместо основного
//
// Возвращаемое значение:
// ОбщийМодуль - Этот же модуль, для замыкания
Функция После(ВыполнитьПосле = "") Экспорт

НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().После, ВыполнитьПосле);

Возврат ЮТТесты;

КонецФункции

// Устанавливает параметры вызова теста.
//
// * Если метод вызывается первый раз, то он устанавливает параметры теста.
Expand Down
Loading

0 comments on commit 68df8ed

Please sign in to comment.