diff --git a/documentation/docs/user-api/test-data/test-data-deletion.md b/documentation/docs/user-api/test-data/test-data-deletion.md new file mode 100644 index 00000000..27bf3f94 --- /dev/null +++ b/documentation/docs/user-api/test-data/test-data-deletion.md @@ -0,0 +1,96 @@ +--- +tags: [Getting started, Test data] +--- + +# Удаление тестовых данных + +При использовании тестовых данных нередко необходимо удалять созданные объекты. + +Для этого вы можете использовать + +## Автоматические транзакции + +Для включения нужно при регистрации теста вызвать метод `ВТранзакции()` + +```bsl title=ВТранзакции.bsl +ЮТТесты + .ДобавитьТест("Фикция").ВТранзакции() // Использование транзакции для конкретного теста + +ЮТТесты + .ДобавитьТестовыйНабор("Основной).ВТранзакции() // Использование транзакции для набора тестов + .ДобавитьТест("Фикция") + +ЮТТесты.ВТранзакции() // Использование транзакции для тестов модуля + .ДобавитьТест("Фикция") + +``` + +И тогда тестовый движок будет оборачивать в транзакцию каждый серверный тест (для клиентских будет игнорироваться) + +:::caution Учитывайте +В транзакцию оборачивается тест, а не модуль или набор, поэтому данные созданные вне теста не будут удалены. +Такие данные необходимо удалять самостоятельно при необходимости. +::: + +## Механизма удаления тестовых данных + +Для включения нужно при регистрации теста вызвать метод `УдалениеТестовыхДанных()` + +```bsl title=УдалениеТестовыхДанных.bsl +ЮТТесты + .ДобавитьТест("Фикция").УдалениеТестовыхДанных() // Использование для конкретного теста + +ЮТТесты + .ДобавитьТестовыйНабор("Основной).УдалениеТестовыхДанных() // Использование для всех тестов набора + .ДобавитьТест("Фикция") + +ЮТТесты.УдалениеТестовыхДанных() // Использование для всех тестов модуля + .ДобавитьТест("Фикция") + +ЮТТесты.ВТранзакции().УдалениеТестовыхДанных() // Совместно с транзакцией + .ДобавитьТест("Фикция") + +``` + +Механизм не используется транзакции, а запоминает в контексте все созданные с помощью API объекты и записи регистров сведений. +Позволяет: + +* Удалять данные созданные с клиента +* Удалять данные созданные вне теста (в обработчиках событий) + +:::tip +Механизм понимает в рамках какого контекста исполнения (тест, набор, модуль) были созданы данные и удаляет их по выходу из него. +::: + +Рассмотрим время жизни объектов созданных на разных этапах тестирования, например имеем такой модуль. + +```bsl title=УдалениеТестовыхДанныхВремяЖизни.bsl +Процедура ПередВсемиТестами() Экспорт + ДанныеМодуля = ЮТест.Данные().СоздатьЭлемент(); // Не будет удалена +КонецПроцедуры + +Процедура ПередТестовымНабором() Экспорт + ДанныеНабора = ЮТест.Данные().СоздатьЭлемент(); +КонецПроцедуры + +Процедура ПослеВсехТестов() Экспорт + ДанныеТеста = ЮТест.Данные().СоздатьЭлемент(); +КонецПроцедуры + +Процедура Тест() Экспорт + Ссылка = ЮТест.Данные().СоздатьЭлемент(); +КонецПроцедуры +``` + +Для переменных получим разное время жизни + +* `ДанныеМодуля` - Не будет удалена, проблема будет решена в ближайшем будущем. +* `ДанныеНабора` - Живет, пока исполняются тесты набора. +* `ДанныеТеста` и `Ссылка`- Живут, пока исполняется тест. + +:::caution Механизм имеет ряд ограничений и не работает для следующих кейсов: + +* Данные создан не через API +* Данные созданы в событии "ПередВсемиТестами" (работает для "ПередТестовымНабором") +* Данные созданы в клиентском модуле через вызов своего серверного модуля, даже если он использует API тестового движка +::: diff --git a/documentation/docs/user-api/test-data.md b/documentation/docs/user-api/test-data/test-data.md similarity index 98% rename from documentation/docs/user-api/test-data.md rename to documentation/docs/user-api/test-data/test-data.md index 8e26512f..0b0776ff 100644 --- a/documentation/docs/user-api/test-data.md +++ b/documentation/docs/user-api/test-data/test-data.md @@ -22,12 +22,13 @@ tags: [Getting started, Test data] Если грамотно распределить тестовые данные на способы создания, мы можем добиться оптимального результата. Например, можно статичные данные создать вручную, сложные кейсы данных засунуть в макеты, а для программного создания реализовать методы-конструкторы, которые будем переиспользовать. Таким образом, сможем уйти от минусов данного подхода или минимизировать их вред. -В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные`. +В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные()`. Сейчас это минимальный набор методов, который в дальнейшем будет развиваться. Он позволяет: * Создавать данные информационной базы * Генерировать случайные значения +* Автоматически удалять созданные данные (для этого необходимо включить настройку теста `УдалениеТестовыхДанных()`) * Работать с файлами * Использовать таблицы markdown в качестве макетов данных diff --git a/exts/yaxunit/src/CommonModules/ЮТИсполнительКлиентСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТИсполнительКлиентСервер/Module.bsl index 029504aa..52f420d5 100644 --- a/exts/yaxunit/src/CommonModules/ЮТИсполнительКлиентСервер/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТИсполнительКлиентСервер/Module.bsl @@ -31,9 +31,6 @@ Возврат Наборы; КонецЕсли; - Уровни = ЮТФабрика.УровниИсполнения(); - ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль; - ЮТСобытия.ПередВсемиТестамиМодуля(ТестовыйМодуль); Если ЕстьОшибки(ТестовыйМодуль) Тогда @@ -51,8 +48,6 @@ КонецЦикла; - ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль; - ЮТСобытия.ПослеВсехТестовМодуля(ТестовыйМодуль); Если ЕстьОшибки(ТестовыйМодуль) Тогда @@ -71,9 +66,6 @@ Функция ВыполнитьНаборТестов(Набор, ТестовыйМодуль) - Уровни = ЮТФабрика.УровниИсполнения(); - ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов; - Набор.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах(); ЮТСобытия.ПередТестовымНабором(ТестовыйМодуль, Набор); @@ -82,7 +74,6 @@ КонецЕсли; Результаты = Новый Массив(); - ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Тест; Для Каждого Тест Из Набор.Тесты Цикл @@ -98,7 +89,6 @@ КонецЦикла; - ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов; ЮТСобытия.ПослеТестовогоНабора(ТестовыйМодуль, Набор); Набор.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Набор.ДатаСтарта; diff --git a/exts/yaxunit/src/CommonModules/ЮТКонструкторТестовыхДанных/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТКонструкторТестовыхДанных/Module.bsl index e59b96d4..1891a30b 100644 --- a/exts/yaxunit/src/CommonModules/ЮТКонструкторТестовыхДанных/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТКонструкторТестовыхДанных/Module.bsl @@ -148,7 +148,11 @@ ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства; ПараметрыЗаписи.ОбменДаннымиЗагрузка = ОбменДаннымиЗагрузка; - Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект); + Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект); + + ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка); + + Возврат Ссылка; КонецФункции @@ -170,7 +174,11 @@ ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства; ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение; - Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект); + Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект); + + ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка); + + Возврат Ссылка; КонецФункции diff --git a/exts/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl index f10639a6..2e9b5ae9 100644 --- a/exts/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl @@ -222,21 +222,21 @@ КонецПроцедуры -Процедура УстановитьКонтекстНабораТестов(Знач ДанныеКонтекста) Экспорт +Процедура УстановитьКонтекстНабораТестов() Экспорт - УстановитьЗначениеКонтекста(ИмяКонтекстаНабораТестов(), ДанныеКонтекста); + УстановитьЗначениеКонтекста(ИмяКонтекстаНабораТестов(), Новый Структура); КонецПроцедуры -Процедура УстановитьКонтекстМодуля(Знач ДанныеКонтекста) Экспорт +Процедура УстановитьКонтекстМодуля() Экспорт - УстановитьЗначениеКонтекста(ИмяКонтекстаМодуля(), ДанныеКонтекста); + УстановитьЗначениеКонтекста(ИмяКонтекстаМодуля(), Новый Структура); КонецПроцедуры -Процедура УстановитьКонтекстТеста(Знач ДанныеКонтекста) Экспорт +Процедура УстановитьКонтекстТеста() Экспорт - УстановитьЗначениеКонтекста(ИмяКонтекстаТеста(), ДанныеКонтекста); + УстановитьЗначениеКонтекста(ИмяКонтекстаТеста(), Новый Структура); КонецПроцедуры diff --git a/exts/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl index 50d84ee2..c447efb9 100644 --- a/exts/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl @@ -30,19 +30,26 @@ Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень; Уровни = ЮТФабрика.УровниИсполнения(); - Если Уровень = Уровни.Тест И ЮТКонтекст.КонтекстТеста().Свойство(ИмяЗначения) Тогда + КонтекстТеста = ЮТКонтекст.КонтекстТеста(); + Если Уровень = Уровни.Тест И КонтекстТеста <> Неопределено И КонтекстТеста.Свойство(ИмяЗначения) Тогда - Возврат ЮТКонтекст.КонтекстТеста()[ИмяЗначения]; + Возврат КонтекстТеста[ИмяЗначения]; - ИначеЕсли (Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов) - И ЮТКонтекст.КонтекстНабора().Свойство(ИмяЗначения) Тогда + КонецЕсли; + + КонтекстНабора = ЮТКонтекст.КонтекстНабора(); + Если (Уровень = Уровни.НаборТестов ИЛИ Уровень = Уровни.Тест) + И КонтекстНабора <> Неопределено И КонтекстНабора.Свойство(ИмяЗначения) Тогда - Возврат ЮТКонтекст.КонтекстНабора()[ИмяЗначения]; + Возврат КонтекстНабора[ИмяЗначения]; - ИначеЕсли (Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов ИЛИ Уровень = Уровни.Модуль) - И ЮТКонтекст.КонтекстМодуля().Свойство(ИмяЗначения) Тогда + КонецЕсли; + + КонтекстМодуля = ЮТКонтекст.КонтекстМодуля(); + Если (Уровень = Уровни.Модуль ИЛИ Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов) + И КонтекстМодуля <> Неопределено И КонтекстМодуля.Свойство(ИмяЗначения) Тогда - Возврат ЮТКонтекст.КонтекстМодуля()[ИмяЗначения]; + Возврат КонтекстМодуля[ИмяЗначения]; Иначе @@ -63,20 +70,53 @@ Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень; Уровни = ЮТФабрика.УровниИсполнения(); - Если Уровень = Уровни.Тест Тогда + Контекст = ТекущийКонтекст(); + + Если Контекст = Неопределено Тогда - ЮТКонтекст.КонтекстТеста().Вставить(ИмяЗначения, Значение); + Если Уровень = Уровни.Тест Тогда + ЮТКонтекст.УстановитьКонтекстТеста(); + ИначеЕсли Уровень = Уровни.НаборТестов Тогда + ЮТКонтекст.УстановитьКонтекстНабораТестов(); + ИначеЕсли Уровень = Уровни.Модуль Тогда + ЮТКонтекст.УстановитьКонтекстМодуля(); + Иначе + ВызватьИсключение СтрШаблон("Неизвестный уровень исполнения `%1`", Уровень); + КонецЕсли; - ИначеЕсли Уровень = Уровни.НаборТестов Тогда - - ЮТКонтекст.КонтекстНабора().Вставить(ИмяЗначения, Значение); - - ИначеЕсли Уровень = Уровни.Модуль Тогда - - ЮТКонтекст.КонтекстМодуля().Вставить(ИмяЗначения, Значение); + Контекст = ТекущийКонтекст(); КонецЕсли; + Контекст.Вставить(ИмяЗначения, Значение); + КонецПроцедуры +Функция ТекущийКонтекст() Экспорт + + Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень; + Уровни = ЮТФабрика.УровниИсполнения(); + + Если Уровень = Уровни.Тест Тогда + + Контекст = ЮТКонтекст.КонтекстТеста(); + + ИначеЕсли Уровень = Уровни.НаборТестов Тогда + + Контекст = ЮТКонтекст.КонтекстНабора(); + + ИначеЕсли Уровень = Уровни.Модуль Тогда + + Контекст = ЮТКонтекст.КонтекстМодуля(); + + Иначе + + Контекст = Неопределено; + + КонецЕсли; + + Возврат Контекст; + +КонецФункции + #КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl index c6ddd359..edce5398 100644 --- a/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl @@ -110,66 +110,44 @@ КонецФункции -Функция ОписаниеОбъектМетаданных(Знач Значение) Экспорт +Функция ОписаниеОбъектМетаданных(Знач Значение, ЗаполнятьРеквизиты = Истина) Экспорт - ТипЗначение = ТипЗнч(Значение); - - Если ТипЗначение = Тип("Тип") Тогда - - МетаданныеОбъекта = Метаданные.НайтиПоТипу(Значение); - ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта); - - ИначеЕсли ТипЗначение = Тип("ОбъектМетаданных") Тогда - - МетаданныеОбъекта = Значение; - ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта); - - ИначеЕсли ТипЗначение = Тип("Строка") Тогда - - ЧастиСтроки = СтрРазделить(Значение, "."); - Если ЧастиСтроки.Количество() = 2 Тогда - ТипыМетаданных = ЮТМетаданные.ТипыМетаданных(); - ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]]; - Если ОписаниеТипа <> Неопределено Тогда - МетаданныеОбъекта = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]]; - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - Если МетаданныеОбъекта = Неопределено ИЛИ ОписаниеТипа = Неопределено Тогда - Сообщение = СтрШаблон("Не удалось получить описание метаданных для `%1` (%2)", Значение, ТипЗначение); - ВызватьИсключение Сообщение; - КонецЕсли; + МетаданныеОбъекта = ОбъектМетаданных(Значение); + ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта); ОписаниеОбъект = Новый Структура; + ОписаниеОбъект.Вставить("Имя", МетаданныеОбъекта.Имя); ОписаниеОбъект.Вставить("ОписаниеТипа", ОписаниеТипа); ОписаниеОбъект.Вставить("Реквизиты", Новый Структура()); ОписаниеОбъект.Вставить("ТабличныеЧасти", Новый Структура()); - ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты); + Если НЕ ЗаполнятьРеквизиты Тогда + Возврат ОписаниеОбъект; + КонецЕсли; + + ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты, "Ссылка, Период"); Если ОписаниеТипа.Измерения Тогда - ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Измерения, ОписаниеОбъект.Реквизиты); + ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Измерения, ОписаниеОбъект.Реквизиты, Истина); КонецЕсли; Если ОписаниеТипа.Реквизиты Тогда - ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Реквизиты, ОписаниеОбъект.Реквизиты); + ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Реквизиты, ОписаниеОбъект.Реквизиты, Ложь); КонецЕсли; Если ОписаниеТипа.Ресурсы Тогда - ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Ресурсы, ОписаниеОбъект.Реквизиты); + ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Ресурсы, ОписаниеОбъект.Реквизиты, Ложь); КонецЕсли; Если ОписаниеТипа.РеквизитыАдресации Тогда - ДобавитьОписанияРеквизитов(МетаданныеОбъекта.РеквизитыАдресации, ОписаниеОбъект.Реквизиты); + ДобавитьОписанияРеквизитов(МетаданныеОбъекта.РеквизитыАдресации, ОписаниеОбъект.Реквизиты, Ложь); КонецЕсли; Если ОписаниеТипа.ТабличныеЧасти Тогда Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл РеквизитыТабличнойЧасти = Новый Структура(); - ДобавитьОписанияРеквизитов(ТабличнаяЧасть.Реквизиты, РеквизитыТабличнойЧасти); + ДобавитьОписанияРеквизитов(ТабличнаяЧасть.Реквизиты, РеквизитыТабличнойЧасти, Ложь); ОписаниеОбъект.ТабличныеЧасти.Вставить(ТабличнаяЧасть.Имя, РеквизитыТабличнойЧасти); КонецЦикла; @@ -245,22 +223,69 @@ #Область СлужебныеПроцедурыИФункции -Процедура ДобавитьОписанияРеквизитов(КоллекцияРеквизитов, КоллекцияОписаний) +Функция ОбъектМетаданных(Значение) + + ТипЗначение = ТипЗнч(Значение); + + Если ТипЗначение = Тип("Тип") Тогда + + ОбъектМетаданных = Метаданные.НайтиПоТипу(Значение); + + ИначеЕсли ТипЗначение = Тип("ОбъектМетаданных") Тогда + + ОбъектМетаданных = Значение; + + ИначеЕсли ТипЗначение = Тип("Строка") Тогда + + ЧастиСтроки = СтрРазделить(Значение, "."); + Если ЧастиСтроки.Количество() = 2 Тогда + ТипыМетаданных = ЮТМетаданные.ТипыМетаданных(); + ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]]; + Если ОписаниеТипа <> Неопределено Тогда + ОбъектМетаданных = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]]; + КонецЕсли; + КонецЕсли; + + Иначе + + ОбъектМетаданных = Неопределено; + + КонецЕсли; + + Если ОбъектМетаданных = Неопределено Тогда + Сообщение = ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТМетаданныеСервер.ОбъектМетаданных", Значение); + ВызватьИсключение Сообщение; + КонецЕсли; + + Возврат ОбъектМетаданных; + +КонецФункции + +Процедура ДобавитьОписанияРеквизитов(КоллекцияРеквизитов, КоллекцияОписаний, Знач ЭтоКлюч) + + Если ТипЗнч(ЭтоКлюч) = Тип("Строка") Тогда + ИменаКлючевыхПолей = СтрРазделить(ЭтоКлюч, ", "); + КонецЕсли; Для Каждого Реквизит Из КоллекцияРеквизитов Цикл - КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит)); + Если ИменаКлючевыхПолей <> Неопределено Тогда + ЭтоКлюч = ИменаКлючевыхПолей.Найти(Реквизит.Имя) <> Неопределено; + КонецЕсли; + + КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит, ЭтоКлюч)); КонецЦикла; КонецПроцедуры -Функция ОписаниеРеквизита(Реквизит) Экспорт +Функция ОписаниеРеквизита(Реквизит, ЭтоКлюч) Экспорт Описание = Новый Структура(); Описание.Вставить("Имя", Реквизит.Имя); Описание.Вставить("Тип", Реквизит.Тип); Описание.Вставить("Обязательный", Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку); + Описание.Вставить("ЭтоКлюч", ЭтоКлюч); Возврат Описание; diff --git a/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl index 0006346e..9b4c756a 100644 --- a/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl @@ -18,17 +18,39 @@ #Область СлужебныйПрограммныйИнтерфейс -Функция ЗначениеНастройкиТеста(ИмяНастройки, ОписаниеТеста, ОписаниеТестовогоНабора, ЗначениеПоУмолчанию) Экспорт +Функция ВТранзакции() Экспорт + + ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().ВТранзакции; + + Возврат ЗначениеНастройкиТеста(ИмяПараметра, Ложь); + +КонецФункции + +Функция УдалениеТестовыхДанных() Экспорт + + ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().УдалениеТестовыхДанных; + + Возврат ЗначениеНастройкиТеста(ИмяПараметра, Ложь); + +КонецФункции + +Функция ЗначениеНастройкиТеста(ИмяНастройки, ЗначениеПоУмолчанию) Экспорт Значение = ЗначениеПоУмолчанию; + КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения(); - Если ОписаниеТеста.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда - Значение = ОписаниеТеста.НастройкиВыполнения[ИмяНастройки]; - ИначеЕсли ОписаниеТестовогоНабора.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда - Значение = ОписаниеТестовогоНабора.НастройкиВыполнения[ИмяНастройки]; + Если КонтекстИсполнения.Тест <> Неопределено И КонтекстИсполнения.Тест.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда + + Значение = КонтекстИсполнения.Тест.НастройкиВыполнения[ИмяНастройки]; + + ИначеЕсли КонтекстИсполнения.Набор <> Неопределено И КонтекстИсполнения.Набор.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда + + Значение = КонтекстИсполнения.Набор.НастройкиВыполнения[ИмяНастройки]; + Иначе ГлобальныеНастройки = ЮТКонтекст.ГлобальныеНастройкиВыполнения(); + Если ГлобальныеНастройки.Свойство(ИмяНастройки) Тогда Значение = ГлобальныеНастройки[ИмяНастройки]; КонецЕсли; diff --git a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl index 1d3754e9..8ae1b58f 100644 --- a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl @@ -790,6 +790,12 @@ КонецПроцедуры +Функция НеподдерживаемыйПараметрМетода(ИмяМетода, ЗначениеПараметра) Экспорт + + Возврат СтрШаблон("Неподдерживаемый параметры метода `%1` `%2`(%3)", ИмяМетода, ЗначениеПараметра, ТипЗнч(ЗначениеПараметра)); + +КонецФункции + Функция УстановленБезопасныйРежим() Экспорт Возврат ЮТОбщийВызовСервера.УстановленБезопасныйРежим(); diff --git a/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl index 63c047f2..de447c8b 100644 --- a/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl @@ -33,7 +33,12 @@ // ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля Процедура ПередВсемиТестамиМодуля(ТестовыйМодуль) Экспорт - ЮТКонтекст.УстановитьКонтекстМодуля(Новый Структура()); + Уровни = ЮТФабрика.УровниИсполнения(); + КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения(); + КонтекстИсполнения.Уровень = Уровни.Модуль; + КонтекстИсполнения.Модуль = ТестовыйМодуль; + + ЮТКонтекст.УстановитьКонтекстМодуля(); ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль); ВызватьОбработкуСобытия("ПередВсемиТестами", ОписаниеСобытия); @@ -47,7 +52,12 @@ // Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов Процедура ПередТестовымНабором(ТестовыйМодуль, Набор) Экспорт - ЮТКонтекст.УстановитьКонтекстНабораТестов(Новый Структура()); + Уровни = ЮТФабрика.УровниИсполнения(); + КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения(); + КонтекстИсполнения.Уровень = Уровни.НаборТестов; + КонтекстИсполнения.Набор = Набор; + + ЮТКонтекст.УстановитьКонтекстНабораТестов(); ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор); ВызватьОбработкуСобытия("ПередТестовымНабором", ОписаниеСобытия); @@ -62,15 +72,20 @@ // Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста Процедура ПередКаждымТестом(ТестовыйМодуль, Набор, Тест) Экспорт + Уровни = ЮТФабрика.УровниИсполнения(); + КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения(); + КонтекстИсполнения.Уровень = Уровни.Тест; + КонтекстИсполнения.Тест = Тест; + ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор, Тест); - ЮТКонтекст.УстановитьКонтекстТеста(Новый Структура()); + ЮТКонтекст.УстановитьКонтекстТеста(); #Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда ПолучитьСообщенияПользователю(Истина); #КонецЕсли #Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда - Если ВТранзакции(ОписаниеСобытия) Тогда + Если ЮТНастройкиВыполнения.ВТранзакции() Тогда НачатьТранзакцию(); КонецЕсли; #КонецЕсли @@ -94,7 +109,7 @@ ВызватьОбработкуСобытия("ПослеКаждогоТеста", ОписаниеСобытия); #Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда - Если ВТранзакции(ОписаниеСобытия) Тогда + Если ЮТНастройкиВыполнения.ВТранзакции() Тогда ОтменитьТранзакцию(); Пока ТранзакцияАктивна() Цикл ОтменитьТранзакцию(); @@ -103,6 +118,11 @@ КонецЕсли; #КонецЕсли + Уровни = ЮТФабрика.УровниИсполнения(); + КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения(); + КонтекстИсполнения.Уровень = Уровни.НаборТестов; + КонтекстИсполнения.Тест = Неопределено; + КонецПроцедуры // Обработчик события "ПослеТестовогоНабора" @@ -115,6 +135,11 @@ ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор); ВызватьОбработкуСобытия("ПослеТестовогоНабора", ОписаниеСобытия); + Уровни = ЮТФабрика.УровниИсполнения(); + КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения(); + КонтекстИсполнения.Уровень = Уровни.Модуль; + КонтекстИсполнения.Набор = Неопределено; + КонецПроцедуры // Обработчик события "ПослеВсехТестовМодуля" @@ -126,6 +151,10 @@ ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль); ВызватьОбработкуСобытия("ПослеВсехТестов", ОписаниеСобытия); + КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения(); + КонтекстИсполнения.Уровень = Неопределено; + КонтекстИсполнения.Модуль = Неопределено; + КонецПроцедуры #КонецОбласти @@ -253,12 +282,4 @@ КонецПроцедуры -Функция ВТранзакции(ОписаниеСобытия) - - ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().ВТранзакции; - - Возврат ЮТНастройкиВыполнения.ЗначениеНастройкиТеста(ИмяПараметра, ОписаниеСобытия.Тест, ОписаниеСобытия.Набор, Ложь); - -КонецФункции - #КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl index dfbb5738..4b6be2f8 100644 --- a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl @@ -29,7 +29,9 @@ // ЛюбаяСсылка - Ссылка на созданный объект Функция СоздатьЭлемент(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено) Экспорт - Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЭлемент(Менеджер, Наименование, Реквизиты); + Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЭлемент(Менеджер, Наименование, Реквизиты); + ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка); + Возврат Ссылка; КонецФункции @@ -43,7 +45,9 @@ // ДокументСсылка - Ссылка на созданный объект Функция СоздатьДокумент(Менеджер, Реквизиты = Неопределено) Экспорт - Возврат ЮТТестовыеДанныеВызовСервера.СоздатьДокумент(Менеджер, Реквизиты); + Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьДокумент(Менеджер, Реквизиты); + ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка); + Возврат Ссылка; КонецФункции @@ -259,9 +263,7 @@ // Строка Функция НовоеИмяВременногоФайла(Расширение = Неопределено) Экспорт - Результат = ПолучитьИмяВременногоФайла(Расширение); - ЮТКонтекст.КонтекстТеста().ВременныеФайлы.Добавить(Результат); - Возврат Результат; + Возврат ЮТТестовыеДанныеСлужебный.НовоеИмяВременногоФайла(Расширение); КонецФункции @@ -392,7 +394,9 @@ // Ссылки - Массив из ЛюбаяСсылка Процедура Удалить(Ссылки) Экспорт - ЮТТестовыеДанныеВызовСервера.Удалить(Ссылки); + Если ЗначениеЗаполнено(Ссылки) Тогда + ЮТТестовыеДанныеВызовСервера.Удалить(Ссылки); + КонецЕсли; КонецПроцедуры @@ -409,84 +413,3 @@ #КонецЕсли #КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - -// Обработчик события "ПередКаждымТестом" -// -// Параметры: -// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов -Процедура ПередКаждымТестом(ОписаниеСобытия) Экспорт - - ЮТКонтекст.КонтекстТеста().Вставить("ВременныеФайлы", Новый Массив); - -КонецПроцедуры - -// Обработчик события "ПослеКаждогоТеста" -// -// Параметры: -// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов -Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт - - ВременныеФайлы = ЮТКонтекст.КонтекстТеста().ВременныеФайлы; - - Если ВременныеФайлы.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Ошибки = Новый Массив(); - - Для Каждого УдаляемыйФайл Из ВременныеФайлы Цикл - - Если ТипЗнч(УдаляемыйФайл) = Тип("Строка") Тогда - УдаляемыйФайл = Новый Файл(УдаляемыйФайл); - КонецЕсли; - - Попытка - Если УдаляемыйФайл.Существует() Тогда - - Если УдаляемыйФайл.ПолучитьТолькоЧтение() Тогда - УдаляемыйФайл.УстановитьТолькоЧтение(Ложь); - КонецЕсли; - - УдалитьФайлы(УдаляемыйФайл.ПолноеИмя); - - КонецЕсли; - Исключение - - Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление файла " + УдаляемыйФайл, ИнформацияОбОшибке())); - - КонецПопытки; - - КонецЦикла; - - Если ЗначениеЗаполнено(Ошибки) Тогда - ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ДобавитьВарианты(Варианты, БазоваяСтруктура, ЗначенияПараметров, Ключи, Инд) - - Если Инд > Ключи.ВГраница() Тогда - Возврат; - КонецЕсли; - - Ключ = Ключи[Инд]; - Для Каждого Значение Из ЗначенияПараметров[Ключ] Цикл - - Вариант = ЮТОбщий.СкопироватьСтруктуру(БазоваяСтруктура); - Вариант[Ключ] = Значение; - Варианты.Добавить(Вариант); - - ДобавитьВарианты(Варианты, Вариант, ЗначенияПараметров, Ключи, Инд + 1); - - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl index 265284c7..1e0f53eb 100644 --- a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl @@ -18,16 +18,7 @@ #Область СлужебныйПрограммныйИнтерфейс -// СоздатьЭлемент -// Создает новый элемент и возвращает его ссылку -// Параметры: -// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд. -// Наименование - Строка, Неопределено - Наименование элемента -// Реквизиты - Структура, Неопределено - Значения реквизитов элемента -// -// Возвращаемое значение: -// ЛюбаяСсылка - Ссылка на созданный объект -Функция СоздатьЭлемент(Знач Менеджер, Знач Наименование = Неопределено, Знач Реквизиты = Неопределено) Экспорт +Функция СоздатьЭлемент(Знач Менеджер, Знач Наименование, Знач Реквизиты) Экспорт Менеджер = ЮТОбщий.Менеджер(Менеджер); @@ -47,21 +38,11 @@ Объект.УстановитьНовыйКод(); КонецЕсли; - ЗаписатьОбъект(Объект); - - Возврат Объект.Ссылка; + Возврат ЗаписатьОбъект(Объект); КонецФункции -// СоздатьДокумент -// Создает новый документ и возвращает его ссылку -// Параметры: -// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд. -// Реквизиты - Структура, Неопределено - Значения реквизитов элемента -// -// Возвращаемое значение: -// ДокументСсылка - Ссылка на созданный объект -Функция СоздатьДокумент(Знач Менеджер, Знач Реквизиты = Неопределено) Экспорт +Функция СоздатьДокумент(Знач Менеджер, Знач Реквизиты) Экспорт РежимЗаписи = РежимЗаписиДокумента.Запись; @@ -76,23 +57,11 @@ РежимЗаписи = ЮТОбщий.ЗначениеСтруктуры(Реквизиты, "РежимЗаписи", РежимЗаписи); КонецЕсли; - ЗаписатьОбъект(Объект, , РежимЗаписи); - - Возврат Объект.Ссылка; + Возврат ЗаписатьОбъект(Объект, , РежимЗаписи); КонецФункции -// Создать запись. -// -// Параметры: -// Менеджер - Произвольный -// Данные - Структура - Данные заполнения объекта -// ПараметрыЗаписи - см. ЮТОбщий. -// ВернутьОбъект - Булево - Вернуть объект -// -// Возвращаемое значение: -// Произвольный - Создать запись -Функция СоздатьЗапись(Знач Менеджер, Знач Данные, Знач ПараметрыЗаписи = Неопределено, Знач ВернутьОбъект = Ложь) Экспорт +Функция СоздатьЗапись(Знач Менеджер, Знач Данные, Знач ПараметрыЗаписи, Знач ВернутьОбъект) Экспорт Менеджер = ЮТОбщий.Менеджер(Менеджер); @@ -135,15 +104,12 @@ КонецЕсли; РежимЗаписи = ?(СтрСравнить(ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя, "Документ") = 0, ПараметрыЗаписи.РежимЗаписи, Неопределено); - ЗаписатьОбъект(Объект, ПараметрыЗаписи.ОбменДаннымиЗагрузка, РежимЗаписи); + КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи.ОбменДаннымиЗагрузка, РежимЗаписи); Если ВернутьОбъект Тогда Возврат Объект; - ИначеЕсли ЭтоСсылочный Тогда - Возврат Объект.Ссылка; Иначе - ЮТОбщий.СообщитьПользователю("Я пока не умею возвращать ключи регистра"); - Возврат Неопределено; + Возврат КлючЗаписи; КонецЕсли; КонецФункции @@ -154,12 +120,43 @@ Ссылки = ЮТОбщий.ЗначениеВМассиве(Ссылки); КонецЕсли; + СсылочныеТипы = ЮТОбщий.ОписаниеТиповЛюбаяСсылка(); + Ошибки = Новый Массив; + Для Каждого Ссылка Из Ссылки Цикл - Ссылка.ПолучитьОбъект().Удалить(); + ТипЗначения = ТипЗнч(Ссылка); + Если Ссылка = Неопределено ИЛИ СтрНачинаетсяС(ЮТОбщий.ПредставлениеТипа(ТипЗначения), "Enum") Тогда + Продолжить; + КонецЕсли; + + Попытка + Если СсылочныеТипы.СодержитТип(ТипЗначения) Тогда + Объект = Ссылка.ПолучитьОбъект(); + Если Объект <> Неопределено Тогда + Объект.Удалить(); + КонецЕсли; + Иначе + Менеджер = Менеджер(ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ТипЗначения, Ложь)); + Запись = Менеджер.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(Запись, Ссылка); + Запись.Прочитать(); + Запись.Удалить(); + КонецЕсли; + Исключение + + Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление " + Ссылка, ИнформацияОбОшибке())); + + КонецПопытки; КонецЦикла; + ОбновитьНумерациюОбъектов(); + + Если ЗначениеЗаполнено(Ошибки) Тогда + ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС); + КонецЕсли; + КонецПроцедуры Функция ФикцияЗначенияБазы(Знач ТипЗначения) Экспорт @@ -188,9 +185,7 @@ ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных); - ЗаписатьОбъект(Объект); - - Возврат Объект.Ссылка; + Возврат ЗаписатьОбъект(Объект); КонецФункции @@ -235,7 +230,7 @@ КонецФункции -Процедура ЗаписатьОбъект(Объект, ОбменДаннымиЗагрузка = Ложь, РежимЗаписи = Неопределено) +Функция ЗаписатьОбъект(Объект, ОбменДаннымиЗагрузка = Ложь, РежимЗаписи = Неопределено) Если ОбменДаннымиЗагрузка Тогда Объект.ОбменДанными.Загрузка = Истина; @@ -249,6 +244,8 @@ Объект.Записать(); КонецЕсли; + Возврат КлючЗаписи(Объект); + Исключение Сообщение = СтрШаблон("Не удалось записать объект `%1` (%2) @@ -257,7 +254,7 @@ КонецПопытки; -КонецПроцедуры +КонецФункции Процедура ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных) @@ -285,4 +282,38 @@ КонецПроцедуры +Функция КлючЗаписи(Объект) + + ПредставлениеТипа = ЮТОбщий.ПредставлениеТипа(ТипЗнч(Объект)); + Если СтрНайти(ПредставлениеТипа, "Object.") Тогда + + Возврат Объект.Ссылка; + + ИначеЕсли СтрНайти(ПредставлениеТипа, "менеджер записи:") Тогда // TODO + + Описание = ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ТипЗнч(Объект)); + + КлючевыеРеквизиты = Новый Структура(); + Для Каждого Реквизит Из Описание.Реквизиты Цикл + Если Реквизит.Значение.ЭтоКлюч Тогда + КлючевыеРеквизиты.Вставить(Реквизит.Ключ, Объект[Реквизит.Ключ]); + КонецЕсли; + КонецЦикла; + + Менеджер = Менеджер(Описание); + Возврат Менеджер.СоздатьКлючЗаписи(КлючевыеРеквизиты); + + Иначе + + Сообщение = ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.КлючЗаписи", Объект); + ВызватьИсключение Сообщение; + + КонецЕсли; + +КонецФункции + +Функция Менеджер(ОписаниеОбъектМетаданных) + Возврат Новый(СтрШаблон("%1Менеджер.%2", ОписаниеОбъектМетаданных.ОписаниеТипа.Имя, ОписаниеОбъектМетаданных.Имя)); +КонецФункции + #КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеСлужебный/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеСлужебный/Module.bsl index 642e2154..dffa7d84 100644 --- a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеСлужебный/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеСлужебный/Module.bsl @@ -66,20 +66,83 @@ ИначеЕсли ЭтоСистемноеПеречисление(Тип) Тогда Значение = СлучайноЗначениеСистемногоПеречисления(Тип); + Иначе Значение = ЮТТестовыеДанныеВызовСервера.ФикцияЗначенияБазы(Тип); + ДобавитьТестовуюЗапись(Значение); КонецЕсли; Если Значение = Неопределено Тогда ВызватьИсключение СтрШаблон("Создание фейковых значений для `%1` не поддерживается", ОписаниеТипа); КонецЕсли; - + Возврат ОписаниеТипа.ПривестиЗначение(Значение); КонецФункции +// см. ЮТТестовыеДанные.НовоеИмяВременногоФайла +Функция НовоеИмяВременногоФайла(Расширение = Неопределено) Экспорт + + //@skip-check missing-temporary-file-deletion + Результат = ПолучитьИмяВременногоФайла(Расширение); // BSLLS:MissingTemporaryFileDeletion-off + ДобавитьВременныйФайл(Результат); + Возврат Результат; + +КонецФункции + +Процедура ДобавитьВременныйФайл(Файл) Экспорт + + БуферВременныеФайлы().Добавить(Файл); + +КонецПроцедуры + +Процедура ДобавитьТестовуюЗапись(Запись) Экспорт + +#Если Сервер Тогда + Если ТранзакцияАктивна() И ЮТНастройкиВыполнения.ВТранзакции() Тогда + Возврат; + КонецЕсли; +#КонецЕсли + Если ЮТНастройкиВыполнения.УдалениеТестовыхДанных() Тогда + БуферТестовыеДанные().Добавить(Запись); + КонецЕсли; + +КонецПроцедуры + +Процедура УдалитьТестовыеДанные() Экспорт + + ЮТФайлы.УдалитьВременныеФайлы(БуферВременныеФайлы()); + + Если ЮТНастройкиВыполнения.УдалениеТестовыхДанных() Тогда + ЮТТестовыеДанные.Удалить(БуферТестовыеДанные()); + КонецЕсли; + +КонецПроцедуры + +#Область ОбработчикиСобытий + +Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт + + УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста + +КонецПроцедуры + +Процедура ПослеТестовогоНабора(ОписаниеСобытия) Экспорт + + УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста + +КонецПроцедуры + +Процедура ПослеВсехТестов(ОписаниеСобытия) Экспорт + + УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -129,4 +192,31 @@ КонецФункции +Функция БуферВременныеФайлы() + + Возврат Буфер("ВременныеФайлы"); + +КонецФункции + +Функция БуферТестовыеДанные() + + Возврат Буфер("ТестовыеДанные"); + +КонецФункции + +Функция Буфер(Ключ) + + ТекущийКонтекст = ЮТест.Контекст().ТекущийКонтекст(); + + Если ТекущийКонтекст.Свойство(Ключ) Тогда + Буфер = ТекущийКонтекст[Ключ]; + Иначе + Буфер = Новый Массив(); + ТекущийКонтекст.Вставить(Ключ, Буфер); + КонецЕсли; + + Возврат Буфер; + +КонецФункции + #КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl index ef49ca86..5aaf0a74 100644 --- a/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl @@ -163,6 +163,27 @@ КонецФункции +// Устанавливает настройку удаления созданных тестовых данных +// В отличии от использования транзакции: +// +// * Умеет работь с данными созданными на клиенте +// * Только удаляет созданные данные и не откатывает изменения объектов +// * Работает с данными созданными через API работы с тестовыми данными +// * Удаляет данные созданные вне теста (в обработчиках событий, например, ПередТестовымНабором) +// +// Параметры: +// УдалятьСозданныеДанные - Булево +// +// Возвращаемое значение: +// ОбщийМодуль - Этот же модуль, для замыкания +Функция УдалениеТестовыхДанных(УдалятьСозданныеДанные = Истина) Экспорт + + НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().УдалениеТестовыхДанных, УдалятьСозданныеДанные); + + Возврат ЮТТесты; + +КонецФункции + // Устанавливает параметры вызова теста. // // * Если метод вызывается первый раз, то он устанавливает параметры теста. diff --git a/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl index 7c1f84ea..1b5dbe2a 100644 --- a/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl @@ -63,11 +63,13 @@ // // Возвращаемое значение: // ФиксированнаяСтруктура - Параметры исполнения теста: -// * ВТранзакции - Строка - Тест должен выполняться в транзакции +// * ВТранзакции - Строка - Тест должен выполняться в транзакции +// * УдалениеТестовыхДанных - Строка - Тест должен удалить созданные тестовые данные Функция ПараметрыИсполненияТеста() Экспорт Параметры = Новый Структура(); Параметры.Вставить("ВТранзакции", "ВТранзакции"); + Параметры.Вставить("УдалениеТестовыхДанных", "УдалениеТестовыхДанных"); Возврат Новый ФиксированнаяСтруктура(Параметры); @@ -592,11 +594,20 @@ // // Возвращаемое значение: // Структура - Данные контекста исполнения: -// * Уровень - Строка +// * Уровень - Строка - Возможные значения см. УровниИсполнения +// * Модуль - Неопределено - Нет исполняемого модуля +// - см. ОписаниеТестовогоМодуля +// * Набор - Неопределено - Нет исполняемого тестового набора +// - см. ОписаниеИсполняемогоНабораТестов +// * Тест - Неопределено - Нет исполняемого теста +// - см. ОписаниеИсполняемогоТеста Функция НовыйКонтекстИсполнения() Экспорт Контекст = Новый Структура(); Контекст.Вставить("Уровень", ""); + Контекст.Вставить("Модуль", Неопределено); + Контекст.Вставить("Набор", Неопределено); + Контекст.Вставить("Тест", Неопределено); Возврат Контекст; diff --git a/exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl index 95f1806b..249d5d76 100644 --- a/exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl @@ -103,6 +103,49 @@ КонецФункции +// Удаляет файлы +// +// Параметры: +// Файлы - Массив из Файл +// - Массив из Строка +Процедура УдалитьВременныеФайлы(Файлы) Экспорт + + Если НЕ ЗначениеЗаполнено(Файлы) Тогда + Возврат; + КонецЕсли; + + Ошибки = Новый Массив(); + + Для Каждого УдаляемыйФайл Из Файлы Цикл + + Если ТипЗнч(УдаляемыйФайл) = Тип("Строка") Тогда + УдаляемыйФайл = Новый Файл(УдаляемыйФайл); + КонецЕсли; + + Попытка + Если УдаляемыйФайл.Существует() Тогда + + Если УдаляемыйФайл.ПолучитьТолькоЧтение() Тогда + УдаляемыйФайл.УстановитьТолькоЧтение(Ложь); + КонецЕсли; + + УдалитьФайлы(УдаляемыйФайл.ПолноеИмя); + + КонецЕсли; + Исключение + + Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление файла " + УдаляемыйФайл, ИнформацияОбОшибке())); + + КонецПопытки; + + КонецЦикла; + + Если ЗначениеЗаполнено(Ошибки) Тогда + ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo b/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo index 80ee2585..0e0a76b6 100644 --- a/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo +++ b/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo @@ -9,7 +9,7 @@ true CommonModule.МокитоСлужебный CommonModule.ЮТЛогирование - CommonModule.ЮТТестовыеДанные + CommonModule.ЮТТестовыеДанныеСлужебный CommonModule.ЮТУтверждения Subsystem.ЮТФункциональность diff --git a/tests/src/CommonModules/ОМ_Мокито/Module.bsl b/tests/src/CommonModules/ОМ_Мокито/Module.bsl index 2f4772ea..01727556 100644 --- a/tests/src/CommonModules/ОМ_Мокито/Module.bsl +++ b/tests/src/CommonModules/ОМ_Мокито/Module.bsl @@ -25,7 +25,7 @@ .ДобавитьТест("Обучение_ЦепочкаВызовов") .ДобавитьТест("Проверить") .ДобавитьТест("Прогон_НакоплениеСтатистики").СПараметрами(Истина).СПараметрами(Ложь) - .ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов") + .ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов").ВТранзакции() ; КонецПроцедуры diff --git a/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl b/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl index 6f549c6e..a5384258 100644 --- a/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl @@ -20,7 +20,7 @@ Процедура ИсполняемыеСценарии() Экспорт - ЮТТесты.ВТранзакции() + ЮТТесты.ВТранзакции().УдалениеТестовыхДанных() .ДобавитьТест("ЗначенияРеквизитов") .ДобавитьТест("ЗначениеРеквизита") .ДобавитьТест("ТаблицаСодержитЗаписи") diff --git a/tests/src/CommonModules/ОМ_ЮТКонструкторТестовыхДанных/Module.bsl b/tests/src/CommonModules/ОМ_ЮТКонструкторТестовыхДанных/Module.bsl index 420205ec..8c239817 100644 --- a/tests/src/CommonModules/ОМ_ЮТКонструкторТестовыхДанных/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТКонструкторТестовыхДанных/Module.bsl @@ -20,7 +20,7 @@ Процедура ИсполняемыеСценарии() Экспорт - ЮТТесты.ВТранзакции() + ЮТТесты.ВТранзакции().УдалениеТестовыхДанных() .ДобавитьТест("ЗаполнитьСправочник") .ДобавитьТест("ЗаполнитьДокумент") ; diff --git a/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl b/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl index 30ca3723..28611603 100644 --- a/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl @@ -21,6 +21,8 @@ Процедура ИсполняемыеСценарии() Экспорт ЮТТесты + .ВТранзакции() + .УдалениеТестовыхДанных() .ДобавитьТест("Удалить"); ; diff --git a/tests/src/CommonModules/ОМ_ЮТТестовыеДанныеСлужебный/Module.bsl b/tests/src/CommonModules/ОМ_ЮТТестовыеДанныеСлужебный/Module.bsl index 8e8e2ebe..2d0af530 100644 --- a/tests/src/CommonModules/ОМ_ЮТТестовыеДанныеСлужебный/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТТестовыеДанныеСлужебный/Module.bsl @@ -20,7 +20,12 @@ Процедура ИсполняемыеСценарии() Экспорт + КодТовара = ЮТОбщий.ЧислоВСтроку(ЮТест.Данные().СлучайноеПоложительноеЧисло(999999999)); + Период = ТекущаяДата(); + ЮТТесты + .ВТранзакции() + .УдалениеТестовыхДанных() .ДобавитьТест("Фикция") .СПараметрами(Новый ОписаниеТипов("Число")) .СПараметрами(Новый ОписаниеТипов("Строка")) @@ -35,6 +40,16 @@ .СПараметрами(Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыХарактеристик")) .СПараметрами(Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыХарактеристик, СправочникСсылка.Банки, ПеречислениеСсылка.СостоянияЗаказов")) .СПараметрами(Новый ОписаниеТипов("ВидДвиженияНакопления")) + .ДобавитьТест("УдалениеТестовыхДанныхСправочник") + .СПараметрами(КодТовара) + .СПараметрами(КодТовара) + .ДобавитьТест("УдалениеТестовыхДанныхДокумент") + .СПараметрами(КодТовара) + .СПараметрами(КодТовара) + .ДобавитьТест("УдалениеТестовыхДанныхРегистрСведений") + .СПараметрами(Период) + .СПараметрами(Период) + .ДобавитьТест("НеУдалениеТестовыхДанныхВызовСервера") ; КонецПроцедуры @@ -49,5 +64,100 @@ КонецПроцедуры +Процедура УдалениеТестовыхДанныхСправочник(Код) Экспорт + + СоздатьСсылку("Тест", Код); + + Ссылки = ЮТест.Контекст().Значение("Ссылки"); + СсылкаСуществует(Ссылки.Набор, "Набор"); + +КонецПроцедуры + +Процедура НеУдалениеТестовыхДанныхВызовСервера() Экспорт + + Ссылка = ПомощникТестированияВызовСервера.НовыйТовар(); + ЮТест.Контекст().Значение("Ссылки").Вставить("ТестВызовСервера", Ссылка); + +КонецПроцедуры + +Процедура УдалениеТестовыхДанныхДокумент(НомерДокумента) Экспорт + + ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара") + .Установить("Номер", НомерДокумента) + .Провести(); + +КонецПроцедуры + +Процедура УдалениеТестовыхДанныхРегистрСведений(Период) Экспорт + + ЮТест.ОжидаетЧтоТаблицаБазы("РегистрСведений.КурсыВалют").НеСодержитЗаписи(ЮТест.Предикат().Реквизит("Период").Равно(Период)); + ЮТест.Данные().КонструкторОбъекта("РегистрыСведений.КурсыВалют") + .Фикция("Валюта") + .Фикция("Курс") + .Установить("Период", Период) + .Записать(); + +КонецПроцедуры + #КонецОбласти +#Область СлужебныеПроцедурыИФункции + +Процедура ПередВсемиТестами() Экспорт + + Ссылки = Новый Структура("Набор, Тест"); + ЮТест.Контекст().УстановитьЗначение("Ссылки", Ссылки); + +КонецПроцедуры + +Процедура ПередТестовымНабором() Экспорт + + СоздатьСсылку("Набор"); + +КонецПроцедуры + +Процедура ПослеВсехТестов() Экспорт + + Ссылки = ЮТест.Контекст().Значение("Ссылки"); + СсылкаНеСуществует(Ссылки.Набор, "Набор"); + Если Ссылки.Тест <> Неопределено Тогда + СсылкаНеСуществует(Ссылки.Тест, "Тест"); + КонецЕсли; + +#Если Сервер Тогда + СсылкаНеСуществует(Ссылки.ТестВызовСервера, "ТестВызовСервера"); +#Иначе + СсылкаСуществует(Ссылки.ТестВызовСервера, "ТестВызовСервера"); +#КонецЕсли + +КонецПроцедуры + +Процедура СоздатьСсылку(ИмяПеременной, Знач Код = Неопределено) + + Если Код = Неопределено Тогда + Код = ЮТОбщий.ЧислоВСтроку(ЮТест.Данные().СлучайноеПоложительноеЧисло(999999999)); + КонецЕсли; + + Ссылка = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары") + .Установить("Наименование", Код) + .Установить("Код", Код) + .Записать(); + ЮТест.Контекст().Значение("Ссылки").Вставить(ИмяПеременной, Ссылка); + +КонецПроцедуры + +Процедура СсылкаСуществует(Ссылка, Описание) + + ЮТест.ОжидаетЧто(Ссылка, Описание).ИмеетТип("СправочникСсылка.Товары"); + ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары", Описание).СодержитЗаписи(ЮТест.Предикат().Реквизит("Ссылка").Равно(Ссылка)); + +КонецПроцедуры + +Процедура СсылкаНеСуществует(Ссылка, Описание) + + ЮТест.ОжидаетЧто(Ссылка, Описание).ИмеетТип("СправочникСсылка.Товары"); + ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары", Описание).НеСодержитЗаписи(ЮТест.Предикат().Реквизит("Ссылка").Равно(Ссылка)); + +КонецПроцедуры + +#КонецОбласти diff --git a/tests/src/CommonModules/ОМ_ЮТУтвержденияИБ/Module.bsl b/tests/src/CommonModules/ОМ_ЮТУтвержденияИБ/Module.bsl index 80153394..7f304cb0 100644 --- a/tests/src/CommonModules/ОМ_ЮТУтвержденияИБ/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТУтвержденияИБ/Module.bsl @@ -20,7 +20,7 @@ Процедура ИсполняемыеСценарии() Экспорт - ЮТТесты.ВТранзакции() + ЮТТесты.ВТранзакции().УдалениеТестовыхДанных() .ДобавитьТест("СодержитЗаписи") .ДобавитьТест("НеСодержитЗаписи") .ДобавитьТест("СообщенияОбОшибках") diff --git a/tests/src/CommonModules/ПомощникТестированияВызовСервера/Module.bsl b/tests/src/CommonModules/ПомощникТестированияВызовСервера/Module.bsl index 37a4aa60..ebd471b5 100644 --- a/tests/src/CommonModules/ПомощникТестированияВызовСервера/Module.bsl +++ b/tests/src/CommonModules/ПомощникТестированияВызовСервера/Module.bsl @@ -16,11 +16,7 @@ // //©///////////////////////////////////////////////////////////////////////////©// -/////////////////////////////////////////////////////////////////// -// ПрограммныйИнтерфейс -// Экспортные процедуры и функции для прикладного использования -/////////////////////////////////////////////////////////////////// -#Область ПрограммныйИнтерфейс +#Область СлужебныйПрограммныйИнтерфейс // Проверяет существование ссылки в информационной базе // @@ -54,4 +50,17 @@ КонецФункции +Функция НовыйТовар(Знач Код = Неопределено) Экспорт + + Если Код = Неопределено Тогда + Код = ЮТОбщий.ЧислоВСтроку(ЮТест.Данные().СлучайноеПоложительноеЧисло(999999999)); + КонецЕсли; + + Возврат ЮТест.Данные().КонструкторОбъекта("Справочники.Товары") + .Установить("Наименование", Код) + .Установить("Код", Код) + .Записать(); + +КонецФункции + #КонецОбласти