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

Merge pull request from bia-technologies/feature/perfomance

Оптимизация механизмов движка
This commit is contained in:
Koryakin Aleksey 2024-08-06 00:06:31 +03:00 committed by GitHub
commit a70cd68e11
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 292 additions and 94 deletions
exts/yaxunit/src
CommonModules
ЮТИсполнительСлужебныйКлиент
ЮТКоллекции
ЮТОбщийСлужебный
ЮТПараметрыЗапускаСлужебный
DataProcessors/ЮТЮнитТесты/Forms/Основная
tests/src/CommonModules/ОМ_ЮТКоллекции

@ -20,6 +20,10 @@
Процедура ВыполнитьМодульноеТестирование() Экспорт
Если НЕ ЮТПараметрыЗапускаСлужебный.ЕстьПараметрыЗапускаТестов() Тогда
Возврат;
КонецЕсли;
ПараметрыИсполнения = ПараметрыИсполнения();
ПараметрыИсполнения.АргументыЗапуска = ПараметрЗапуска;
@ -184,12 +188,12 @@
Процедура ОбработчикАнализПараметровЗапуска(ПараметрыЗапуска, ДополнительныеПараметры) Экспорт
ЮТЛогирование.Информация("Анализ параметров запуска");
ДополнительныеПараметры.ПараметрыЗапуска = ПараметрыЗапуска;
Если НЕ ПараметрыЗапуска.ВыполнятьМодульноеТестирование Тогда
Возврат;
КонецЕсли;
ДополнительныеПараметры.ПараметрыЗапуска = ПараметрыЗапуска;
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры

@ -143,13 +143,13 @@
ТипИсточника = ТипЗнч(Источник);
Если ЮТТипыДанныхСлужебный.ЭтоСтруктура(ТипИсточника) Тогда
Приемник = СкопироватьСтруктуру(Источник);
Приемник = СкопироватьСтруктуру(Источник, Истина);
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоСоответствие(ТипИсточника) Тогда
Приемник = СкопироватьСоответствие(Источник);
Приемник = СкопироватьСоответствие(Источник, Истина);
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоМассива(ТипИсточника) Тогда
Приемник = СкопироватьМассив(Источник);
Приемник = СкопироватьМассив(Источник, Истина);
ИначеЕсли ТипИсточника = Тип("СписокЗначений") Тогда
Приемник = СкопироватьСписокЗначений(Источник);
Приемник = СкопироватьСписокЗначений(Источник, Истина);
Иначе
СкопироватьПрисвоением = Истина;
@ -177,15 +177,15 @@
//
// Параметры:
// Источник - Структура, ФиксированнаяСтруктура - копируемая структура
//
// Рекурсивно - Булево - Создание "глубокой" копии, с копирование вложенных элементов
// Возвращаемое значение:
// Структура - копия исходной структуры.
Функция СкопироватьСтруктуру(Источник) Экспорт
Функция СкопироватьСтруктуру(Источник, Рекурсивно = Истина) Экспорт
Результат = Новый Структура;
Для Каждого КлючИЗначение Из Источник Цикл
Результат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение));
Результат.Вставить(КлючИЗначение.Ключ, ?(Рекурсивно, СкопироватьРекурсивно(КлючИЗначение.Значение), КлючИЗначение.Значение));
КонецЦикла;
Возврат Результат;
@ -197,19 +197,24 @@
// Параметры:
// Источник - Соответствие из Произвольный
// - ФиксированноеСоответствие из Произвольный
// Рекурсивно - Булево - Создание "глубокой" копии, с копирование вложенных элементов
//
// Возвращаемое значение:
// Соответствие Из Произвольный - копия исходного соответствия.
//
Функция СкопироватьСоответствие(Источник) Экспорт
Функция СкопироватьСоответствие(Источник, Рекурсивно = Истина) Экспорт
Результат = Новый Соответствие;
Для Каждого КлючИЗначение Из Источник Цикл
НовыйКлюч = СкопироватьРекурсивно(КлючИЗначение.Ключ);
НовоеЗначение = СкопироватьРекурсивно(КлючИЗначение.Значение);
Результат.Вставить(НовыйКлюч, НовоеЗначение);
Если Рекурсивно Тогда
НовыйКлюч = СкопироватьРекурсивно(КлючИЗначение.Ключ);
НовоеЗначение = СкопироватьРекурсивно(КлючИЗначение.Значение);
Результат.Вставить(НовыйКлюч, НовоеЗначение);
Иначе
Результат.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЕсли;
КонецЦикла;
@ -222,10 +227,11 @@
// Параметры:
// Источник - Массив Из Произвольный
// - ФиксированныйМассив из Произвольный
// Рекурсивно - Булево - Создание "глубокой" копии, с копирование вложенных элементов
//
// Возвращаемое значение:
// Массив Из Произвольный - копия исходного массива.
Функция СкопироватьМассив(Источник) Экспорт
Функция СкопироватьМассив(Источник, Рекурсивно = Истина) Экспорт
Если НЕ ЗначениеЗаполнено(Источник) Тогда
Возврат Новый Массив;
@ -235,7 +241,7 @@
Результат = Новый Массив(Размер);
Для Инд = 0 По Размер - 1 Цикл
Результат[Инд] = СкопироватьРекурсивно(Источник[Инд]);
Результат[Инд] = ?(Рекурсивно, СкопироватьРекурсивно(Источник[Инд]), Источник[Инд]);
КонецЦикла;
Возврат Результат;
@ -246,18 +252,19 @@
//
// Параметры:
// Источник - СписокЗначений Из Произвольный
// Рекурсивно - Булево - Создание "глубокой" копии, с копирование вложенных элементов
//
// Возвращаемое значение:
// СписокЗначений Из Произвольный
//
Функция СкопироватьСписокЗначений(Источник) Экспорт
Функция СкопироватьСписокЗначений(Источник, Рекурсивно = Истина) Экспорт
Результат = Новый СписокЗначений;
Для Каждого ЭлементСписка Из Источник Цикл
НовоеЗначение = СкопироватьРекурсивно(ЭлементСписка.Значение);
Результат.Добавить(НовоеЗначение, ЭлементСписка.Представление, ЭлементСписка.Пометка, ЭлементСписка.Картинка);
Значение = ?(Рекурсивно, СкопироватьРекурсивно(ЭлементСписка.Значение), ЭлементСписка.Значение);
Результат.Добавить(Значение, ЭлементСписка.Представление, ЭлементСписка.Пометка, ЭлементСписка.Картинка);
КонецЦикла;

@ -65,30 +65,35 @@
Значение10 = "_!%*") Экспорт
ФлагПустогоЗначения = "_!%*";
Значения = Неопределено;
Для Инд = - 10 По - 1 Цикл
//@skip-check server-execution-safe-mode
Значение = Вычислить("Значение" + ( - Инд)); // BSLLS:ExecuteExternalCodeInCommonModule-off
Если Значение = ФлагПустогоЗначения И Значения = Неопределено Тогда
Продолжить;
Значения = Новый Массив(10);
Значения[0] = Значение1;
Значения[1] = Значение2;
Значения[2] = Значение3;
Значения[3] = Значение4;
Значения[4] = Значение5;
Значения[5] = Значение6;
Значения[6] = Значение7;
Значения[7] = Значение8;
Значения[8] = Значение9;
Значения[9] = Значение10;
Для Инд = -9 По 0 Цикл
Если Значения[-Инд] <> ФлагПустогоЗначения Тогда
Результат = Новый Массив(1 - Инд);
Прервать;
КонецЕсли;
Если Значения = Неопределено Тогда
Значения = Новый Массив(- Инд);
КонецЕсли;
Если Значение = ФлагПустогоЗначения Тогда
Значение = ЗначениеПоУмолчанию;
КонецЕсли;
Значения[ - Инд - 1] = Значение;
КонецЦикла;
Возврат Значения;
Для Инд = 0 По Результат.ВГраница() Цикл
Если Значения[Инд] <> ФлагПустогоЗначения Тогда
Результат[Инд] = Значения[Инд];
Иначе
Результат[Инд] = ЗначениеПоУмолчанию;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// BSLLS:DuplicateStringLiteral-on

@ -49,6 +49,17 @@
КонецФункции
Функция ЕстьПараметрыЗапускаТестов() Экспорт
Если ПустаяСтрока(ПараметрЗапуска) Тогда
Возврат Ложь;
КонецЕсли;
ПараметрыЗапускаПредприятия = ПараметрыЗапускаПредприятия(ПараметрЗапуска);
Возврат ПараметрыЗапускаПредприятия.Свойство(КлючЗапуска());
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -74,27 +85,9 @@
Возврат Параметры;
КонецЕсли;
ПарыКлючЗначение = ЮТСтроки.РазделитьСтроку(ПараметрыЗапускаСтрокой, ";");
ПараметрыЗапускаПредприятия = ПараметрыЗапускаПредприятия(ПараметрыЗапускаСтрокой);
ПараметрыЗапуска = Новый Структура;
Для Каждого Пара Из ПарыКлючЗначение Цикл
Если ПустаяСтрока(Пара) Тогда
Продолжить;
КонецЕсли;
КлючЗначение = ЮТСтроки.РазделитьСтроку(Пара, "=");
Если КлючЗначение.Количество() = 1 Тогда
ПараметрыЗапуска.Вставить(КлючЗначение[0], Истина);
Иначе
ПараметрыЗапуска.Вставить(КлючЗначение[0], КлючЗначение[1]);
КонецЕсли;
КонецЦикла;
ЗначениеКлючаЗапуска = ЮТКоллекции.ЗначениеСтруктуры(ПараметрыЗапуска, КлючЗапуска(), Ложь);
ЗначениеКлючаЗапуска = ЮТКоллекции.ЗначениеСтруктуры(ПараметрыЗапускаПредприятия, КлючЗапуска(), Ложь);
Если ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Булево") Тогда
@ -122,6 +115,32 @@
КонецФункции
Функция ПараметрыЗапускаПредприятия(ПараметрыЗапускаСтрокой)
ПарыКлючЗначение = ЮТСтроки.РазделитьСтроку(ПараметрыЗапускаСтрокой, ";");
ПараметрыЗапускаПредприятия = Новый Структура;
Для Каждого Пара Из ПарыКлючЗначение Цикл
Если ПустаяСтрока(Пара) Тогда
Продолжить;
КонецЕсли;
КлючЗначение = ЮТСтроки.РазделитьСтроку(Пара, "=");
Если КлючЗначение.Количество() = 1 Тогда
ПараметрыЗапускаПредприятия.Вставить(КлючЗначение[0], Истина);
Иначе
ПараметрыЗапускаПредприятия.Вставить(КлючЗначение[0], КлючЗначение[1]);
КонецЕсли;
КонецЦикла;
Возврат ПараметрыЗапускаПредприятия;
КонецФункции
Функция ПрочитатьКонфигурационныйФайл(ПутьКФайлу)
#Если НЕ ВебКлиент Тогда

@ -21,6 +21,9 @@
&НаКлиенте
Перем ИсполняемыеТестовыеМодули;
&НаКлиенте
Перем ДанныеПоИдентификаторам;
&НаКлиенте
Перем ПараметрыЗапускаТестирования;
@ -488,6 +491,8 @@
ИсполняемыеТестовыеМодули = Результат;
ПараметрыЗапускаТестирования = ПараметрыЗапуска;
ДанныеПоИдентификаторам = Новый Структура("Тесты, Наборы, Модули", Новый Соответствие, Новый Соответствие, Новый Соответствие);
Для Каждого ТестовыйМодуль Из ИсполняемыеТестовыеМодули Цикл
Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
@ -504,6 +509,8 @@
ЗаполнитьОшибки(СтрокаНабора, Набор);
Набор.Вставить("Идентификатор", СтрокаНабора.ПолучитьИдентификатор());
ДанныеПоИдентификаторам.Наборы.Вставить(Набор.Идентификатор, Набор);
ДанныеПоИдентификаторам.Модули.Вставить(Набор.Идентификатор, ТестовыйМодуль);
Для Каждого Тест Из Набор.Тесты Цикл
@ -513,6 +520,7 @@
СтрокаТеста.Теги = СтрСоединить(Тест.Теги, ", ");
Тест.Вставить("Идентификатор", СтрокаТеста.ПолучитьИдентификатор());
ДанныеПоИдентификаторам.Тесты.Вставить(Тест.Идентификатор, Тест);
КонецЦикла;
@ -613,43 +621,66 @@
Возврат МодулиКЗапуску;
КонецЕсли;
Для Каждого Модуль Из ИсполняемыеТестовыеМодули Цикл
Наборы = Новый Массив;
Тесты = Новый Массив;
ЗапускаемыеМодули = Новый Соответствие();
ЗапускаемыеНаборы = Новый Соответствие();
Для Каждого Идендификатор Из ВыделенныеСтроки Цикл
НаборыКЗапуску = Новый Массив();
Для Каждого Набор Из Модуль.НаборыТестов Цикл
Если ВыделенныеСтроки.Найти(Набор.Идентификатор) <> Неопределено Тогда
НаборыКЗапуску.Добавить(Набор);
Продолжить;
КонецЕсли;
ТестыКЗапуску = Новый Массив();
Для Каждого Тест Из Набор.Тесты Цикл
Если ВыделенныеСтроки.Найти(Тест.Идентификатор) <> Неопределено Тогда
ТестыКЗапуску.Добавить(Тест);
КонецЕсли;
КонецЦикла;
Если ТестыКЗапуску.Количество() Тогда
ЗапускаемыйНабор = ЮТКоллекции.СкопироватьСтруктуру(Набор);
ЗапускаемыйНабор.Тесты = ТестыКЗапуску;
НаборыКЗапуску.Добавить(ЗапускаемыйНабор);
КонецЕсли;
КонецЦикла;
Если НаборыКЗапуску.Количество() Тогда
ЗапускаемыйМодуль = ЮТКоллекции.СкопироватьСтруктуру(Модуль);
ЗапускаемыйМодуль.НаборыТестов = НаборыКЗапуску;
МодулиКЗапуску.Добавить(ЗапускаемыйМодуль);
Если ДанныеПоИдентификаторам.Наборы[Идендификатор] <> Неопределено Тогда
Наборы.Добавить(ДанныеПоИдентификаторам.Наборы[Идендификатор]);
ЗапускаемыеМодули.Вставить(ДанныеПоИдентификаторам.Модули[Идендификатор]);
КонецЕсли;
КонецЦикла;
Для Каждого Идендификатор Из ВыделенныеСтроки Цикл
Тест = ДанныеПоИдентификаторам.Тесты[Идендификатор];
Если Тест = Неопределено Тогда
Продолжить;
КонецЕсли;
ИдентификаторНабора = ДеревоТестов.НайтиПоИдентификатору(Идендификатор).ПолучитьРодителя().ПолучитьИдентификатор();
Набор = ДанныеПоИдентификаторам.Наборы[ИдентификаторНабора];
Модуль = ДанныеПоИдентификаторам.Модули[ИдентификаторНабора];
Если Набор <> Неопределено И Наборы.Найти(Набор) = Неопределено Тогда
Тесты.Добавить(Новый Структура("Тест, Набор", Тест, Набор));
ЗапускаемыеМодули.Вставить(Модуль);
ЗапускаемыеНаборы.Вставить(Набор);
КонецЕсли;
КонецЦикла;
Для Каждого Набор Из ЮТКоллекции.ВыгрузитьЗначения(ЗапускаемыеНаборы, "Ключ") Цикл
Копия = ЮТКоллекции.СкопироватьСтруктуру(Набор, Ложь);
Копия.Тесты = Новый Массив;
ЗапускаемыеНаборы.Вставить(Набор, Копия);
Наборы.Добавить(Копия);
КонецЦикла;
Для Каждого Тест Из Тесты Цикл
ЗапускаемыйНабор = ЗапускаемыеНаборы[Тест.Набор];
ЗапускаемыйНабор.Тесты.Добавить(Тест.Тест);
КонецЦикла;
Для Каждого Модуль Из ЮТКоллекции.ВыгрузитьЗначения(ЗапускаемыеМодули, "Ключ") Цикл
Копия = ЮТКоллекции.СкопироватьСтруктуру(Модуль, Ложь);
Копия.НаборыТестов = Новый Массив;
ЗапускаемыеМодули.Вставить(Модуль, Копия);
МодулиКЗапуску.Добавить(Копия);
КонецЦикла;
Для Каждого Набор Из Наборы Цикл
Модуль = ДанныеПоИдентификаторам.Модули[Набор.Идентификатор];
ЗапускаемыйМодуль = ЗапускаемыеМодули[Модуль];
ЗапускаемыйМодуль.НаборыТестов.Добавить(Набор);
КонецЦикла;
Возврат МодулиКЗапуску;
КонецФункции
@ -674,7 +705,7 @@
КонецЦикла;
Если ТестыКЗапуску.Количество() Тогда
ЗапускаемыйНабор = ЮТКоллекции.СкопироватьСтруктуру(Набор);
ЗапускаемыйНабор = ЮТКоллекции.СкопироватьСтруктуру(Набор, Ложь);
ЗапускаемыйНабор.Тесты = ТестыКЗапуску;
НаборыКЗапуску.Добавить(ЗапускаемыйНабор);
КонецЕсли;
@ -683,7 +714,7 @@
Если НаборыКЗапуску.Количество() Тогда
ЗапускаемыйМодуль = ЮТКоллекции.СкопироватьСтруктуру(Модуль);
ЗапускаемыйМодуль = ЮТКоллекции.СкопироватьСтруктуру(Модуль, Ложь);
ЗапускаемыйМодуль.НаборыТестов = НаборыКЗапуску;
МодулиКЗапуску.Добавить(ЗапускаемыйМодуль);

@ -36,6 +36,9 @@
.ДобавитьТест("ВСтруктуру")
.ДобавитьТест("ПредставлениеМассива")
.ДобавитьТест("ОбъединитьМассивы")
.ДобавитьТест("ЗначениеВМассиве_Производительность1")
.ДобавитьТест("ЗначениеВМассиве_Производительность2")
.ДобавитьТест("ЗначениеВМассиве_Производительность3")
;
КонецПроцедуры
@ -308,12 +311,13 @@
Значение7 = ЮТест.Данные().СлучайнаяСтрока();
Значение8 = ЮТест.Данные().СлучайнаяСтрока();
Значение9 = ЮТест.Данные().СлучайнаяСтрока();
Значение10 = ЮТест.Данные().СлучайнаяСтрока();
Результат = ЮТКоллекции.ЗначениеВМассиве(Значение1, Значение2, Значение3, Значение4, , Значение6, Значение7, Значение8, Значение9);
Результат = ЮТКоллекции.ЗначениеВМассиве(Значение1, Значение2, Значение3, Значение4, , Значение6, Значение7, Значение8, Значение9, Значение10);
ЮТест.ОжидаетЧто(Результат, "Массив значений после добавления")
.ИмеетТип("Массив")
.ИмеетДлину(9)
.ИмеетДлину(10)
.Элемент(0).Равно(Значение1)
.Элемент(1).Равно(Значение2)
.Элемент(2).Равно(Значение3)
@ -322,7 +326,50 @@
.Элемент(5).Равно(Значение6)
.Элемент(6).Равно(Значение7)
.Элемент(7).Равно(Значение8)
.Элемент(8).Равно(Значение9);
.Элемент(8).Равно(Значение9)
.Элемент(9).Равно(Значение10);
ЮТест.ОжидаетЧто(ЮТКоллекции.ЗначениеВМассиве(Значение1), "Один элемент")
.ИмеетТип("Массив")
.ИмеетДлину(1)
.Элемент(0).Равно(Значение1);
ЮТест.ОжидаетЧто(ЮТКоллекции.ЗначениеВМассиве(Значение1, , Значение3), "Пропуск элемента")
.ИмеетТип("Массив")
.ИмеетДлину(3)
.Элемент(0).Равно(Значение1)
.Элемент(1).Равно(Неопределено)
.Элемент(2).Равно(Значение3);
КонецПроцедуры
Процедура ЗначениеВМассиве_Производительность1() Экспорт
Итерация = 10000;
Для Инд = 1 По Итерация Цикл
ЮТКоллекции.ЗначениеВМассиве(1);
КонецЦикла;
КонецПроцедуры
Процедура ЗначениеВМассиве_Производительность2() Экспорт
Итерация = 10000;
Для Инд = 1 По Итерация Цикл
ЗначениеВМассиве2(1);
КонецЦикла;
КонецПроцедуры
Процедура ЗначениеВМассиве_Производительность3() Экспорт
Итерация = 10000;
Для Инд = 1 По Итерация Цикл
ЗначениеВМассиве3(1);
КонецЦикла;
КонецПроцедуры
@ -463,4 +510,89 @@
КонецФункции
Функция ЗначениеВМассиве2(Значение1,
Значение2 = "_!%*",
Значение3 = "_!%*",
Значение4 = "_!%*",
Значение5 = "_!%*",
Значение6 = "_!%*",
Значение7 = "_!%*",
Значение8 = "_!%*",
Значение9 = "_!%*",
Значение10 = "_!%*")
Результат = Неопределено;
ДобавитьЗначениеВМассив(Результат, Значение10, 9);
ДобавитьЗначениеВМассив(Результат, Значение9, 8);
ДобавитьЗначениеВМассив(Результат, Значение8, 7);
ДобавитьЗначениеВМассив(Результат, Значение7, 6);
ДобавитьЗначениеВМассив(Результат, Значение6, 5);
ДобавитьЗначениеВМассив(Результат, Значение5, 4);
ДобавитьЗначениеВМассив(Результат, Значение4, 3);
ДобавитьЗначениеВМассив(Результат, Значение3, 2);
ДобавитьЗначениеВМассив(Результат, Значение2, 1);
ДобавитьЗначениеВМассив(Результат, Значение1, 0);
Возврат Результат;
КонецФункции
Функция ЗначениеВМассиве3(Значение1,
Значение2 = "_!%*",
Значение3 = "_!%*",
Значение4 = "_!%*",
Значение5 = "_!%*",
Значение6 = "_!%*",
Значение7 = "_!%*",
Значение8 = "_!%*",
Значение9 = "_!%*",
Значение10 = "_!%*")
Значения = Новый Массив(10);
Значения[0] = Значение1;
Значения[1] = Значение2;
Значения[2] = Значение3;
Значения[3] = Значение4;
Значения[4] = Значение5;
Значения[5] = Значение6;
Значения[6] = Значение7;
Значения[7] = Значение8;
Значения[8] = Значение9;
Значения[9] = Значение10;
Для Инд = -9 По 0 Цикл
Если Значения[-Инд] <> "_!%*" Тогда
Результат = Новый Массив(1 - Инд);
Прервать;
КонецЕсли;
КонецЦикла;
Для Инд = 0 По Результат.ВГраница() Цикл
Если Значения[Инд] <> "_!%*" Тогда
Результат[Инд] = Значения[Инд];
Иначе
Результат[Инд] = Неопределено;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Процедура ДобавитьЗначениеВМассив(Результат, Значение, Индекс)
Если Результат = Неопределено И Значение = "_!%*" Тогда
Возврат;
ИначеЕсли Результат <> Неопределено И Значение = "_!%*" Тогда
Результат[Индекс] = Неопределено;
ИначеЕсли Результат <> Неопределено Тогда
Результат[Индекс] = Значение;
Иначе
Результат = Новый Массив(Индекс + 1);
Результат[Индекс] = Значение;
КонецЕсли;
КонецПроцедуры
#КонецОбласти