diff --git a/documentation/docs/user-api/context.md b/documentation/docs/user-api/context.md
index 259ea235..46a2e8a0 100644
--- a/documentation/docs/user-api/context.md
+++ b/documentation/docs/user-api/context.md
@@ -4,21 +4,25 @@ tags: [Начало, Контекст]
# Контекст
+## Механизм контекстов
+
Одним из важнейших блоков работы тестового движка является механизм контекстов.
Он позволяет:
-1. Хранить промежуточные данные и обеспечивать работу механизма текучих выражений
-2. Передавать между тестами необходимые данные
-3. Удалять тестовые данные
+1. Хранить промежуточные данные и обеспечивать работу механизма текучих выражений.
+2. Передавать между тестами необходимые данные.
+3. Удалять тестовые данные.
И имеет несколько ограничений:
-1. Не синхронизируется между клиентом и сервером
-2. Тестовые контексты имеют ограниченное время жизни, например, контекст теста "живет" только в рамках теста и событиях "ПередКаждымТестом", "ПослеКаждогоТеста".
+1. Не синхронизируется между клиентом и сервером.
+2. Тестовые контексты имеют ограниченное время жизни. Например, контекст теста "живет" только в рамках теста и событиях "ПередКаждымТестом", "ПослеКаждогоТеста".
Для различных механизмов движка существуют различные контексты, такие как контекст утверждений, контекст теста и тд.
+## Контексты тестового модуля
+
Разработчику тестов будут интересны следующие контексты:
* Контекст теста (`ЮТест.КонтекстТеста`) - живет в рамках одного теста. Доступен в каждом тесте и в обработчиках событий
@@ -37,24 +41,12 @@ tags: [Начало, Контекст]
* `ПередКаждымТестом`
* `ПослеКаждогоТеста`
-Для тестовых наборов есть возможность определить отдельный контекст, доступный в конкретном наборе. Для этого надо переопределить события тестового набора через настройки "ПередТестовымНабором" и "ПослеТестовогоНабора" соответственно. В текущей реализации такой отдельный контекст набора не заменяет общий, а дополняет его. Пример:
+На каждом уровне исполнения есть возможность переопределить обработчики событий соответствующего контекста исполнения при помощи методов `Перед()` и `После()`. Настроенный обработчик события будет вызван _вместо_ основного. Пример:
```bsl
-Процедура ИсполняемыеСценарии() Экспорт
- ЮТТесты
- .ДобавитьТестовыйНабор("Набор1")
- .ДобавитьТест("Тест1")
- .ДобавитьТестовыйНабор("Набор2")
- .НастройкаИсполнения("ПередТестовымНабором", "ПередТестовымНабором_Набор2")
- .НастройкаИсполнения("ПослеТестовогоНабора", "ПослеТестовогоНабора_Набор2")
- .ДобавитьТест("Тест2");
-КонецПроцедуры
-
-Процедура ПередТестовымНабором() Экспорт
- ЮТест.Контекст().УстановитьЗначение("...", ...); // Будет доступен в тестах каждого набора
-КонецПроцедуры
-
-Процедура ПередТестовымНабором_Набор2() Экспорт
- ЮТест.Контекст().УстановитьЗначение("...", ...); // Будет доступен только в тестах второго набора
-КонецПроцедуры
+ЮТТесты
+ .ДобавитьТестовыйНабор("Набор1") // Будет вызван основной обработчик ПередТестовымНабором()
+ .ДобавитьТест("Тест1")
+ .ДобавитьТестовыйНабор("Набор2").Перед("Перед_Набор2") // Будет вызван обработчик Перед_Набор2()
+ .ДобавитьТест("Тест2");
```
diff --git a/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl
index 6a84a3be..9aa7fa33 100644
--- a/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl
@@ -34,23 +34,52 @@
КонецФункции
-Функция ЗначениеНастройкиТеста(ИмяНастройки, ЗначениеПоУмолчанию) Экспорт
+Функция Перед() Экспорт
+
+ ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().Перед;
+
+ Возврат ЗначениеНастройкиТеста(ИмяПараметра, "", Истина);
+
+КонецФункции
+
+Функция После() Экспорт
+
+ ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().После;
+
+ Возврат ЗначениеНастройкиТеста(ИмяПараметра, "", Истина);
+
+КонецФункции
+
+Функция ЗначениеНастройкиТеста(ИмяНастройки, ЗначениеПоУмолчанию, СтрогийУровеньИсполнения = Ложь) Экспорт
Значение = ЗначениеПоУмолчанию;
+ Уровни = ЮТФабрика.УровниИсполнения();
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
Если КонтекстИсполнения.Тест <> Неопределено И КонтекстИсполнения.Тест.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = КонтекстИсполнения.Тест.НастройкиВыполнения[ИмяНастройки];
+ Если СтрогийУровеньИсполнения И КонтекстИсполнения.Уровень = Уровни.Тест Тогда
+ Возврат Значение;
+ КонецЕсли;
+
ИначеЕсли КонтекстИсполнения.Набор <> Неопределено И КонтекстИсполнения.Набор.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = КонтекстИсполнения.Набор.НастройкиВыполнения[ИмяНастройки];
+ Если СтрогийУровеньИсполнения И КонтекстИсполнения.Уровень = Уровни.НаборТестов Тогда
+ Возврат Значение;
+ КонецЕсли;
+
ИначеЕсли КонтекстИсполнения.Модуль <> Неопределено И КонтекстИсполнения.Модуль.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = КонтекстИсполнения.Модуль.НастройкиВыполнения[ИмяНастройки];
+ Если СтрогийУровеньИсполнения И КонтекстИсполнения.Уровень = Уровни.Модуль Тогда
+ Возврат Значение;
+ КонецЕсли;
+
Иначе
ГлобальныеНастройки = ЮТКонтекст.ГлобальныеНастройкиВыполнения();
diff --git a/exts/yaxunit/src/CommonModules/ЮТПереопределениеКонтекста/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТПереопределениеКонтекста/Module.bsl
deleted file mode 100644
index 6fab9c2c..00000000
--- a/exts/yaxunit/src/CommonModules/ЮТПереопределениеКонтекста/Module.bsl
+++ /dev/null
@@ -1,69 +0,0 @@
-//©///////////////////////////////////////////////////////////////////////////©//
-//
-// Copyright 2021-2023 BIA-Technologies Limited Liability Company
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-//©///////////////////////////////////////////////////////////////////////////©//
-
-// @strict-types
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-#Область ОбработчикиСобытий
-
-// Обработчик события "ПередТестовымНабором"
-//
-// Параметры:
-// ОписаниеСобытия - См. ЮТФабрика.ОписаниеСобытияИсполненияТестов
-//
-Процедура ПередТестовымНабором(ОписаниеСобытия) Экспорт
-
- ВызватьОбработчик(ОписаниеСобытия, "ПередТестовымНабором");
-
-КонецПроцедуры
-
-// Обработчик события "ПослеТестовогоНабора"
-//
-// Параметры:
-// ОписаниеСобытия - См. ЮТФабрика.ОписаниеСобытияИсполненияТестов
-//
-Процедура ПослеТестовогоНабора(ОписаниеСобытия) Экспорт
-
- ВызватьОбработчик(ОписаниеСобытия, "ПослеТестовогоНабора");
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-// Вызывает настроенный обработчик события
-//
-// Параметры:
-// ОписаниеСобытия - См. ЮТФабрика.ОписаниеСобытияИсполненияТестов
-// ИмяНастройки - Строка
-//
-Процедура ВызватьОбработчик(ОписаниеСобытия, ИмяНастройки)
-
- ИмяМодуля = ОписаниеСобытия.Модуль.МетаданныеМодуля.Имя;
- ИмяМетода = ЮТНастройкиВыполнения.ЗначениеНастройкиТеста(ИмяНастройки, "");
- Если ЗначениеЗаполнено(ИмяМетода) Тогда
- ЮТОбщий.ВыполнитьМетод(СтрШаблон("%1.%2", ИмяМодуля, ИмяМетода));
- КонецЕсли;
-
-КонецПроцедуры
-
-#КонецОбласти
diff --git a/exts/yaxunit/src/CommonModules/ЮТПереопределениеКонтекста/ЮТПереопределениеКонтекста.mdo b/exts/yaxunit/src/CommonModules/ЮТПереопределениеКонтекста/ЮТПереопределениеКонтекста.mdo
deleted file mode 100644
index 42925372..00000000
--- a/exts/yaxunit/src/CommonModules/ЮТПереопределениеКонтекста/ЮТПереопределениеКонтекста.mdo
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
- ЮТПереопределениеКонтекста
-
- ru
- Переопределение контекста
-
- true
- true
- true
-
diff --git a/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl
index de447c8b..a7378a9d 100644
--- a/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl
@@ -90,8 +90,7 @@
КонецЕсли;
#КонецЕсли
- ВызватьОбработкуСобытия("ПередКаждымТестом", ОписаниеСобытия);
- ВызватьОбработкуСобытия("ПередТестом", ОписаниеСобытия);
+ ВызватьОбработкуСобытий(ЮТОбщий.ЗначениеВМассиве("ПередКаждымТестом", "ПередТестом"), ОписаниеСобытия);
КонецПроцедуры
@@ -105,8 +104,7 @@
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор, Тест);
- ВызватьОбработкуСобытия("ПослеТеста", ОписаниеСобытия);
- ВызватьОбработкуСобытия("ПослеКаждогоТеста", ОписаниеСобытия);
+ ВызватьОбработкуСобытий(ЮТОбщий.ЗначениеВМассиве("ПослеТеста", "ПослеКаждогоТеста"), ОписаниеСобытия);
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Если ЮТНастройкиВыполнения.ВТранзакции() Тогда
@@ -218,13 +216,22 @@
#Область СлужебныеПроцедурыИФункции
-Процедура ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия)
+Процедура ВызватьОбработкуСобытий(События, ОписаниеСобытия)
- ЭтоСобытиеПеред = СтрНачинаетсяС(ИмяСобытия, "Перед");
+ Для каждого ИмяСобытия Из События Цикл
+ ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия);
+ Если ОбработчикСобытияПереопределен(ИмяСобытия) Тогда
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия)
Параметры = ЮТОбщий.ЗначениеВМассиве(ОписаниеСобытия);
- Если ЭтоСобытиеПеред Тогда
+ Если ЭтоСобытиеПеред(ИмяСобытия) Тогда
Ошибки = ВызватьОбработчикРасширения(ИмяСобытия, Параметры);
ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия);
Иначе
@@ -265,7 +272,12 @@
// ИмяСобытия - Строка - Имя вызываемого метода обработки события
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
//
-Процедура ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия)
+Процедура ВызватьОбработчикТестовогоМодуля(Знач ИмяСобытия, ОписаниеСобытия)
+
+ НовоеИмяСобытия = ПереопределенноеИмяСобытия(ИмяСобытия);
+ Если ЗначениеЗаполнено(НовоеИмяСобытия) Тогда
+ ИмяСобытия = НовоеИмяСобытия;
+ КонецЕсли;
ИмяМодуля = ОписаниеСобытия.Модуль.МетаданныеМодуля.Имя;
Ошибка = Неопределено;
@@ -282,4 +294,26 @@
КонецПроцедуры
+Функция ОбработчикСобытияПереопределен(ИмяСобытия)
+
+ Возврат ЗначениеЗаполнено(ПереопределенноеИмяСобытия(ИмяСобытия));
+
+КонецФункции
+
+Функция ПереопределенноеИмяСобытия(ИмяСобытия)
+
+ Если ЭтоСобытиеПеред(ИмяСобытия) Тогда
+ Возврат ЮТНастройкиВыполнения.Перед();
+ Иначе
+ Возврат ЮТНастройкиВыполнения.После();
+ КонецЕсли;
+
+КонецФункции
+
+Функция ЭтоСобытиеПеред(ИмяСобытия)
+
+ Возврат СтрНачинаетсяС(ИмяСобытия, "Перед");
+
+КонецФункции
+
#КонецОбласти
diff --git a/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl
index a608db4e..66ce2a36 100644
--- a/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl
@@ -184,6 +184,36 @@
КонецФункции
+// Устанавливает настройку переопределения обработчика события Перед...
+//
+// Параметры:
+// ВыполнитьПеред - Строка - Имя обработчика события, который будет выполнен вместо основного
+//
+// Возвращаемое значение:
+// ОбщийМодуль - Этот же модуль, для замыкания
+Функция Перед(ВыполнитьПеред = "") Экспорт
+
+ НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().Перед, ВыполнитьПеред);
+
+ Возврат ЮТТесты;
+
+КонецФункции
+
+// Устанавливает настройку переопределения обработчика события После...
+//
+// Параметры:
+// ВыполнитьПосле - Строка - Имя обработчика события, который будет выполнен вместо основного
+//
+// Возвращаемое значение:
+// ОбщийМодуль - Этот же модуль, для замыкания
+Функция После(ВыполнитьПосле = "") Экспорт
+
+ НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().После, ВыполнитьПосле);
+
+ Возврат ЮТТесты;
+
+КонецФункции
+
// Устанавливает параметры вызова теста.
//
// * Если метод вызывается первый раз, то он устанавливает параметры теста.
diff --git a/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl
index 8b329393..c577469c 100644
--- a/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl
@@ -64,12 +64,16 @@
// Возвращаемое значение:
// ФиксированнаяСтруктура - Параметры исполнения теста:
// * ВТранзакции - Строка - Тест должен выполняться в транзакции
-// * УдалениеТестовыхДанных - Строка - Тест должен удалить созданные тестовые данные
+// * УдалениеТестовыхДанных - Строка - Тест должен удалить созданные тестовые данные
+// * Перед - Строка - Перед тестом должен выполниться указанный обработчик события вместо основного
+// * После - Строка - После теста должен выполниться указанный обработчик события вместо основного
Функция ПараметрыИсполненияТеста() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("ВТранзакции", "ВТранзакции");
Параметры.Вставить("УдалениеТестовыхДанных", "УдалениеТестовыхДанных");
+ Параметры.Вставить("Перед", "Перед");
+ Параметры.Вставить("После", "После");
Возврат Новый ФиксированнаяСтруктура(Параметры);
diff --git a/exts/yaxunit/src/Configuration/Configuration.mdo b/exts/yaxunit/src/Configuration/Configuration.mdo
index 7d309b0c..69ee50da 100644
--- a/exts/yaxunit/src/Configuration/Configuration.mdo
+++ b/exts/yaxunit/src/Configuration/Configuration.mdo
@@ -73,7 +73,6 @@
CommonModule.ЮТОтчетJSON
CommonModule.ЮТОтчетJUnit
CommonModule.ЮТПараметрыЗапуска
- CommonModule.ЮТПереопределениеКонтекста
CommonModule.ЮТПовторногоИспользования
CommonModule.ЮТПодражатель
CommonModule.ЮТПодражатель_Банки
diff --git a/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo b/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo
index f25e67e1..0e0a76b6 100644
--- a/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo
+++ b/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo
@@ -11,6 +11,5 @@
CommonModule.ЮТЛогирование
CommonModule.ЮТТестовыеДанныеСлужебный
CommonModule.ЮТУтверждения
- CommonModule.ЮТПереопределениеКонтекста
Subsystem.ЮТФункциональность
diff --git a/tests/src/CommonModules/ОМ_ЮТест/Module.bsl b/tests/src/CommonModules/ОМ_ЮТест/Module.bsl
index 3b326cd4..205b96ba 100644
--- a/tests/src/CommonModules/ОМ_ЮТест/Module.bsl
+++ b/tests/src/CommonModules/ОМ_ЮТест/Module.bsl
@@ -21,8 +21,13 @@
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
- .ДобавитьТест("Пропустить")
- .ДобавитьТест("ПроверкаКонтекста")
+ .ДобавитьТестовыйНабор("ОсновнойНабор")
+ .ДобавитьТест("Пропустить")
+ .ДобавитьТест("ПроверкаКонтекста")
+ .ДобавитьТестовыйНабор("ПереопределенныйНабор").Перед("Перед_ПереопределенныйНабор")
+ .ДобавитьТест("ПроверкаПереопределенногоКонтекста").Перед("Перед_ПроверкаПереопределенногоКонтекста")
+ .ДобавитьТестовыйНабор("ПовторнаяПроверкаКонтекста")
+ .ДобавитьТест("ПроверкаКонтекста")
;
КонецПроцедуры
@@ -66,7 +71,7 @@
Процедура ПослеВсехТестов() Экспорт
ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеВсехТестов");
- ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция")).ИмеетДлину(8);
+ ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция")).ИмеетДлину(16);
КонецПроцедуры
@@ -88,8 +93,46 @@
.Содержит("ПередВсемиТестами")
.Содержит("ПередТестовымНабором")
.Содержит("ПередКаждымТестом");
+ ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("КоллекцияПереопределенногоНабора")).Равно(Неопределено);
+
+КонецПроцедуры
+Процедура Перед_ПереопределенныйНабор() Экспорт
+
+ ЮТест.Контекст().УстановитьЗначение("Набор", -2);
+ ЮТест.Контекст().Значение("Коллекция").Добавить("Перед_ПереопределенныйНабор");
+ ЮТест.Контекст().УстановитьЗначение("КоллекцияПереопределенногоНабора", Новый Массив());
+ ЮТест.Контекст().Значение("КоллекцияПереопределенногоНабора").Добавить("Перед_ПереопределенныйНабор");
+
+КонецПроцедуры
+
+Процедура Перед_ПроверкаПереопределенногоКонтекста() Экспорт
+
+ ЮТест.Контекст().УстановитьЗначение("Тест", -3);
+ ЮТест.Контекст().УстановитьЗначение("Заменяемый", -3);
+ ЮТест.Контекст().Значение("Коллекция").Добавить("Перед_ПроверкаПереопределенногоКонтекста");
+ ЮТест.Контекст().Значение("КоллекцияПереопределенногоНабора").Добавить("Перед_ПроверкаПереопределенногоКонтекста");
+
+КонецПроцедуры
+
+Процедура ПроверкаПереопределенногоКонтекста() Экспорт
+
+ ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Глобальный"), "Значение глобального контекста").Равно(1);
+ ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Набор"), "Значение контекста набора").Равно(-2);
+ ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Тест"), "Значение контекста теста").Равно(-3);
+ ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Заменяемый"), "Замененное значение контекста").Равно(-3);
+ ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция"))
+ .ИмеетДлинуБольше(4)
+ .Содержит("ПередВсемиТестами")
+ .Содержит("ПередТестовымНабором")
+ .Содержит("Перед_ПереопределенныйНабор")
+ .Содержит("ПередКаждымТестом")
+ .Содержит("Перед_ПроверкаПереопределенногоКонтекста");
+ ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("КоллекцияПереопределенногоНабора"))
+ .ИмеетДлинуБольше(1)
+ .Содержит("Перед_ПереопределенныйНабор")
+ .Содержит("Перед_ПроверкаПереопределенногоКонтекста");
+
КонецПроцедуры
#КонецОбласти
-