1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-02-13 19:42:02 +02:00

Merge pull request #83 from bia-technologies/feature/74

Удаление созданных тестовых данных
This commit is contained in:
Koryakin Aleksey 2023-05-15 12:04:35 +03:00 committed by GitHub
commit 04e3e41c89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 689 additions and 240 deletions

View File

@ -0,0 +1,96 @@
---
tags: [Getting started, Test data]
---
# Удаление тестовых данных
При использовании тестовых данных нередко необходимо удалять созданные объекты.
Для этого вы можете использовать
## Автоматические транзакции
Для включения нужно при регистрации теста вызвать метод `ВТранзакции()`
```bsl title=ВТранзакции.bsl
ЮТТесты
.ДобавитьТест("Фикция").ВТранзакции() // Использование транзакции для конкретного теста
ЮТТесты
.ДобавитьТестовыйНабор("Основной).ВТранзакции() // Использование транзакции для набора тестов
.ДобавитьТест("Фикция")
ЮТТесты.ВТранзакции() // Использование транзакции для тестов модуля
.ДобавитьТест("Фикция")
```
И тогда тестовый движок будет оборачивать в транзакцию каждый серверный тест (для клиентских будет игнорироваться)
:::caution Учитывайте
В транзакцию оборачивается тест, а не модуль или набор, поэтому данные созданные вне теста не будут удалены.
Такие данные необходимо удалять самостоятельно при необходимости.
:::
## Механизма удаления тестовых данных
Для включения нужно при регистрации теста вызвать метод `УдалениеТестовыхДанных()`
```bsl title=УдалениеТестовыхДанных.bsl
ЮТТесты
.ДобавитьТест("Фикция").УдалениеТестовыхДанных() // Использование для конкретного теста
ЮТТесты
.ДобавитьТестовыйНабор("Основной).УдалениеТестовыхДанных() // Использование для всех тестов набора
.ДобавитьТест("Фикция")
ЮТТесты.УдалениеТестовыхДанных() // Использование для всех тестов модуля
.ДобавитьТест("Фикция")
ЮТТесты.ВТранзакции().УдалениеТестовыхДанных() // Совместно с транзакцией
.ДобавитьТест("Фикция")
```
Механизм не используется транзакции, а запоминает в контексте все созданные с помощью API объекты и записи регистров сведений.
Позволяет:
* Удалять данные созданные с клиента
* Удалять данные созданные вне теста (в обработчиках событий)
:::tip
Механизм понимает в рамках какого контекста исполнения (тест, набор, модуль) были созданы данные и удаляет их по выходу из него.
:::
Рассмотрим время жизни объектов созданных на разных этапах тестирования, например имеем такой модуль.
```bsl title=УдалениеТестовыхДанныхВремяЖизни.bsl
Процедура ПередВсемиТестами() Экспорт
ДанныеМодуля = ЮТест.Данные().СоздатьЭлемент(); // Не будет удалена
КонецПроцедуры
Процедура ПередТестовымНабором() Экспорт
ДанныеНабора = ЮТест.Данные().СоздатьЭлемент();
КонецПроцедуры
Процедура ПослеВсехТестов() Экспорт
ДанныеТеста = ЮТест.Данные().СоздатьЭлемент();
КонецПроцедуры
Процедура Тест() Экспорт
Ссылка = ЮТест.Данные().СоздатьЭлемент();
КонецПроцедуры
```
Для переменных получим разное время жизни
* `ДанныеМодуля` - Не будет удалена, проблема будет решена в ближайшем будущем.
* `ДанныеНабора` - Живет, пока исполняются тесты набора.
* `ДанныеТеста` и `Ссылка`- Живут, пока исполняется тест.
:::caution Механизм имеет ряд ограничений и не работает для следующих кейсов:
* Данные создан не через API
* Данные созданы в событии "ПередВсемиТестами" (работает для "ПередТестовымНабором")
* Данные созданы в клиентском модуле через вызов своего серверного модуля, даже если он использует API тестового движка
:::

View File

@ -22,12 +22,13 @@ tags: [Getting started, Test data]
Если грамотно распределить тестовые данные на способы создания, мы можем добиться оптимального результата.
Например, можно статичные данные создать вручную, сложные кейсы данных засунуть в макеты, а для программного создания реализовать методы-конструкторы, которые будем переиспользовать. Таким образом, сможем уйти от минусов данного подхода или минимизировать их вред.
В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные`.
В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные()`.
Сейчас это минимальный набор методов, который в дальнейшем будет развиваться. Он позволяет:
* Создавать данные информационной базы
* Генерировать случайные значения
* Автоматически удалять созданные данные (для этого необходимо включить настройку теста `УдалениеТестовыхДанных()`)
* Работать с файлами
* Использовать таблицы markdown в качестве макетов данных

View File

@ -31,9 +31,6 @@
Возврат Наборы;
КонецЕсли;
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПередВсемиТестамиМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
@ -51,8 +48,6 @@
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПослеВсехТестовМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
@ -71,9 +66,6 @@
Функция ВыполнитьНаборТестов(Набор, ТестовыйМодуль)
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
Набор.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередТестовымНабором(ТестовыйМодуль, Набор);
@ -82,7 +74,6 @@
КонецЕсли;
Результаты = Новый Массив();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Тест;
Для Каждого Тест Из Набор.Тесты Цикл
@ -98,7 +89,6 @@
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
ЮТСобытия.ПослеТестовогоНабора(ТестовыйМодуль, Набор);
Набор.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Набор.ДатаСтарта;

View File

@ -148,7 +148,11 @@
ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства;
ПараметрыЗаписи.ОбменДаннымиЗагрузка = ОбменДаннымиЗагрузка;
Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
Возврат Ссылка;
КонецФункции
@ -170,7 +174,11 @@
ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства;
ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение;
Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
Возврат Ссылка;
КонецФункции

View File

@ -222,21 +222,21 @@
КонецПроцедуры
Процедура УстановитьКонтекстНабораТестов(Знач ДанныеКонтекста) Экспорт
Процедура УстановитьКонтекстНабораТестов() Экспорт
УстановитьЗначениеКонтекста(ИмяКонтекстаНабораТестов(), ДанныеКонтекста);
УстановитьЗначениеКонтекста(ИмяКонтекстаНабораТестов(), Новый Структура);
КонецПроцедуры
Процедура УстановитьКонтекстМодуля(Знач ДанныеКонтекста) Экспорт
Процедура УстановитьКонтекстМодуля() Экспорт
УстановитьЗначениеКонтекста(ИмяКонтекстаМодуля(), ДанныеКонтекста);
УстановитьЗначениеКонтекста(ИмяКонтекстаМодуля(), Новый Структура);
КонецПроцедуры
Процедура УстановитьКонтекстТеста(Знач ДанныеКонтекста) Экспорт
Процедура УстановитьКонтекстТеста() Экспорт
УстановитьЗначениеКонтекста(ИмяКонтекстаТеста(), ДанныеКонтекста);
УстановитьЗначениеКонтекста(ИмяКонтекстаТеста(), Новый Структура);
КонецПроцедуры

View File

@ -30,19 +30,26 @@
Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень;
Уровни = ЮТФабрика.УровниИсполнения();
Если Уровень = Уровни.Тест И ЮТКонтекст.КонтекстТеста().Свойство(ИмяЗначения) Тогда
КонтекстТеста = ЮТКонтекст.КонтекстТеста();
Если Уровень = Уровни.Тест И КонтекстТеста <> Неопределено И КонтекстТеста.Свойство(ИмяЗначения) Тогда
Возврат ЮТКонтекст.КонтекстТеста()[ИмяЗначения];
Возврат КонтекстТеста[ИмяЗначения];
ИначеЕсли (Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов)
И ЮТКонтекст.КонтекстНабора().Свойство(ИмяЗначения) Тогда
КонецЕсли;
КонтекстНабора = ЮТКонтекст.КонтекстНабора();
Если (Уровень = Уровни.НаборТестов ИЛИ Уровень = Уровни.Тест)
И КонтекстНабора <> Неопределено И КонтекстНабора.Свойство(ИмяЗначения) Тогда
Возврат ЮТКонтекст.КонтекстНабора()[ИмяЗначения];
Возврат КонтекстНабора[ИмяЗначения];
ИначеЕсли (Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов ИЛИ Уровень = Уровни.Модуль)
И ЮТКонтекст.КонтекстМодуля().Свойство(ИмяЗначения) Тогда
КонецЕсли;
КонтекстМодуля = ЮТКонтекст.КонтекстМодуля();
Если (Уровень = Уровни.Модуль ИЛИ Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов)
И КонтекстМодуля <> Неопределено И КонтекстМодуля.Свойство(ИмяЗначения) Тогда
Возврат ЮТКонтекст.КонтекстМодуля()[ИмяЗначения];
Возврат КонтекстМодуля[ИмяЗначения];
Иначе
@ -63,20 +70,53 @@
Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень;
Уровни = ЮТФабрика.УровниИсполнения();
Если Уровень = Уровни.Тест Тогда
Контекст = ТекущийКонтекст();
Если Контекст = Неопределено Тогда
ЮТКонтекст.КонтекстТеста().Вставить(ИмяЗначения, Значение);
Если Уровень = Уровни.Тест Тогда
ЮТКонтекст.УстановитьКонтекстТеста();
ИначеЕсли Уровень = Уровни.НаборТестов Тогда
ЮТКонтекст.УстановитьКонтекстНабораТестов();
ИначеЕсли Уровень = Уровни.Модуль Тогда
ЮТКонтекст.УстановитьКонтекстМодуля();
Иначе
ВызватьИсключение СтрШаблон("Неизвестный уровень исполнения `%1`", Уровень);
КонецЕсли;
ИначеЕсли Уровень = Уровни.НаборТестов Тогда
ЮТКонтекст.КонтекстНабора().Вставить(ИмяЗначения, Значение);
ИначеЕсли Уровень = Уровни.Модуль Тогда
ЮТКонтекст.КонтекстМодуля().Вставить(ИмяЗначения, Значение);
Контекст = ТекущийКонтекст();
КонецЕсли;
Контекст.Вставить(ИмяЗначения, Значение);
КонецПроцедуры
Функция ТекущийКонтекст() Экспорт
Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень;
Уровни = ЮТФабрика.УровниИсполнения();
Если Уровень = Уровни.Тест Тогда
Контекст = ЮТКонтекст.КонтекстТеста();
ИначеЕсли Уровень = Уровни.НаборТестов Тогда
Контекст = ЮТКонтекст.КонтекстНабора();
ИначеЕсли Уровень = Уровни.Модуль Тогда
Контекст = ЮТКонтекст.КонтекстМодуля();
Иначе
Контекст = Неопределено;
КонецЕсли;
Возврат Контекст;
КонецФункции
#КонецОбласти

View File

@ -110,66 +110,44 @@
КонецФункции
Функция ОписаниеОбъектМетаданных(Знач Значение) Экспорт
Функция ОписаниеОбъектМетаданных(Знач Значение, ЗаполнятьРеквизиты = Истина) Экспорт
ТипЗначение = ТипЗнч(Значение);
Если ТипЗначение = Тип("Тип") Тогда
МетаданныеОбъекта = Метаданные.НайтиПоТипу(Значение);
ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
ИначеЕсли ТипЗначение = Тип("ОбъектМетаданных") Тогда
МетаданныеОбъекта = Значение;
ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
ИначеЕсли ТипЗначение = Тип("Строка") Тогда
ЧастиСтроки = СтрРазделить(Значение, ".");
Если ЧастиСтроки.Количество() = 2 Тогда
ТипыМетаданных = ЮТМетаданные.ТипыМетаданных();
ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]];
Если ОписаниеТипа <> Неопределено Тогда
МетаданныеОбъекта = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]];
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если МетаданныеОбъекта = Неопределено ИЛИ ОписаниеТипа = Неопределено Тогда
Сообщение = СтрШаблон("Не удалось получить описание метаданных для `%1` (%2)", Значение, ТипЗначение);
ВызватьИсключение Сообщение;
КонецЕсли;
МетаданныеОбъекта = ОбъектМетаданных(Значение);
ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
ОписаниеОбъект = Новый Структура;
ОписаниеОбъект.Вставить("Имя", МетаданныеОбъекта.Имя);
ОписаниеОбъект.Вставить("ОписаниеТипа", ОписаниеТипа);
ОписаниеОбъект.Вставить("Реквизиты", Новый Структура());
ОписаниеОбъект.Вставить("ТабличныеЧасти", Новый Структура());
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты);
Если НЕ ЗаполнятьРеквизиты Тогда
Возврат ОписаниеОбъект;
КонецЕсли;
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты, "Ссылка, Период");
Если ОписаниеТипа.Измерения Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Измерения, ОписаниеОбъект.Реквизиты);
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Измерения, ОписаниеОбъект.Реквизиты, Истина);
КонецЕсли;
Если ОписаниеТипа.Реквизиты Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Реквизиты, ОписаниеОбъект.Реквизиты);
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Реквизиты, ОписаниеОбъект.Реквизиты, Ложь);
КонецЕсли;
Если ОписаниеТипа.Ресурсы Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Ресурсы, ОписаниеОбъект.Реквизиты);
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Ресурсы, ОписаниеОбъект.Реквизиты, Ложь);
КонецЕсли;
Если ОписаниеТипа.РеквизитыАдресации Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.РеквизитыАдресации, ОписаниеОбъект.Реквизиты);
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.РеквизитыАдресации, ОписаниеОбъект.Реквизиты, Ложь);
КонецЕсли;
Если ОписаниеТипа.ТабличныеЧасти Тогда
Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл
РеквизитыТабличнойЧасти = Новый Структура();
ДобавитьОписанияРеквизитов(ТабличнаяЧасть.Реквизиты, РеквизитыТабличнойЧасти);
ДобавитьОписанияРеквизитов(ТабличнаяЧасть.Реквизиты, РеквизитыТабличнойЧасти, Ложь);
ОписаниеОбъект.ТабличныеЧасти.Вставить(ТабличнаяЧасть.Имя, РеквизитыТабличнойЧасти);
КонецЦикла;
@ -245,22 +223,69 @@
#Область СлужебныеПроцедурыИФункции
Процедура ДобавитьОписанияРеквизитов(КоллекцияРеквизитов, КоллекцияОписаний)
Функция ОбъектМетаданных(Значение)
ТипЗначение = ТипЗнч(Значение);
Если ТипЗначение = Тип("Тип") Тогда
ОбъектМетаданных = Метаданные.НайтиПоТипу(Значение);
ИначеЕсли ТипЗначение = Тип("ОбъектМетаданных") Тогда
ОбъектМетаданных = Значение;
ИначеЕсли ТипЗначение = Тип("Строка") Тогда
ЧастиСтроки = СтрРазделить(Значение, ".");
Если ЧастиСтроки.Количество() = 2 Тогда
ТипыМетаданных = ЮТМетаданные.ТипыМетаданных();
ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]];
Если ОписаниеТипа <> Неопределено Тогда
ОбъектМетаданных = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]];
КонецЕсли;
КонецЕсли;
Иначе
ОбъектМетаданных = Неопределено;
КонецЕсли;
Если ОбъектМетаданных = Неопределено Тогда
Сообщение = ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТМетаданныеСервер.ОбъектМетаданных", Значение);
ВызватьИсключение Сообщение;
КонецЕсли;
Возврат ОбъектМетаданных;
КонецФункции
Процедура ДобавитьОписанияРеквизитов(КоллекцияРеквизитов, КоллекцияОписаний, Знач ЭтоКлюч)
Если ТипЗнч(ЭтоКлюч) = Тип("Строка") Тогда
ИменаКлючевыхПолей = СтрРазделить(ЭтоКлюч, ", ");
КонецЕсли;
Для Каждого Реквизит Из КоллекцияРеквизитов Цикл
КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит));
Если ИменаКлючевыхПолей <> Неопределено Тогда
ЭтоКлюч = ИменаКлючевыхПолей.Найти(Реквизит.Имя) <> Неопределено;
КонецЕсли;
КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит, ЭтоКлюч));
КонецЦикла;
КонецПроцедуры
Функция ОписаниеРеквизита(Реквизит) Экспорт
Функция ОписаниеРеквизита(Реквизит, ЭтоКлюч) Экспорт
Описание = Новый Структура();
Описание.Вставить("Имя", Реквизит.Имя);
Описание.Вставить("Тип", Реквизит.Тип);
Описание.Вставить("Обязательный", Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку);
Описание.Вставить("ЭтоКлюч", ЭтоКлюч);
Возврат Описание;

View File

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

View File

@ -790,6 +790,12 @@
КонецПроцедуры
Функция НеподдерживаемыйПараметрМетода(ИмяМетода, ЗначениеПараметра) Экспорт
Возврат СтрШаблон("Неподдерживаемый параметры метода `%1` `%2`(%3)", ИмяМетода, ЗначениеПараметра, ТипЗнч(ЗначениеПараметра));
КонецФункции
Функция УстановленБезопасныйРежим() Экспорт
Возврат ЮТОбщийВызовСервера.УстановленБезопасныйРежим();

View File

@ -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 @@
КонецПроцедуры
Функция ВТранзакции(ОписаниеСобытия)
ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().ВТранзакции;
Возврат ЮТНастройкиВыполнения.ЗначениеНастройкиТеста(ИмяПараметра, ОписаниеСобытия.Тест, ОписаниеСобытия.Набор, Ложь);
КонецФункции
#КонецОбласти

View File

@ -29,7 +29,9 @@
// ЛюбаяСсылка - Ссылка на созданный объект
Функция СоздатьЭлемент(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено) Экспорт
Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЭлемент(Менеджер, Наименование, Реквизиты);
Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЭлемент(Менеджер, Наименование, Реквизиты);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
Возврат Ссылка;
КонецФункции
@ -43,7 +45,9 @@
// ДокументСсылка - Ссылка на созданный объект
Функция СоздатьДокумент(Менеджер, Реквизиты = Неопределено) Экспорт
Возврат ЮТТестовыеДанныеВызовСервера.СоздатьДокумент(Менеджер, Реквизиты);
Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьДокумент(Менеджер, Реквизиты);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
Возврат Ссылка;
КонецФункции
@ -259,9 +263,7 @@
// Строка
Функция НовоеИмяВременногоФайла(Расширение = Неопределено) Экспорт
Результат = ПолучитьИмяВременногоФайла(Расширение);
ЮТКонтекст.КонтекстТеста().ВременныеФайлы.Добавить(Результат);
Возврат Результат;
Возврат ЮТТестовыеДанныеСлужебный.НовоеИмяВременногоФайла(Расширение);
КонецФункции
@ -392,7 +394,9 @@
// Ссылки - Массив из ЛюбаяСсылка
Процедура Удалить(Ссылки) Экспорт
ЮТТестовыеДанныеВызовСервера.Удалить(Ссылки);
Если ЗначениеЗаполнено(Ссылки) Тогда
ЮТТестовыеДанныеВызовСервера.Удалить(Ссылки);
КонецЕсли;
КонецПроцедуры
@ -409,84 +413,3 @@
#КонецЕсли
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Обработчик события "ПередКаждымТестом"
//
// Параметры:
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
Процедура ПередКаждымТестом(ОписаниеСобытия) Экспорт
ЮТКонтекст.КонтекстТеста().Вставить("ВременныеФайлы", Новый Массив);
КонецПроцедуры
// Обработчик события "ПослеКаждогоТеста"
//
// Параметры:
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
ВременныеФайлы = ЮТКонтекст.КонтекстТеста().ВременныеФайлы;
Если ВременныеФайлы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Ошибки = Новый Массив();
Для Каждого УдаляемыйФайл Из ВременныеФайлы Цикл
Если ТипЗнч(УдаляемыйФайл) = Тип("Строка") Тогда
УдаляемыйФайл = Новый Файл(УдаляемыйФайл);
КонецЕсли;
Попытка
Если УдаляемыйФайл.Существует() Тогда
Если УдаляемыйФайл.ПолучитьТолькоЧтение() Тогда
УдаляемыйФайл.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
УдалитьФайлы(УдаляемыйФайл.ПолноеИмя);
КонецЕсли;
Исключение
Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление файла " + УдаляемыйФайл, ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
Если ЗначениеЗаполнено(Ошибки) Тогда
ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ДобавитьВарианты(Варианты, БазоваяСтруктура, ЗначенияПараметров, Ключи, Инд)
Если Инд > Ключи.ВГраница() Тогда
Возврат;
КонецЕсли;
Ключ = Ключи[Инд];
Для Каждого Значение Из ЗначенияПараметров[Ключ] Цикл
Вариант = ЮТОбщий.СкопироватьСтруктуру(БазоваяСтруктура);
Вариант[Ключ] = Значение;
Варианты.Добавить(Вариант);
ДобавитьВарианты(Варианты, Вариант, ЗначенияПараметров, Ключи, Инд + 1);
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -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", ОписаниеОбъектМетаданных.ОписаниеТипа.Имя, ОписаниеОбъектМетаданных.Имя));
КонецФункции
#КонецОбласти

View File

@ -66,20 +66,83 @@
ИначеЕсли ЭтоСистемноеПеречисление(Тип) Тогда
Значение = СлучайноЗначениеСистемногоПеречисления(Тип);
Иначе
Значение = ЮТТестовыеДанныеВызовСервера.ФикцияЗначенияБазы(Тип);
ДобавитьТестовуюЗапись(Значение);
КонецЕсли;
Если Значение = Неопределено Тогда
ВызватьИсключение СтрШаблон("Создание фейковых значений для `%1` не поддерживается", ОписаниеТипа);
КонецЕсли;
Возврат ОписаниеТипа.ПривестиЗначение(Значение);
КонецФункции
// см. ЮТТестовыеДанные.НовоеИмяВременногоФайла
Функция НовоеИмяВременногоФайла(Расширение = Неопределено) Экспорт
//@skip-check missing-temporary-file-deletion
Результат = ПолучитьИмяВременногоФайла(Расширение); // BSLLS:MissingTemporaryFileDeletion-off
ДобавитьВременныйФайл(Результат);
Возврат Результат;
КонецФункции
Процедура ДобавитьВременныйФайл(Файл) Экспорт
БуферВременныеФайлы().Добавить(Файл);
КонецПроцедуры
Процедура ДобавитьТестовуюЗапись(Запись) Экспорт
#Если Сервер Тогда
Если ТранзакцияАктивна() И ЮТНастройкиВыполнения.ВТранзакции() Тогда
Возврат;
КонецЕсли;
#КонецЕсли
Если ЮТНастройкиВыполнения.УдалениеТестовыхДанных() Тогда
БуферТестовыеДанные().Добавить(Запись);
КонецЕсли;
КонецПроцедуры
Процедура УдалитьТестовыеДанные() Экспорт
ЮТФайлы.УдалитьВременныеФайлы(БуферВременныеФайлы());
Если ЮТНастройкиВыполнения.УдалениеТестовыхДанных() Тогда
ЮТТестовыеДанные.Удалить(БуферТестовыеДанные());
КонецЕсли;
КонецПроцедуры
#Область ОбработчикиСобытий
Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста
КонецПроцедуры
Процедура ПослеТестовогоНабора(ОписаниеСобытия) Экспорт
УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста
КонецПроцедуры
Процедура ПослеВсехТестов(ОписаниеСобытия) Экспорт
УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -129,4 +192,31 @@
КонецФункции
Функция БуферВременныеФайлы()
Возврат Буфер("ВременныеФайлы");
КонецФункции
Функция БуферТестовыеДанные()
Возврат Буфер("ТестовыеДанные");
КонецФункции
Функция Буфер(Ключ)
ТекущийКонтекст = ЮТест.Контекст().ТекущийКонтекст();
Если ТекущийКонтекст.Свойство(Ключ) Тогда
Буфер = ТекущийКонтекст[Ключ];
Иначе
Буфер = Новый Массив();
ТекущийКонтекст.Вставить(Ключ, Буфер);
КонецЕсли;
Возврат Буфер;
КонецФункции
#КонецОбласти

View File

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

View File

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

View File

@ -103,6 +103,49 @@
КонецФункции
// Удаляет файлы
//
// Параметры:
// Файлы - Массив из Файл
// - Массив из Строка
Процедура УдалитьВременныеФайлы(Файлы) Экспорт
Если НЕ ЗначениеЗаполнено(Файлы) Тогда
Возврат;
КонецЕсли;
Ошибки = Новый Массив();
Для Каждого УдаляемыйФайл Из Файлы Цикл
Если ТипЗнч(УдаляемыйФайл) = Тип("Строка") Тогда
УдаляемыйФайл = Новый Файл(УдаляемыйФайл);
КонецЕсли;
Попытка
Если УдаляемыйФайл.Существует() Тогда
Если УдаляемыйФайл.ПолучитьТолькоЧтение() Тогда
УдаляемыйФайл.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
УдалитьФайлы(УдаляемыйФайл.ПолноеИмя);
КонецЕсли;
Исключение
Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление файла " + УдаляемыйФайл, ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
Если ЗначениеЗаполнено(Ошибки) Тогда
ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -9,7 +9,7 @@
<includeInCommandInterface>true</includeInCommandInterface>
<content>CommonModule.МокитоСлужебный</content>
<content>CommonModule.ЮТЛогирование</content>
<content>CommonModule.ЮТТестовыеДанные</content>
<content>CommonModule.ЮТТестовыеДанныеСлужебный</content>
<content>CommonModule.ЮТУтверждения</content>
<parentSubsystem>Subsystem.ЮТФункциональность</parentSubsystem>
</mdclass:Subsystem>

View File

@ -25,7 +25,7 @@
.ДобавитьТест("Обучение_ЦепочкаВызовов")
.ДобавитьТест("Проверить")
.ДобавитьТест("Прогон_НакоплениеСтатистики").СПараметрами(Истина).СПараметрами(Ложь)
.ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов")
.ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов").ВТранзакции()
;
КонецПроцедуры

View File

@ -20,7 +20,7 @@
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты.ВТранзакции()
ЮТТесты.ВТранзакции().УдалениеТестовыхДанных()
.ДобавитьТест("ЗначенияРеквизитов")
.ДобавитьТест("ЗначениеРеквизита")
.ДобавитьТест("ТаблицаСодержитЗаписи")

View File

@ -20,7 +20,7 @@
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты.ВТранзакции()
ЮТТесты.ВТранзакции().УдалениеТестовыхДанных()
.ДобавитьТест("ЗаполнитьСправочник")
.ДобавитьТест("ЗаполнитьДокумент")
;

View File

@ -21,6 +21,8 @@
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ВТранзакции()
.УдалениеТестовыхДанных()
.ДобавитьТест("Удалить");
;

View File

@ -20,7 +20,12 @@
Процедура ИсполняемыеСценарии() Экспорт
КодТовара = ЮТОбщий.ЧислоВСтроку(ЮТест.Данные().СлучайноеПоложительноеЧисло(999999999));
Период = ТекущаяДата();
ЮТТесты
.ВТранзакции()
.УдалениеТестовыхДанных()
.ДобавитьТест("Фикция")
.СПараметрами(Новый ОписаниеТипов("Число"))
.СПараметрами(Новый ОписаниеТипов("Строка"))
@ -35,6 +40,16 @@
.СПараметрами(Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыХарактеристик"))
.СПараметрами(Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыХарактеристик, СправочникСсылка.Банки, ПеречислениеСсылка.СостоянияЗаказов"))
.СПараметрами(Новый ОписаниеТипов("ВидДвиженияНакопления"))
.ДобавитьТест("УдалениеТестовыхДанныхСправочник")
.СПараметрами(КодТовара)
.СПараметрами(КодТовара)
.ДобавитьТест("УдалениеТестовыхДанныхДокумент")
.СПараметрами(КодТовара)
.СПараметрами(КодТовара)
.ДобавитьТест("УдалениеТестовыхДанныхРегистрСведений")
.СПараметрами(Период)
.СПараметрами(Период)
.ДобавитьТест("НеУдалениеТестовыхДанныхВызовСервера")
;
КонецПроцедуры
@ -49,5 +64,100 @@
КонецПроцедуры
Процедура УдалениеТестовыхДанныхСправочник(Код) Экспорт
СоздатьСсылку("Тест", Код);
Ссылки = ЮТест.Контекст().Значение("Ссылки");
СсылкаСуществует(Ссылки.Набор, "Набор");
КонецПроцедуры
Процедура НеУдалениеТестовыхДанныхВызовСервера() Экспорт
Ссылка = ПомощникТестированияВызовСервера.НовыйТовар();
ЮТест.Контекст().Значение("Ссылки").Вставить("ТестВызовСервера", Ссылка);
КонецПроцедуры
Процедура УдалениеТестовыхДанныхДокумент(НомерДокумента) Экспорт
ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара")
.Установить("Номер", НомерДокумента)
.Провести();
КонецПроцедуры
Процедура УдалениеТестовыхДанныхРегистрСведений(Период) Экспорт
ЮТест.ОжидаетЧтоТаблицаБазы("РегистрСведений.КурсыВалют").НеСодержитЗаписи(ЮТест.Предикат().Реквизит("Период").Равно(Период));
ЮТест.Данные().КонструкторОбъекта("РегистрыСведений.КурсыВалют")
.Фикция("Валюта")
.Фикция("Курс")
.Установить("Период", Период)
.Записать();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ПередВсемиТестами() Экспорт
Ссылки = Новый Структура("Набор, Тест");
ЮТест.Контекст().УстановитьЗначение("Ссылки", Ссылки);
КонецПроцедуры
Процедура ПередТестовымНабором() Экспорт
СоздатьСсылку("Набор");
КонецПроцедуры
Процедура ПослеВсехТестов() Экспорт
Ссылки = ЮТест.Контекст().Значение("Ссылки");
СсылкаНеСуществует(Ссылки.Набор, "Набор");
Если Ссылки.Тест <> Неопределено Тогда
СсылкаНеСуществует(Ссылки.Тест, "Тест");
КонецЕсли;
#Если Сервер Тогда
СсылкаНеСуществует(Ссылки.ТестВызовСервера, "ТестВызовСервера");
#Иначе
СсылкаСуществует(Ссылки.ТестВызовСервера, "ТестВызовСервера");
#КонецЕсли
КонецПроцедуры
Процедура СоздатьСсылку(ИмяПеременной, Знач Код = Неопределено)
Если Код = Неопределено Тогда
Код = ЮТОбщий.ЧислоВСтроку(ЮТест.Данные().СлучайноеПоложительноеЧисло(999999999));
КонецЕсли;
Ссылка = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары")
.Установить("Наименование", Код)
.Установить("Код", Код)
.Записать();
ЮТест.Контекст().Значение("Ссылки").Вставить(ИмяПеременной, Ссылка);
КонецПроцедуры
Процедура СсылкаСуществует(Ссылка, Описание)
ЮТест.ОжидаетЧто(Ссылка, Описание).ИмеетТип("СправочникСсылка.Товары");
ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары", Описание).СодержитЗаписи(ЮТест.Предикат().Реквизит("Ссылка").Равно(Ссылка));
КонецПроцедуры
Процедура СсылкаНеСуществует(Ссылка, Описание)
ЮТест.ОжидаетЧто(Ссылка, Описание).ИмеетТип("СправочникСсылка.Товары");
ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары", Описание).НеСодержитЗаписи(ЮТест.Предикат().Реквизит("Ссылка").Равно(Ссылка));
КонецПроцедуры
#КонецОбласти

View File

@ -20,7 +20,7 @@
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты.ВТранзакции()
ЮТТесты.ВТранзакции().УдалениеТестовыхДанных()
.ДобавитьТест("СодержитЗаписи")
.ДобавитьТест("НеСодержитЗаписи")
.ДобавитьТест("СообщенияОбОшибках")

View File

@ -16,11 +16,7 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
///////////////////////////////////////////////////////////////////
// ПрограммныйИнтерфейс
// Экспортные процедуры и функции для прикладного использования
///////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#Область СлужебныйПрограммныйИнтерфейс
// Проверяет существование ссылки в информационной базе
//
@ -54,4 +50,17 @@
КонецФункции
Функция НовыйТовар(Знач Код = Неопределено) Экспорт
Если Код = Неопределено Тогда
Код = ЮТОбщий.ЧислоВСтроку(ЮТест.Данные().СлучайноеПоложительноеЧисло(999999999));
КонецЕсли;
Возврат ЮТест.Данные().КонструкторОбъекта("Справочники.Товары")
.Установить("Наименование", Код)
.Установить("Код", Код)
.Записать();
КонецФункции
#КонецОбласти