1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-03-29 21:21:08 +02:00

Запустил тесты в асинхронном режиме

This commit is contained in:
alkoleft 2023-04-07 03:28:31 +03:00
parent 9b89c46fcc
commit cb5a68f126
17 changed files with 395 additions and 535 deletions

View File

@ -1,409 +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.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#Если Клиент Тогда
// ВыполнитьМодульноеТестирование
// Метод, по параметрам запуска, запускает выполнение всего процесса тестирования.
//
// Параметры:
// Параметры - См. ЮТФабрика.ПараметрыЗапуска
Процедура ВыполнитьМодульноеТестирование(Параметры = Неопределено) Экспорт
Если Параметры = Неопределено Тогда
Параметры = ЮТПараметрыЗапуска.ПараметрыЗапуска(ПараметрЗапуска, Неопределено);
КонецЕсли;
Если НЕ Параметры.ВыполнятьМодульноеТестирование Тогда
Возврат;
КонецЕсли;
ЮТКонтекст.ИнициализироватьКонтекст();
ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(Параметры.settings);
ЮТСобытия.Инициализация(Параметры);
// Повторно сохраним для передачи на сервер
ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(ЮТКонтекст.ГлобальныеНастройкиВыполнения());
ЮТКонтекст.УстановитьКонтекстИсполнения(ЮТФабрика.НовыйКонтекстИсполнения());
ЮТСобытия.ПередЧтениеСценариев();
ТестовыеМодули = ЮТЧитатель.ЗагрузитьТесты(Параметры);
ЮТСобытия.ПослеЧтенияСценариев(ТестовыеМодули);
РезультатыТестирования = Новый Массив();
КоллекцияКатегорийНаборов = Новый Массив();
Для Каждого ТестовыйМодуль Из ТестовыеМодули Цикл
КатегорииНаборов = КатегорииНаборовТестовМодуля(ТестовыйМодуль);
КоллекцияКатегорийНаборов.Добавить(КатегорииНаборов);
КонецЦикла;
ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов);
Для Каждого КатегорииНаборов Из КоллекцияКатегорийНаборов Цикл
Результат = ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Клиентские, КатегорииНаборов.ТестовыйМодуль);
ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат);
Результат = ЮТИсполнительСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Серверные, КатегорииНаборов.ТестовыйМодуль);
ЮТЛогирование.ВывестиСерверныеСообщения();
ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат);
ЮТОбщий.ДополнитьМассив(РезультатыТестирования, КатегорииНаборов.Пропущенные);
КонецЦикла;
ЮТОтчет.СформироватьОтчет(РезультатыТестирования, Параметры);
ЗаписатьКодВозврата(РезультатыТестирования, Параметры);
Если Параметры.showReport Тогда
ПоказатьОтчет(РезультатыТестирования, Параметры);
ИначеЕсли Параметры.CloseAfterTests Тогда
ПрекратитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
#КонецЕсли
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// Выполняет тесты группы наборов, соответствующих одному режиму выполнения (клиент/сервер)
// Параметры:
// Наборы - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Результат прогона наборов тестов с заполненной информацией о выполнении
Функция ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль) Экспорт
Если Наборы.Количество() = 0 Тогда
Возврат Наборы;
КонецЕсли;
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПередВсемиТестамиМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
СкопироватьОшибкиВ(Наборы, ТестовыйМодуль.Ошибки);
Возврат Наборы;
КонецЕсли;
Для Каждого Набор Из Наборы Цикл
Результат = ВыполнитьНаборТестов(Набор, ТестовыйМодуль);
Если Результат <> Неопределено Тогда
Набор.Тесты = Результат;
КонецЕсли;
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПослеВсехТестовМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
СкопироватьОшибкиВ(Наборы, ТестовыйМодуль.Ошибки);
КонецЕсли;
ТестовыйМодуль.Ошибки.Очистить(); // Эти ошибки используются как буфер и уже скопированы в наборы, но ломают последующие наборы
Возврат Наборы;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ВыполнитьНаборТестов(Набор, ТестовыйМодуль)
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
Набор.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередТестовымНабором(ТестовыйМодуль, Набор);
Если ЕстьОшибки(Набор) Тогда
Возврат Неопределено;
КонецЕсли;
Результаты = Новый Массив();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Тест;
Для Каждого Тест Из Набор.Тесты Цикл
Тест.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередКаждымТестом(ТестовыйМодуль, Набор, Тест);
ВыполнитьТестовыйМетод(Тест);
ЮТСобытия.ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест);
ОбработатьЗавершениеТеста(Тест);
Результаты.Добавить(Тест);
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
ЮТСобытия.ПослеТестовогоНабора(ТестовыйМодуль, Набор);
Набор.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Набор.ДатаСтарта;
Возврат Результаты;
КонецФункции
Процедура ОбработатьЗавершениеТеста(Тест)
Тест.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Тест.ДатаСтарта;
Тест.Статус = ЮТРегистрацияОшибок.СтатусВыполненияТеста(Тест);
КонецПроцедуры
Функция КатегорииНаборовТестовМодуля(ТестовыйМодуль)
КатегорииНаборов = ОписаниеКатегорияНабораТестов(ТестовыйМодуль);
ИсполняемыеТестовыеНаборы = Новый Массив;
Для Каждого ТестовыйНабор Из ТестовыйМодуль.НаборыТестов Цикл
НаборыКонтекстов = Новый Структура;
ТестыНабора = ЮТОбщий.ЗначениеСтруктуры(ТестовыйНабор, "Тесты", Новый Массив());
Для Каждого Тест Из ТестыНабора Цикл
Для Каждого Контекст Из Тест.КонтекстВызова Цикл
Если НЕ НаборыКонтекстов.Свойство(Контекст) Тогда
ИсполняемыйНабор = ЮТФабрика.ОписаниеИсполняемогоНабораТестов(ТестовыйНабор, ТестовыйМодуль);
ИсполняемыйНабор.Режим = Контекст;
НаборыКонтекстов.Вставить(Контекст, ИсполняемыйНабор);
Иначе
ИсполняемыйНабор = НаборыКонтекстов[Контекст];
КонецЕсли;
ИсполняемыйТест = ЮТФабрика.ОписаниеИсполняемогоТеста(Тест, Контекст, ТестовыйМодуль);
ИсполняемыйНабор.Тесты.Добавить(ИсполняемыйТест);
КонецЦикла;
КонецЦикла;
Если НаборыКонтекстов.Количество() Тогда
Для Каждого Элемент Из НаборыКонтекстов Цикл
ИсполняемыеТестовыеНаборы.Добавить(Элемент.Значение);
КонецЦикла;
Иначе
// TODO. Корякин А. 2021.11.24 А надо ли добавлять при отсутствии тестов
ИсполняемыеТестовыеНаборы.Добавить(ЮТФабрика.ОписаниеИсполняемогоНабораТестов(ТестовыйНабор, ТестовыйМодуль));
КонецЕсли;
КонецЦикла;
КонтекстыПриложения = ЮТФабрика.КонтекстыПриложения();
КонтекстыМодуля = ЮТФабрика.КонтекстыМодуля(ТестовыйМодуль.МетаданныеМодуля);
КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения();
Для Каждого Набор Из ИсполняемыеТестовыеНаборы Цикл
КонтекстИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим);
ОшибкаКонтекста = Неопределено;
Если КонтекстыПриложения.Найти(Набор.Режим) = Неопределено Тогда
ОшибкаКонтекста = "Неподдерживаемый режим запуска";
ИначеЕсли КонтекстыМодуля.Найти(Набор.Режим) = Неопределено Тогда
ОшибкаКонтекста = "Модуль не доступен в этом контексте";
ИначеЕсли КонтекстИсполнения <> КонтекстыИсполнения.Сервер И КонтекстИсполнения <> КонтекстыИсполнения.Клиент Тогда
ОшибкаКонтекста = "Неизвестный контекст/режим исполнения";
КонецЕсли;
Если ОшибкаКонтекста <> Неопределено Тогда
Набор.Выполнять = Ложь;
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Набор, ОшибкаКонтекста);
Для Каждого Тест Из Набор.Тесты Цикл
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Тест, ОшибкаКонтекста);
КонецЦикла;
КонецЕсли;
Если НЕ Набор.Выполнять Тогда
КатегорииНаборов.Пропущенные.Добавить(Набор);
Продолжить;
КонецЕсли;
Если КонтекстИсполнения = КонтекстыИсполнения.Сервер Тогда
КатегорииНаборов.Серверные.Добавить(Набор);
ИначеЕсли КонтекстИсполнения = КонтекстыИсполнения.Клиент Тогда
КатегорииНаборов.Клиентские.Добавить(Набор);
КонецЕсли;
КонецЦикла;
Возврат КатегорииНаборов;
КонецФункции
Функция ЕстьОшибки(Объект)
Возврат ЗначениеЗаполнено(Объект.Ошибки);
КонецФункции
Процедура ВыполнитьТестовыйМетод(Тест)
Если ЕстьОшибки(Тест) Тогда
Возврат;
КонецЕсли;
СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста();
Тест.Статус = СтатусыИсполненияТеста.Исполнение;
Ошибка = ЮТОбщий.ВыполнитьМетод(Тест.ПолноеИмяМетода, Тест.Параметры);
Если Ошибка <> Неопределено Тогда
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуВыполненияТеста(Тест, Ошибка);
КонецЕсли;
КонецПроцедуры
Процедура СкопироватьОшибкиВ(Объекты, Ошибки)
Для Каждого Объект Из Объекты Цикл
ЮТОбщий.ДополнитьМассив(Объект.Ошибки, Ошибки);
Если Объект.Свойство("Статус") Тогда
Объект.Статус = ЮТФабрика.СтатусыИсполненияТеста().Сломан;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Описание категория набора тестов.
//
// Параметры:
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Структура - Описание категория набора тестов:
// * ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
// * Клиентские - Массив из ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Серверные - Массив из ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Пропущенные - Массив из ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Функция ОписаниеКатегорияНабораТестов(ТестовыйМодуль)
КатегорииНаборов = Новый Структура();
КатегорииНаборов.Вставить("ТестовыйМодуль", ТестовыйМодуль);
КатегорииНаборов.Вставить("Клиентские", Новый Массив());
КатегорииНаборов.Вставить("Серверные", Новый Массив());
КатегорииНаборов.Вставить("Пропущенные", Новый Массив());
Возврат КатегорииНаборов;
КонецФункции
#Если Клиент Тогда
Процедура ПоказатьОтчет(РезультатыТестирования, Параметры)
Данные = Новый Структура("РезультатыТестирования, ПараметрыЗапуска", РезультатыТестирования, Параметры);
АдресДанных = ПоместитьВоВременноеХранилище(Данные);
ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.Основная", Новый Структура("АдресХранилища", АдресДанных));
КонецПроцедуры
#КонецЕсли
// Записать код возврата.
//
// Параметры:
// РезультатыТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// Параметры - см. ЮТФабрика.ПараметрыЗапуска
Процедура ЗаписатьКодВозврата(РезультатыТестирования, Параметры)
Успешно = Истина;
Если ПустаяСтрока(Параметры.exitCode) Тогда
Возврат;
КонецЕсли;
Для Каждого Набор Из РезультатыТестирования Цикл
Если ЕстьОшибки(Набор) Тогда
Успешно = Ложь;
Прервать;
КонецЕсли;
Для Каждого Тест Из Набор.Тесты Цикл
Если ЕстьОшибки(Тест) Тогда
Успешно = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Успешно Тогда
Прервать;
КонецЕсли;
КонецЦикла;
#Если ВебКлиент Тогда
ЮТОбщий.МетодНеДоступен("ЮТИсполнитель.ЗаписатьКодВозврата");
#Иначе
Запись = Новый ЗаписьТекста(Параметры.exitCode, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку(?(Успешно, 0, 1));
Запись.Закрыть();
#КонецЕсли
КонецПроцедуры
#КонецОбласти

View File

@ -27,18 +27,38 @@
ПараметрыИсполнения = ПараметрыИсполнения();
ПараметрыИсполнения.АргументыЗапуска = ПараметрЗапуска;
ПараметрыИсполнения.Цепочка.Добавить(Новый ОписаниеОповещения("ОбработчикЗагрузитьПараметры", ЭтотОбъект, ПараметрыИсполнения));
ПараметрыИсполнения.Цепочка.Добавить(Новый ОписаниеОповещения("ОбработчикАнализПараметровЗапуска", ЭтотОбъект, ПараметрыИсполнения));
ПараметрыИсполнения.Цепочка.Добавить(Новый ОписаниеОповещения("ОбработчикЗагрузитьТесты", ЭтотОбъект, ПараметрыИсполнения));
ПараметрыИсполнения.Цепочка.Добавить(Новый ОписаниеОповещения("ОбработчикВыполнитьТестирование", ЭтотОбъект, ПараметрыИсполнения));
ПараметрыИсполнения.Цепочка.Добавить(Новый ОписаниеОповещения("ОбработчикСохранитьОтчет", ЭтотОбъект, ПараметрыИсполнения));
ПараметрыИсполнения.Цепочка.Добавить(Новый ОписаниеОповещения("ОбработчикСохранитьКодВозврата", ЭтотОбъект, ПараметрыИсполнения));
ПараметрыИсполнения.Цепочка.Добавить(Новый ОписаниеОповещения("ОбработчикЗавершить", ЭтотОбъект, ПараметрыИсполнения));
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьПараметры");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикАнализПараметровЗапуска");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьОтчет");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьКодВозврата");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗавершить");
ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
Процедура ВызватьОбработчик(Обработчик, Результат = Неопределено) Экспорт
Если Обработчик <> Неопределено Тогда
ВыполнитьОбработкуОповещения(Обработчик, Результат);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ОбработчикиЦепочкиДействий
Процедура ОбработчикОшибки(ИнформацияОбОшибки, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт
// TODO Подумать надо ли и как реализовать нормально
КонецПроцедуры
Процедура ОбработчикЗагрузитьПараметры(Результат, ДополнительныеПараметры) Экспорт
Обработчик = СледующийОбработчик(ДополнительныеПараметры);
@ -94,7 +114,7 @@
Для Каждого КатегорииНаборов Из КоллекцияКатегорийНаборов Цикл
Результат = Новый Массив;// ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Клиентские, КатегорииНаборов.ТестовыйМодуль);
Результат = ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Клиентские, КатегорииНаборов.ТестовыйМодуль);
ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат);
Результат = ЮТИсполнительСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Серверные, КатегорииНаборов.ТестовыйМодуль);
@ -113,13 +133,18 @@
Процедура ОбработчикСохранитьОтчет(Результат, ДополнительныеПараметры) Экспорт
Обработчик = СледующийОбработчик(ДополнительныеПараметры);
ЮТОтчет.СформироватьОтчет(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска, Обработчик);
Если ЗначениеЗаполнено(ДополнительныеПараметры.ПараметрыЗапуска.reportPath) Тогда
Обработчик = СледующийОбработчик(ДополнительныеПараметры);
ЮТОтчет.СформироватьОтчет(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска, Обработчик);
Иначе
ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
Процедура ОбработчикСохранитьКодВозврата(Результат, ДополнительныеПараметры) Экспорт
ЗаписатьКодВозврата(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска);
ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
@ -136,18 +161,8 @@
КонецПроцедуры
Процедура ВызватьОбработчик(Обработчик, Результат) Экспорт
Если Обработчик <> Неопределено Тогда
ВыполнитьОбработкуОповещения(Обработчик, Результат);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ВызватьСледующийОбработчик(ПараметрыИсполнения, Результат = Неопределено)
Обработчик = СледующийОбработчик(ПараметрыИсполнения);
@ -162,6 +177,13 @@
КонецФункции
Процедура ДобавитьОбработчикЦепочки(ПараметрыИсполнения, ИмяМетода)
Обработчик = Новый ОписаниеОповещения(ИмяМетода, ЭтотОбъект, ПараметрыИсполнения, "ОбработчикОшибки", ЭтотОбъект);
ПараметрыИсполнения.Цепочка.Добавить(Обработчик);
КонецПроцедуры
Функция ПараметрыИсполнения()
Параметры = Новый Структура();
@ -171,13 +193,14 @@
Параметры.Вставить("ИндексСледующегоОбработчика", -1);
Параметры.Вставить("КоллекцияКатегорийНаборов");
Параметры.Вставить("РезультатыТестирования");
Возврат Параметры;
КонецФункции
Функция КатегорииНаборовТестовМодуля(ТестовыйМодуль)
КатегорииНаборов = ОписаниеКатегорияНабораТестов(ТестовыйМодуль);
КатегорииНаборов = ЮТФабрика.ОписаниеКатегорияНабораТестов(ТестовыйМодуль);
ИсполняемыеТестовыеНаборы = Новый Массив;
@ -267,29 +290,6 @@
КонецФункции
// Описание категория набора тестов.
//
// Параметры:
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Структура - Описание категория набора тестов:
// * ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
// * Клиентские - Массив из ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Серверные - Массив из ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Пропущенные - Массив из ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Функция ОписаниеКатегорияНабораТестов(ТестовыйМодуль)
КатегорииНаборов = Новый Структура();
КатегорииНаборов.Вставить("ТестовыйМодуль", ТестовыйМодуль);
КатегорииНаборов.Вставить("Клиентские", Новый Массив());
КатегорииНаборов.Вставить("Серверные", Новый Массив());
КатегорииНаборов.Вставить("Пропущенные", Новый Массив());
Возврат КатегорииНаборов;
КонецФункции
Процедура ПоказатьОтчет(РезультатыТестирования, Параметры)
Данные = Новый Структура("РезультатыТестирования, ПараметрыЗапуска", РезультатыТестирования, Параметры);
@ -299,4 +299,49 @@
КонецПроцедуры
// Записать код возврата.
//
// Параметры:
// РезультатыТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// Параметры - см. ЮТФабрика.ПараметрыЗапуска
Процедура ЗаписатьКодВозврата(РезультатыТестирования, Параметры)
Успешно = Истина;
Если ПустаяСтрока(Параметры.exitCode) Тогда
Возврат;
КонецЕсли;
Для Каждого Набор Из РезультатыТестирования Цикл
Если ЗначениеЗаполнено(Набор.Ошибки) Тогда
Успешно = Ложь;
Прервать;
КонецЕсли;
Для Каждого Тест Из Набор.Тесты Цикл
Если ЗначениеЗаполнено(Тест.Ошибки) Тогда
Успешно = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Успешно Тогда
Прервать;
КонецЕсли;
КонецЦикла;
#Если ВебКлиент Тогда
ЮТОбщий.МетодНеДоступен("ЮТИсполнительКлиент.ЗаписатьКодВозврата");
#Иначе
Запись = Новый ЗаписьТекста(Параметры.exitCode, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку(?(Успешно, 0, 1));
Запись.Закрыть();
#КонецЕсли
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,162 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// 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.
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// Выполняет тесты группы наборов, соответствующих одному режиму выполнения (клиент/сервер)
// Параметры:
// Наборы - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Результат прогона наборов тестов с заполненной информацией о выполнении
Функция ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль) Экспорт
Если Наборы.Количество() = 0 Тогда
Возврат Наборы;
КонецЕсли;
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПередВсемиТестамиМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
СкопироватьОшибкиВ(Наборы, ТестовыйМодуль.Ошибки);
Возврат Наборы;
КонецЕсли;
Для Каждого Набор Из Наборы Цикл
Результат = ВыполнитьНаборТестов(Набор, ТестовыйМодуль);
Если Результат <> Неопределено Тогда
Набор.Тесты = Результат;
КонецЕсли;
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПослеВсехТестовМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
СкопироватьОшибкиВ(Наборы, ТестовыйМодуль.Ошибки);
КонецЕсли;
ТестовыйМодуль.Ошибки.Очистить(); // Эти ошибки используются как буфер и уже скопированы в наборы, но ломают последующие наборы
Возврат Наборы;
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ВыполнитьНаборТестов(Набор, ТестовыйМодуль)
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
Набор.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередТестовымНабором(ТестовыйМодуль, Набор);
Если ЕстьОшибки(Набор) Тогда
Возврат Неопределено;
КонецЕсли;
Результаты = Новый Массив();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Тест;
Для Каждого Тест Из Набор.Тесты Цикл
Тест.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередКаждымТестом(ТестовыйМодуль, Набор, Тест);
ВыполнитьТестовыйМетод(Тест);
ЮТСобытия.ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест);
ОбработатьЗавершениеТеста(Тест);
Результаты.Добавить(Тест);
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
ЮТСобытия.ПослеТестовогоНабора(ТестовыйМодуль, Набор);
Набор.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Набор.ДатаСтарта;
Возврат Результаты;
КонецФункции
Процедура ОбработатьЗавершениеТеста(Тест)
Тест.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Тест.ДатаСтарта;
Тест.Статус = ЮТРегистрацияОшибок.СтатусВыполненияТеста(Тест);
КонецПроцедуры
Функция ЕстьОшибки(Объект)
Возврат ЗначениеЗаполнено(Объект.Ошибки);
КонецФункции
Процедура ВыполнитьТестовыйМетод(Тест)
Если ЕстьОшибки(Тест) Тогда
Возврат;
КонецЕсли;
СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста();
Тест.Статус = СтатусыИсполненияТеста.Исполнение;
Ошибка = ЮТОбщий.ВыполнитьМетод(Тест.ПолноеИмяМетода, Тест.Параметры);
Если Ошибка <> Неопределено Тогда
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуВыполненияТеста(Тест, Ошибка);
КонецЕсли;
КонецПроцедуры
Процедура СкопироватьОшибкиВ(Объекты, Ошибки)
Для Каждого Объект Из Объекты Цикл
ЮТОбщий.ДополнитьМассив(Объект.Ошибки, Ошибки);
Если Объект.Свойство("Статус") Тогда
Объект.Статус = ЮТФабрика.СтатусыИсполненияТеста().Сломан;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="24d9c1de-23c0-4d03-b2bf-9437c0985453">
<name>ЮТИсполнитель</name>
<name>ЮТИсполнительКлиентСервер</name>
<synonym>
<key>ru</key>
<value>Исполнитель</value>

View File

@ -16,14 +16,6 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
@ -41,14 +33,8 @@
// Массив - Результат прогона наборов тестов, структура набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Функция ВыполнитьГруппуНаборовТестов(Знач Наборы, Знач ТестовыйМодуль) Экспорт
Возврат ЮТИсполнитель.ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль);
Возврат ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль);
КонецФункции
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -109,6 +109,7 @@
// Неопределено - Если метод вызывается за рамками теста
Функция КонтекстТеста() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаТеста());
КонецФункции
@ -127,6 +128,7 @@
// Неопределено - Если метод вызывается за рамками тестового набора
Функция КонтекстНабора() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаНабораТестов());
КонецФункции
@ -141,6 +143,7 @@
// Неопределено - Если метод вызывается за рамками тестового модуля
Функция КонтекстМодуля() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаМодуля());
КонецФункции
@ -165,6 +168,7 @@
// Неопределено, Структура - Контекст ошибки, см. ЮТРегистрацияОшибок.НовыйКонтекстОшибки
Функция КонтекстОшибки() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаОшибки());
КонецФункции
@ -175,6 +179,7 @@
// Неопределено, Структура - Контекст проверки
Функция КонтекстПроверки() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаУтверждений());
КонецФункции
@ -185,6 +190,7 @@
// Неопределено, Структура - Контекст проверки
Функция КонтекстЧитателя() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаЧитателя());
КонецФункции
@ -192,9 +198,10 @@
// КонтекстЧитателя
// Возвращает служебный контекста, данные используемые исполнителем тестов
// Возвращаемое значение:
// см. ЮТИсполнитель.ДанныеКонтекстаИсполнения
// см. ЮТФабрика.НовыйКонтекстИсполнения
Функция КонтекстИсполнения() Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаИсполнения());
КонецФункции

View File

@ -158,7 +158,7 @@
// Обработка события "ПослеФормированияИсполняемыхНаборовТестов"
// Параметры:
// КоллекцияКатегорийНаборов - Массив из см. ЮТИсполнитель.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов
// КоллекцияКатегорийНаборов - Массив из см. ЮТФабрика.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов
Процедура ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов) Экспорт
Количество = 0;

View File

@ -727,8 +727,8 @@
// Булево - Это каталог
Функция ЭтоКаталог(ПутьКФайлу) Экспорт
Файл = Новый Файл(ПутьКФайлу);
Возврат Файл.Существует() И Файл.ЭтоКаталог();
ВызовУстаревшегоМетода("ЮТОбщий.ЭтоКаталог", "ЮТФайлы.ЭтоКаталог");
Возврат ЮТФайлы.Существует(ПутьКФайлу) И ЮТФайлы.ЭтоКаталог(ПутьКФайлу);
КонецФункции

View File

@ -20,7 +20,7 @@
// Экспортные процедуры и функции, предназначенные для использования другими
// объектами конфигурации или другими программами
/////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
#Область СлужебныйПрограммныйИнтерфейс
// СформироватьОтчет
// Формирует отчет о результатах тестирования по заданным параметрам
@ -30,77 +30,84 @@
// Обработчик - ОписаниеОповещения
Процедура СформироватьОтчет(РезультатВыполнения, ПараметрыЗапуска, Обработчик) Экспорт
Модули = ЮТРасширения.ГенераторыОтчетов();
МодульОтчета = Неопределено;
Если НЕ ЗначениеЗаполнено(ПараметрыЗапуска.reportPath) Тогда
ВызватьИсключение "Не указан путь сохранения отчета";
КонецЕсли;
Для Каждого Модуль Из Модули Цикл
Если Модуль.РеализуетФормат(ПараметрыЗапуска.reportFormat) Тогда
МодульОтчета = Модуль;
Прервать;
КонецЕсли;
КонецЦикла;
МодульОтчета = МодульФормирования(ПараметрыЗапуска.reportFormat);
Если МодульОтчета = Неопределено Тогда
ВызватьИсключение СтрШаблон("Отчет в формате %1 не поддерживается", ПараметрыЗапуска.reportFormat);
КонецЕсли;
ИмяФайлаОтчета = ИмяФайлаОтчета(Модуль, ПараметрыЗапуска);
ДанныеОтчета = Модуль.ДанныеОтчета(РезультатВыполнения);
ПараметрыФормирования = Новый Структура("РезультатВыполнения, ПараметрыЗапуска, Обработчик", РезультатВыполнения, ПараметрыЗапуска, Обработчик);
ПараметрыФормирования.Вставить("МодульОтчета", МодульОтчета);
Если ДанныеОтчета = Неопределено Тогда
ВызватьИсключение "Не удалось получить данные отчета";
ИначеЕсли НЕ ЗначениеЗаполнено(ИмяФайлаОтчета) Тогда
ВызватьИсключение "Не удалось сформировать имя файла отчета";
Иначе
ДанныеОтчета.Записать(ИмяФайлаОтчета);
КонецЕсли;
ОбработчикПолученияИмениФайла = Новый ОписаниеОповещения("ПослеФормированияИмениФайла", ЭтотОбъект, ПараметрыФормирования);
ИмяФайлаОтчета(ПараметрыФормирования, ОбработчикПолученияИмениФайла);
КонецПроцедуры
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Экспортные процедуры и функции для служебного использования внутри подсистемы
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти
/////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, составляющие внутреннюю реализацию модуля
/////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
Функция ИмяФайлаОтчета(Модуль, ПараметрыЗапуска)
Процедура ИмяФайлаОтчета(ПараметрыФормирования, Обработчик)
ИмяФайла = Неопределено;
ПараметрыПроверки = Новый Структура("ПараметрыФормирования, Обработчик", ПараметрыФормирования, Обработчик);
ПутьКОтчету = ПараметрыЗапуска.reportPath;
ОбработчикПроверки = Новый ОписаниеОповещения("ПослеПроверкиКаталога", ЭтотОбъект, ПараметрыПроверки);
ЮТФайлы.ЭтоКаталог(ПараметрыФормирования.ПараметрыЗапуска.reportPath, ОбработчикПроверки);
Если НЕ ЗначениеЗаполнено(ПутьКОтчету) Тогда
ВызватьИсключение "Не указан путь сохранения отчета";
КонецПроцедуры
Функция МодульФормирования(Формат)
Модули = ЮТРасширения.ГенераторыОтчетов();
МодульОтчета = Неопределено;
Для Каждого Модуль Из Модули Цикл
Если Модуль.РеализуетФормат(Формат) Тогда
МодульОтчета = Модуль;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат МодульОтчета;
КонецФункции
Процедура ПослеФормированияИмениФайла(ИмяФайлаОтчета, Параметры) Экспорт
ДанныеОтчета = Параметры.МодульОтчета.ДанныеОтчета(Параметры.РезультатВыполнения);
Если ДанныеОтчета = Неопределено Тогда
ВызватьИсключение "Не удалось получить данные отчета";
Иначе
ДанныеОтчета.Записать(ИмяФайлаОтчета);
КонецЕсли;
Если ЮТОбщий.ЭтоКаталог(ПутьКОтчету) Тогда
ИмяФайла = ЮТОбщий.ОбъединитьПути(ПутьКОтчету, Модуль.ИмяФайлаПоУмолчанию());
ЮТИсполнительКлиент.ВызватьОбработчик(Параметры.Обработчик);
КонецПроцедуры
Процедура ПослеПроверкиКаталога(ЭтоКаталог, Параметры) Экспорт
ПутьКОтчету = Параметры.ПараметрыФормирования.ПараметрыЗапуска.reportPath;
Если ЭтоКаталог Тогда
ИмяФайла = ЮТОбщий.ОбъединитьПути(ПутьКОтчету, Параметры.ПараметрыФормирования.МодульОтчета.ИмяФайлаПоУмолчанию());
Иначе
ИмяФайла = ПутьКОтчету;
КонецЕсли;
Возврат ИмяФайла;
ЮТИсполнительКлиент.ВызватьОбработчик(Параметры.Обработчик, ИмяФайла);
КонецФункции
КонецПроцедуры
#КонецОбласти

View File

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

View File

@ -503,6 +503,30 @@
КонецФункции
// Описание категория набора тестов.
//
// Параметры:
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Структура - Описание категория набора тестов:
// * ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
// * Клиентские - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Серверные - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Пропущенные - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Функция ОписаниеКатегорияНабораТестов(ТестовыйМодуль) Экспорт
КатегорииНаборов = Новый Структура();
КатегорииНаборов.Вставить("ТестовыйМодуль", ТестовыйМодуль);
КатегорииНаборов.Вставить("Клиентские", Новый Массив());
КатегорииНаборов.Вставить("Серверные", Новый Массив());
КатегорииНаборов.Вставить("Пропущенные", Новый Массив());
//@skip-check constructor-function-return-section
Возврат КатегорииНаборов;
КонецФункции
#КонецОбласти
#Область КонструкторыКонтекстов

View File

@ -16,10 +16,46 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ПрограммныйИнтерфейс
Функция Существует(ПутьКФайлу, Обработчик = Неопределено) Экспорт
Файл = Новый Файл(ПутьКФайлу);
#Если Клиент Тогда
Если Обработчик = Неопределено Тогда
Возврат Файл.Существует();
Иначе
Файл.НачатьПроверкуСуществования(Обработчик);
КонецЕсли;
#Иначе
Возврат Файл.Существует();
#КонецЕсли
КонецФункции
// Проверяет, что по указанному пути находится каталог
//
// Параметры:
// ПутьКФайлу - Строка
// Обработчик - ОписаниеОповещения
//
// Возвращаемое значение:
// Булево - Это каталог
Функция ЭтоКаталог(ПутьКФайлу, Обработчик = Неопределено) Экспорт
Файл = Новый Файл(ПутьКФайлу);
#Если Клиент Тогда
Если Обработчик = Неопределено Тогда
Возврат Файл.ЭтоКаталог();
Иначе
Файл.НачатьПроверкуЭтоКаталог(Обработчик);
КонецЕсли;
#Иначе
Возврат Файл.ЭтоКаталог();
#КонецЕсли
КонецФункции
#КонецОбласти

View File

@ -5,5 +5,7 @@
<key>ru</key>
<value>Файлы</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -39,8 +39,8 @@
<commonModules>CommonModule.МокитоПроверки</commonModules>
<commonModules>CommonModule.МокитоСлужебный</commonModules>
<commonModules>CommonModule.ЮТест</commonModules>
<commonModules>CommonModule.ЮТИсполнитель</commonModules>
<commonModules>CommonModule.ЮТИсполнительКлиент</commonModules>
<commonModules>CommonModule.ЮТИсполнительКлиентСервер</commonModules>
<commonModules>CommonModule.ЮТИсполнительСервер</commonModules>
<commonModules>CommonModule.ЮТКоллекции</commonModules>
<commonModules>CommonModule.ЮТКонструкторВариантов</commonModules>

View File

@ -35,7 +35,7 @@
&После("ПриНачалеРаботыСистемы")
Процедура ЮТПриНачалеРаботыСистемы()
ЮТИсполнитель.ВыполнитьМодульноеТестирование();
ЮТИсполнительКлиентСервер.ВыполнитьМодульноеТестирование();
КонецПроцедуры

View File

@ -11,7 +11,7 @@
<content>CommonModule.МокитоПроверки</content>
<content>CommonModule.МокитоСлужебный</content>
<content>CommonModule.ЮТест</content>
<content>CommonModule.ЮТИсполнитель</content>
<content>CommonModule.ЮТИсполнительКлиентСервер</content>
<content>CommonModule.ЮТИсполнительСервер</content>
<content>CommonModule.ЮТКонструкторВариантов</content>
<content>CommonModule.ЮТКонструкторТестовыхДанных</content>

View File

@ -33,10 +33,10 @@
Процедура ЗаполнитьСправочник() Экспорт
#Если Сервер Тогда
Конструктор = ЮТест.Данные().КонструкторОбъекта(Справочники.Товары);
#Иначе
#Если Клиент Тогда
Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары");
#Иначе
Конструктор = ЮТест.Данные().КонструкторОбъекта(Справочники.Товары);
#КонецЕсли
Конструктор
@ -53,7 +53,7 @@
.Свойство("Вид").Заполнено();
Ссылка = Конструктор.Записать();
#Если Сервер Тогда
#Если НЕ Клиент Тогда
ЮТест.ОжидаетЧто(Ссылка, "Созданный объект")
.Заполнено()
.ИмеетТип("СправочникСсылка.Товары")
@ -67,10 +67,10 @@
Процедура ЗаполнитьДокумент() Экспорт
#Если Сервер Тогда
Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара);
#Иначе
#Если Клиент Тогда
Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара");
#Иначе
Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара);
#КонецЕсли
Ссылка = Конструктор
@ -91,7 +91,7 @@
.Установить("Сумма", Конструктор.ДанныеСтроки().Цена * Конструктор.ДанныеСтроки().Количество)
.Провести();
#Если Сервер Тогда
#Если НЕ Клиент Тогда
ЮТест.ОжидаетЧто(Ссылка, "Созданный объект")
.Заполнено()
.ИмеетТип("ДокументСсылка.ПриходТовара")