1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-03-17 20:48:01 +02:00

Переопределение контекста встроено в движок

This commit is contained in:
Potoyalo 2023-07-29 23:45:16 +07:00
parent b7af862cb3
commit e991d5e0de
10 changed files with 169 additions and 119 deletions

View File

@ -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");
```

View File

@ -34,23 +34,52 @@
КонецФункции
Функция ЗначениеНастройкиТеста(ИмяНастройки, ЗначениеПоУмолчанию) Экспорт
Функция Перед() Экспорт
ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().Перед;
Возврат ЗначениеНастройкиТеста(ИмяПараметра, "", Истина);
КонецФункции
Функция После() Экспорт
ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().После;
Возврат ЗначениеНастройкиТеста(ИмяПараметра, "", Истина);
КонецФункции
Функция ЗначениеНастройкиТеста(ИмяНастройки, ЗначениеПоУмолчанию, СтрогийУровеньИсполнения = Ложь) Экспорт
Значение = ЗначениеПоУмолчанию;
Уровни = ЮТФабрика.УровниИсполнения();
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
Если КонтекстИсполнения.Тест <> Неопределено И КонтекстИсполнения.Тест.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = КонтекстИсполнения.Тест.НастройкиВыполнения[ИмяНастройки];
Если СтрогийУровеньИсполнения И КонтекстИсполнения.Уровень = Уровни.Тест Тогда
Возврат Значение;
КонецЕсли;
ИначеЕсли КонтекстИсполнения.Набор <> Неопределено И КонтекстИсполнения.Набор.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = КонтекстИсполнения.Набор.НастройкиВыполнения[ИмяНастройки];
Если СтрогийУровеньИсполнения И КонтекстИсполнения.Уровень = Уровни.НаборТестов Тогда
Возврат Значение;
КонецЕсли;
ИначеЕсли КонтекстИсполнения.Модуль <> Неопределено И КонтекстИсполнения.Модуль.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = КонтекстИсполнения.Модуль.НастройкиВыполнения[ИмяНастройки];
Если СтрогийУровеньИсполнения И КонтекстИсполнения.Уровень = Уровни.Модуль Тогда
Возврат Значение;
КонецЕсли;
Иначе
ГлобальныеНастройки = ЮТКонтекст.ГлобальныеНастройкиВыполнения();

View File

@ -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", ИмяМодуля, ИмяМетода));
КонецЕсли;
КонецПроцедуры
#КонецОбласти

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="cafd6c6f-0bea-45d6-896a-17fd6d96cc8f">
<name>ЮТПереопределениеКонтекста</name>
<synonym>
<key>ru</key>
<value>Переопределение контекста</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -90,8 +90,7 @@
КонецЕсли;
#КонецЕсли
ВызватьОбработкуСобытия("ПередКаждымТестом", ОписаниеСобытия);
ВызватьОбработкуСобытия("ПередТестом", ОписаниеСобытия);
ВызватьОбработкуСобытий(ЮТОбщий.ЗначениеВМассиве("ПередКаждымТестом", "ПередТестом"), ОписаниеСобытия);
КонецПроцедуры
@ -105,8 +104,7 @@
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор, Тест);
ВызватьОбработкуСобытия("ПослеТеста", ОписаниеСобытия);
ВызватьОбработкуСобытия("ПослеКаждогоТеста", ОписаниеСобытия);
ВызватьОбработкуСобытий(ЮТОбщий.ЗначениеВМассиве("ПослеТеста", "ПослеКаждогоТеста"), ОписаниеСобытия);
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Если ЮТНастройкиВыполнения.ВТранзакции() Тогда
@ -218,13 +216,22 @@
#Область СлужебныеПроцедурыИФункции
Процедура ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия)
Процедура ВызватьОбработкуСобытий(События, ОписаниеСобытия)
ЭтоСобытиеПеред = СтрНачинаетсяС(ИмяСобытия, "Перед");
Для каждого ИмяСобытия Из События Цикл
ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия);
Если ОбработчикСобытияПереопределен(ИмяСобытия) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия)
Параметры = ЮТОбщий.ЗначениеВМассиве(ОписаниеСобытия);
Если ЭтоСобытиеПеред Тогда
Если ЭтоСобытиеПеред(ИмяСобытия) Тогда
Ошибки = ВызватьОбработчикРасширения(ИмяСобытия, Параметры);
ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия);
Иначе
@ -265,7 +272,12 @@
// ИмяСобытия - Строка - Имя вызываемого метода обработки события
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
//
Процедура ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия)
Процедура ВызватьОбработчикТестовогоМодуля(Знач ИмяСобытия, ОписаниеСобытия)
НовоеИмяСобытия = ПереопределенноеИмяСобытия(ИмяСобытия);
Если ЗначениеЗаполнено(НовоеИмяСобытия) Тогда
ИмяСобытия = НовоеИмяСобытия;
КонецЕсли;
ИмяМодуля = ОписаниеСобытия.Модуль.МетаданныеМодуля.Имя;
Ошибка = Неопределено;
@ -282,4 +294,26 @@
КонецПроцедуры
Функция ОбработчикСобытияПереопределен(ИмяСобытия)
Возврат ЗначениеЗаполнено(ПереопределенноеИмяСобытия(ИмяСобытия));
КонецФункции
Функция ПереопределенноеИмяСобытия(ИмяСобытия)
Если ЭтоСобытиеПеред(ИмяСобытия) Тогда
Возврат ЮТНастройкиВыполнения.Перед();
Иначе
Возврат ЮТНастройкиВыполнения.После();
КонецЕсли;
КонецФункции
Функция ЭтоСобытиеПеред(ИмяСобытия)
Возврат СтрНачинаетсяС(ИмяСобытия, "Перед");
КонецФункции
#КонецОбласти

View File

@ -184,6 +184,36 @@
КонецФункции
// Устанавливает настройку переопределения обработчика события Перед...
//
// Параметры:
// ВыполнитьПеред - Строка - Имя обработчика события, который будет выполнен вместо основного
//
// Возвращаемое значение:
// ОбщийМодуль - Этот же модуль, для замыкания
Функция Перед(ВыполнитьПеред = "") Экспорт
НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().Перед, ВыполнитьПеред);
Возврат ЮТТесты;
КонецФункции
// Устанавливает настройку переопределения обработчика события После...
//
// Параметры:
// ВыполнитьПосле - Строка - Имя обработчика события, который будет выполнен вместо основного
//
// Возвращаемое значение:
// ОбщийМодуль - Этот же модуль, для замыкания
Функция После(ВыполнитьПосле = "") Экспорт
НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().После, ВыполнитьПосле);
Возврат ЮТТесты;
КонецФункции
// Устанавливает параметры вызова теста.
//
// * Если метод вызывается первый раз, то он устанавливает параметры теста.

View File

@ -64,12 +64,16 @@
// Возвращаемое значение:
// ФиксированнаяСтруктура - Параметры исполнения теста:
// * ВТранзакции - Строка - Тест должен выполняться в транзакции
// * УдалениеТестовыхДанных - Строка - Тест должен удалить созданные тестовые данные
// * УдалениеТестовыхДанных - Строка - Тест должен удалить созданные тестовые данные
// * Перед - Строка - Перед тестом должен выполниться указанный обработчик события вместо основного
// * После - Строка - После теста должен выполниться указанный обработчик события вместо основного
Функция ПараметрыИсполненияТеста() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("ВТранзакции", "ВТранзакции");
Параметры.Вставить("УдалениеТестовыхДанных", "УдалениеТестовыхДанных");
Параметры.Вставить("Перед", "Перед");
Параметры.Вставить("После", "После");
Возврат Новый ФиксированнаяСтруктура(Параметры);

View File

@ -73,7 +73,6 @@
<commonModules>CommonModule.ЮТОтчетJSON</commonModules>
<commonModules>CommonModule.ЮТОтчетJUnit</commonModules>
<commonModules>CommonModule.ЮТПараметрыЗапуска</commonModules>
<commonModules>CommonModule.ЮТПереопределениеКонтекста</commonModules>
<commonModules>CommonModule.ЮТПовторногоИспользования</commonModules>
<commonModules>CommonModule.ЮТПодражатель</commonModules>
<commonModules>CommonModule.ЮТПодражатель_Банки</commonModules>

View File

@ -11,6 +11,5 @@
<content>CommonModule.ЮТЛогирование</content>
<content>CommonModule.ЮТТестовыеДанныеСлужебный</content>
<content>CommonModule.ЮТУтверждения</content>
<content>CommonModule.ЮТПереопределениеКонтекста</content>
<parentSubsystem>Subsystem.ЮТФункциональность</parentSubsystem>
</mdclass:Subsystem>

View File

@ -21,8 +21,13 @@
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("Пропустить")
.ДобавитьТест("ПроверкаКонтекста")
.ДобавитьТестовыйНабор("ОсновнойНабор")
.ДобавитьТест("Пропустить")
.ДобавитьТест("ПроверкаКонтекста")
.ДобавитьТестовыйНабор("ПереопределенныйНабор").Перед("Перед_ПереопределенныйНабор")
.ДобавитьТест("ПроверкаПереопределенногоКонтекста").Перед("Перед_ПроверкаПереопределенногоКонтекста")
.ДобавитьТестовыйНабор("ПовторнаяПроверкаКонтекста")
.ДобавитьТест("ПроверкаКонтекста")
;
КонецПроцедуры
@ -66,7 +71,7 @@
Процедура ПослеВсехТестов() Экспорт
ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеВсехТестов");
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция")).ИмеетДлину(8);
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция")).ИмеетДлину(16);
КонецПроцедуры
@ -88,8 +93,46 @@
.Содержит("ПередВсемиТестами")
.Содержит("ПередТестовымНабором")
.Содержит("ПередКаждымТестом");
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("КоллекцияПереопределенногоНабора")).Равно(Неопределено);
КонецПроцедуры
Процедура Перед_ПереопределенныйНабор() Экспорт
ЮТест.Контекст().УстановитьЗначение("Набор", -2);
ЮТест.Контекст().Значение("Коллекция").Добавить("Перед_ПереопределенныйНабор");
ЮТест.Контекст().УстановитьЗначение("КоллекцияПереопределенногоНабора", Новый Массив());
ЮТест.Контекст().Значение("КоллекцияПереопределенногоНабора").Добавить("Перед_ПереопределенныйНабор");
КонецПроцедуры
Процедура Перед_ПроверкаПереопределенногоКонтекста() Экспорт
ЮТест.Контекст().УстановитьЗначение("Тест", -3);
ЮТест.Контекст().УстановитьЗначение("Заменяемый", -3);
ЮТест.Контекст().Значение("Коллекция").Добавить("Перед_ПроверкаПереопределенногоКонтекста");
ЮТест.Контекст().Значение("КоллекцияПереопределенногоНабора").Добавить("Перед_ПроверкаПереопределенногоКонтекста");
КонецПроцедуры
Процедура ПроверкаПереопределенногоКонтекста() Экспорт
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Глобальный"), "Значение глобального контекста").Равно(1);
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Набор"), "Значение контекста набора").Равно(-2);
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Тест"), "Значение контекста теста").Равно(-3);
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Заменяемый"), "Замененное значение контекста").Равно(-3);
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция"))
.ИмеетДлинуБольше(4)
.Содержит("ПередВсемиТестами")
.Содержит("ПередТестовымНабором")
.Содержит("Перед_ПереопределенныйНабор")
.Содержит("ПередКаждымТестом")
.Содержит("Перед_ПроверкаПереопределенногоКонтекста");
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("КоллекцияПереопределенногоНабора"))
.ИмеетДлинуБольше(1)
.Содержит("Перед_ПереопределенныйНабор")
.Содержит("Перед_ПроверкаПереопределенногоКонтекста");
КонецПроцедуры
#КонецОбласти