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

Merge pull request #135 from bia-technologies/feature/49

Запуск тестов из предприятия
This commit is contained in:
Koryakin Aleksey 2023-08-31 02:33:11 +03:00 committed by GitHub
commit 6e1031928c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 1406 additions and 264 deletions

View File

@ -139,7 +139,7 @@ jobs:
}
- name: run tests
run: 1cv8c /WS "http://localhost:8314" /C"RunUnitTests=${{github.workspace}}/unit.json" /DisableStartupDialogs /DisableStartupMessages /DisableUnrecoverableErrorMessage /Out output.log
run: 1cv8c /WS "http://localhost:8314" /C"RunUnitTests=${{github.workspace}}/unit.json" /DisableStartupDialogs /DisableStartupMessages /DisableUnrecoverableErrorMessage /Out ${{github.workspace}}/output.log
timeout-minutes: 5
env:
DISPLAY: :99
@ -147,7 +147,7 @@ jobs:
- name: view output
if: always()
run: cat output.log
run: cat ./output.log
- name: upload-artifact
uses: actions/upload-artifact@v3

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

View File

@ -31,7 +31,8 @@
| Имя параметра | Тип | Значение по умолчанию | Описание |
|---------------|-----------|-----------------------|-----------------------------------------------------------------------------------------------------------------------------|
| `file` | `String` | `""` | Путь к файлу лога |
| `enable` | `Boolean` | `Null` | Признак использования логирования. Если не указан, зависит от параметра `file`, если он указан - вкл, если не указан - выкл |
| `enable` | `Boolean` | `Null` | Использование логирвания.<br/>Если не указан, зависит от параметра `file` и `console`, если установлены - вкл, если нет - выкл |
| `console` | `Boolean` | `false` | Вывод лога в stdout (консоль) |
| `level` | `String` | `"debug"` | Уровень детализации лога. Возможные значения: `"debug"`, `"info"`, `"error"` |
Примеры:

View File

@ -20,10 +20,18 @@
![Конфигуратор](images/from-configurator.png)
* Воспользоваться [интерфейсом настройки](../yaxunit-ui.md#интерфейс-настройки-конфигурации)
## Запуск из предприятия
Для запуска тестов из предприятия необходимо воспользоваться командой [Запуск тестирования](../yaxunit-ui.md#запуск-тестов)
![Запуск тестов](../images/ui-run-tests.png)
## Строка запуска предприятия
`[путь к клиенту 1С] ENTERPRISE [Параметры подключения к ИБ] [Параметры авторизации] /C RunUnitTests=/путь/к/конфигурационному/файлу`
Для формирования строки запуска можно воспользоваться [интерфейсом настройки](../yaxunit-ui.md#интерфейс-настройки-конфигурации)
Пример:
`"C:\Program Files\1cv8\8.3.18.1698\bin\1cv8c.exe" ENTERPRISE /IBName MyInfoBase /N Admin /C RunUnitTests=C:\tmp\test-config.json`

View File

@ -1,28 +1,25 @@
# Графический интерфейс
Расширение добавляет в командный интерфейс конфигурации новый раздел "Юнит тест".
Из него вы можете интерактивно запускать тесты или сформировать файл конфигурации запуска.
## Запуск тестов
Для запуска и отладки тестов вы можете воспользоваться командой "Запуск тестов"
Будут автоматически загружены все тесты и выведены в виде дерева сгруппированного по тестовым наборам (модулям).
![Запуск тестов](images/ui-run-tests.png)
Из этой формы вы можете запустить нужные тесты.
![Меню запуска](images/ui-run-menu.png)
И сразу же увидеть результат прогона.
## Интерфейс отчета
Для просмотра результатов тестирования в режиме 1С:Предприятие, вам необходимо в параметрах запуска указать [настройку](run) `showReport`
Например, создав файла настроек
```json
{
"reportPath": "/tmp/settings/",
"filter": {
"extensions": [
"tests"
]
},
"settings": {
"ВТранзакции": false
},
"reportFormat": "jUnit",
"showReport": true
}
```
Мы получим примерно такой результат
![Отчет](images/report-ui.png)
## Интерфейс настройки конфигурации

View File

@ -26,6 +26,7 @@
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьПараметры");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикАнализПараметровЗапуска");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикПодключитьКомпоненты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикИнициализация");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьОтчет");
@ -36,6 +37,20 @@
КонецПроцедуры
Процедура ВыполнитьМодульноеТестированиеПоНастройке(ПараметрыЗапуска, ОбработчикЗавершения) Экспорт
ПараметрыИсполнения = ПараметрыИсполнения();
ПараметрыИсполнения.ПараметрыЗапуска = ПараметрыЗапуска;
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикИнициализация");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
ПараметрыИсполнения.Цепочка.Добавить(ОбработчикЗавершения);
ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
Процедура ВызватьОбработчик(Обработчик, Результат = Неопределено) Экспорт
Если Обработчик <> Неопределено Тогда
@ -44,6 +59,70 @@
КонецПроцедуры
Функция ПараметрыИсполнения() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("АргументыЗапуска");
Параметры.Вставить("ПараметрыЗапуска");
Параметры.Вставить("Цепочка", Новый Массив());
Параметры.Вставить("ИндексСледующегоОбработчика", -1);
Параметры.Вставить("ИсполняемыеТестовыеМодули");
Параметры.Вставить("РезультатыТестирования");
Возврат Параметры;
КонецФункции
Функция ВыполнитьТестыМодуля(ТестовыйМодуль) Экспорт
Результаты = Новый Массив();
КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения();
КлиентскиеНаборы = Новый Массив();
СерверныеНаборы = Новый Массив();
ПропущенныеНаборы = Новый Массив();
Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
Если НЕ Набор.Выполнять Тогда
ПропущенныеНаборы.Добавить(Набор);
Продолжить;
КонецЕсли;
РежимИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим);
Если РежимИсполнения = КонтекстыИсполнения.Клиент Тогда
КлиентскиеНаборы.Добавить(Набор);
ИначеЕсли РежимИсполнения = КонтекстыИсполнения.Сервер Тогда
СерверныеНаборы.Добавить(Набор);
Иначе
ПропущенныеНаборы.Добавить(Набор);
КонецЕсли;
КонецЦикла;
ТестовыйМодульОблегченный = ЮТОбщий.СкопироватьСтруктуру(ТестовыйМодуль);
ТестовыйМодульОблегченный.НаборыТестов = Новый Массив();
Если ЗначениеЗаполнено(КлиентскиеНаборы) Тогда
Результаты = ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(КлиентскиеНаборы, ТестовыйМодульОблегченный);
КонецЕсли;
Если ЗначениеЗаполнено(СерверныеНаборы) Тогда
Результат = ЮТИсполнительСервер.ВыполнитьГруппуНаборовТестов(СерверныеНаборы, ТестовыйМодульОблегченный);
ЮТЛогирование.ВывестиСерверныеСообщения();
ЮТОбщий.ДополнитьМассив(Результаты, Результат);
КонецЕсли;
ЮТОбщий.ДополнитьМассив(Результаты, ПропущенныеНаборы);
ТестовыйМодульОблегченный.НаборыТестов = Результаты;
Возврат ТестовыйМодульОблегченный;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -75,56 +154,52 @@
КонецПроцедуры
Процедура ОбработчикЗагрузитьТесты(Результат, ДополнительныеПараметры) Экспорт
Процедура ОбработчикИнициализация(Результат, ДополнительныеПараметры) Экспорт
Параметры = ДополнительныеПараметры.ПараметрыЗапуска;
ЮТКонтекст.ИнициализироватьКонтекст();
ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(Параметры.settings);
ЮТСобытия.Инициализация(Параметры);
// Повторно сохраним для передачи на сервер
ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(ЮТКонтекст.ГлобальныеНастройкиВыполнения());
ЮТКонтекст.УстановитьКонтекстИсполнения(ЮТФабрика.НовыйКонтекстИсполнения());
ЮТСобытия.ПередЧтениеСценариев();
ТестовыеМодули = ЮТЧитатель.ЗагрузитьТесты(Параметры);
ЮТСобытия.ПослеЧтенияСценариев(ТестовыеМодули);
КоллекцияКатегорийНаборов = Новый Массив();
Для Каждого ТестовыйМодуль Из ТестовыеМодули Цикл
КатегорииНаборов = КатегорииНаборовТестовМодуля(ТестовыйМодуль);
КоллекцияКатегорийНаборов.Добавить(КатегорииНаборов);
КонецЦикла;
ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов);
ДополнительныеПараметры.КоллекцияКатегорийНаборов = КоллекцияКатегорийНаборов;
ЮТСобытия.Инициализация(ДополнительныеПараметры.ПараметрыЗапуска);
ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
Процедура ОбработчикЗагрузитьТесты(Результат, ДополнительныеПараметры) Экспорт
ЮТСобытия.ПередЧтениеСценариев();
ТестовыеМодули = ЮТЧитатель.ЗагрузитьТесты(ДополнительныеПараметры.ПараметрыЗапуска);
ЮТСобытия.ПослеЧтенияСценариев(ТестовыеМодули);
ИсполняемыеТестовыеМодули = Новый Массив();
Для Каждого ТестовыйМодуль Из ТестовыеМодули Цикл
ИсполняемыйТестовыйМодуль = ИсполняемыйТестовыйМодуль(ТестовыйМодуль);
ИсполняемыеТестовыеМодули.Добавить(ИсполняемыйТестовыйМодуль);
КонецЦикла;
ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(ИсполняемыеТестовыеМодули);
ДополнительныеПараметры.ИсполняемыеТестовыеМодули = ИсполняемыеТестовыеМодули;
ВызватьСледующийОбработчик(ДополнительныеПараметры, ИсполняемыеТестовыеМодули);
КонецПроцедуры
Процедура ОбработчикВыполнитьТестирование(Результат, ДополнительныеПараметры) Экспорт
РезультатыТестирования = Новый Массив();
КоллекцияКатегорийНаборов = ДополнительныеПараметры.КоллекцияКатегорийНаборов;
ЮТСобытия.ПередВыполнениемТестов(ДополнительныеПараметры.ИсполняемыеТестовыеМодули);
Для Каждого КатегорииНаборов Из КоллекцияКатегорийНаборов Цикл
РезультатыТестирования = Новый Массив();
Для Каждого ТестовыйМодуль Из ДополнительныеПараметры.ИсполняемыеТестовыеМодули Цикл
Результат = ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Клиентские, КатегорииНаборов.ТестовыйМодуль);
ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат);
Результат = ЮТИсполнительСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Серверные, КатегорииНаборов.ТестовыйМодуль);
ЮТЛогирование.ВывестиСерверныеСообщения();
ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат);
ЮТОбщий.ДополнитьМассив(РезультатыТестирования, КатегорииНаборов.Пропущенные);
РезультатыПрогонаМодуля = ВыполнитьТестыМодуля(ТестовыйМодуль);
РезультатыТестирования.Добавить(РезультатыПрогонаМодуля);
КонецЦикла;
ЮТСобытия.ПослеВыполненияТестов(РезультатыТестирования);
ДополнительныеПараметры.РезультатыТестирования = РезультатыТестирования;
ВызватьСледующийОбработчик(ДополнительныеПараметры);
ВызватьСледующийОбработчик(ДополнительныеПараметры, РезультатыТестирования);
КонецПроцедуры
@ -168,6 +243,25 @@
#КонецОбласти
#Область ОбработчикиСобытий
Процедура Инициализация(Параметры) Экспорт
ЮТКонтекст.ИнициализироватьКонтекст();
ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(Параметры.settings);
// Повторно сохраним для передачи на сервер
ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(ЮТКонтекст.ГлобальныеНастройкиВыполнения());
КонецПроцедуры
Процедура ПередВыполнениемТестов(ИсполняемыеМодули) Экспорт
ЮТКонтекст.УстановитьКонтекстИсполнения(ЮТФабрика.НовыйКонтекстИсполнения());
КонецПроцедуры
#КонецОбласти
Процедура ВызватьСледующийОбработчик(ПараметрыИсполнения, Результат = Неопределено)
Обработчик = СледующийОбработчик(ПараметрыИсполнения);
@ -178,6 +272,10 @@
Функция СледующийОбработчик(ПараметрыИсполнения)
Если ТипЗнч(ПараметрыИсполнения) = Тип("ОписаниеОповещения") Тогда
Возврат ПараметрыИсполнения;
КонецЕсли;
ПараметрыИсполнения.ИндексСледующегоОбработчика = ПараметрыИсполнения.ИндексСледующегоОбработчика + 1;
Обработчик = ПараметрыИсполнения.Цепочка[ПараметрыИсполнения.ИндексСледующегоОбработчика];
ЮТЛогирование.Отладка("Следующий обработчик исполнителя: " + Обработчик.ИмяПроцедуры);
@ -193,25 +291,46 @@
КонецПроцедуры
Функция ПараметрыИсполнения()
Функция ИсполняемыйТестовыйМодуль(ТестовыйМодуль)
Параметры = Новый Структура();
Параметры.Вставить("АргументыЗапуска");
Параметры.Вставить("ПараметрыЗапуска");
Параметры.Вставить("Цепочка", Новый Массив());
Параметры.Вставить("ИндексСледующегоОбработчика", -1);
Параметры.Вставить("КоллекцияКатегорийНаборов");
Параметры.Вставить("РезультатыТестирования");
ИсполняемыйТестовыйМодуль = ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля(ТестовыйМодуль);
Возврат Параметры;
КонтекстыПриложения = ЮТФабрика.КонтекстыПриложения();
КонтекстыМодуля = ЮТФабрика.КонтекстыМодуля(ТестовыйМодуль.МетаданныеМодуля);
КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения();
ИсполняемыйТестовыйМодуль.НаборыТестов = ИсполняемыеНаборыМодуля(ТестовыйМодуль);
Для Каждого Набор Из ИсполняемыйТестовыйМодуль.НаборыТестов Цикл
КонтекстИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим);
ОшибкаКонтекста = Неопределено;
Если КонтекстыПриложения.Найти(Набор.Режим) = Неопределено Тогда
ОшибкаКонтекста = "Неподдерживаемый режим запуска";
ИначеЕсли КонтекстыМодуля.Найти(Набор.Режим) = Неопределено Тогда
ОшибкаКонтекста = "Модуль не доступен в этом контексте";
ИначеЕсли КонтекстИсполнения <> КонтекстыИсполнения.Сервер И КонтекстИсполнения <> КонтекстыИсполнения.Клиент Тогда
ОшибкаКонтекста = "Неизвестный контекст/режим исполнения";
КонецЕсли;
Если ОшибкаКонтекста <> Неопределено Тогда
Набор.Выполнять = Ложь;
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Набор, ОшибкаКонтекста);
Для Каждого Тест Из Набор.Тесты Цикл
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Тест, ОшибкаКонтекста);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат ИсполняемыйТестовыйМодуль;
КонецФункции
Функция КатегорииНаборовТестовМодуля(ТестовыйМодуль)
Функция ИсполняемыеНаборыМодуля(ТестовыйМодуль)
КатегорииНаборов = ЮТФабрика.ОписаниеКатегорияНабораТестов(ТестовыйМодуль);
ИсполняемыеТестовыеНаборы = Новый Массив;
Результат = Новый Массив();
Для Каждого ТестовыйНабор Из ТестовыйМодуль.НаборыТестов Цикл
@ -241,68 +360,21 @@
Если НаборыКонтекстов.Количество() Тогда
Для Каждого Элемент Из НаборыКонтекстов Цикл
ИсполняемыеТестовыеНаборы.Добавить(Элемент.Значение);
Результат.Добавить(Элемент.Значение);
КонецЦикла;
Иначе
// TODO. Корякин А. 2021.11.24 А надо ли добавлять при отсутствии тестов
ИсполняемыеТестовыеНаборы.Добавить(ЮТФабрика.ОписаниеИсполняемогоНабораТестов(ТестовыйНабор, ТестовыйМодуль));
КонецЕсли;
КонецЦикла;
КонтекстыПриложения = ЮТФабрика.КонтекстыПриложения();
КонтекстыМодуля = ЮТФабрика.КонтекстыМодуля(ТестовыйМодуль.МетаданныеМодуля);
КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения();
Для Каждого Набор Из ИсполняемыеТестовыеНаборы Цикл
КонтекстИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим);
ОшибкаКонтекста = Неопределено;
Если КонтекстыПриложения.Найти(Набор.Режим) = Неопределено Тогда
ОшибкаКонтекста = "Неподдерживаемый режим запуска";
ИначеЕсли КонтекстыМодуля.Найти(Набор.Режим) = Неопределено Тогда
ОшибкаКонтекста = "Модуль не доступен в этом контексте";
ИначеЕсли КонтекстИсполнения <> КонтекстыИсполнения.Сервер И КонтекстИсполнения <> КонтекстыИсполнения.Клиент Тогда
ОшибкаКонтекста = "Неизвестный контекст/режим исполнения";
КонецЕсли;
Если ОшибкаКонтекста <> Неопределено Тогда
Набор.Выполнять = Ложь;
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Набор, ОшибкаКонтекста);
Для Каждого Тест Из Набор.Тесты Цикл
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Тест, ОшибкаКонтекста);
КонецЦикла;
КонецЕсли;
Если НЕ Набор.Выполнять Тогда
КатегорииНаборов.Пропущенные.Добавить(Набор);
Продолжить;
КонецЕсли;
Если КонтекстИсполнения = КонтекстыИсполнения.Сервер Тогда
КатегорииНаборов.Серверные.Добавить(Набор);
ИначеЕсли КонтекстИсполнения = КонтекстыИсполнения.Клиент Тогда
КатегорииНаборов.Клиентские.Добавить(Набор);
КонецЕсли;
КонецЦикла;
Возврат КатегорииНаборов;
Возврат Результат;
КонецФункции
Процедура ПоказатьОтчет(РезультатыТестирования, Параметры)
Данные = Новый Структура("РезультатыТестирования, ПараметрыЗапуска", РезультатыТестирования, Параметры);
АдресДанных = ПоместитьВоВременноеХранилище(Данные);
АдресДанных = ПоместитьВоВременноеХранилище(Данные, Новый УникальныйИдентификатор());
ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.Основная", Новый Структура("АдресХранилища", АдресДанных));
@ -311,7 +383,7 @@
// Записать код возврата.
//
// Параметры:
// РезультатыТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// РезультатыТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
// Параметры - см. ЮТФабрика.ПараметрыЗапуска
Процедура ЗаписатьКодВозврата(РезультатыТестирования, Параметры)
@ -321,20 +393,28 @@
Возврат;
КонецЕсли;
Для Каждого Набор Из РезультатыТестирования Цикл
Для Каждого Модуль Из РезультатыТестирования Цикл
Если ЗначениеЗаполнено(Набор.Ошибки) Тогда
Успешно = Ложь;
Прервать;
КонецЕсли;
Для Каждого Тест Из Набор.Тесты Цикл
Для Каждого Набор Из Модуль.НаборыТестов Цикл
Если ЗначениеЗаполнено(Тест.Ошибки) Тогда
Если ЗначениеЗаполнено(Набор.Ошибки) Тогда
Успешно = Ложь;
Прервать;
КонецЕсли;
Для Каждого Тест Из Набор.Тесты Цикл
Если ЗначениеЗаполнено(Тест.Ошибки) Тогда
Успешно = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Успешно Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Успешно Тогда
@ -353,4 +433,20 @@
КонецПроцедуры
Функция НаборыТестовРежима(ТестовыйМодуль, ОжидаемыйРежимИсполнения)
Результат = Новый Массив();
Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
Если Набор.Выполнять И ЮТФабрика.КонтекстИсполнения(Набор.Режим) = ОжидаемыйРежимИсполнения Тогда
Результат.Добавить(Набор);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти

View File

@ -21,7 +21,7 @@
// Выполняет тесты группы наборов, соответствующих одному режиму выполнения (клиент/сервер)
// Параметры:
// Наборы - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Наборы тестов модуля
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
//
// Возвращаемое значение:
// Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Результат прогона наборов тестов с заполненной информацией о выполнении

View File

@ -120,6 +120,7 @@
Разделитель = "------------------------------------------------------";
ЗаписатьСообщения(ДанныеКонтекста, ЮТОбщий.ЗначениеВМассиве(Разделитель), Ложь);
Информация("Старт");
КонецПроцедуры
@ -164,19 +165,19 @@
// Обработка события "ПослеФормированияИсполняемыхНаборовТестов"
// Параметры:
// КоллекцияКатегорийНаборов - Массив из см. ЮТФабрика.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов
Процедура ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов) Экспорт
// ИсполняемыеТестовыеМодули - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля - Набор исполняемых наборов
Процедура ПослеФормированияИсполняемыхНаборовТестов(ИсполняемыеТестовыеМодули) Экспорт
Количество = 0;
Для Каждого Наборы Из КоллекцияКатегорийНаборов Цикл
Для Каждого ТестовыйМодуль Из ИсполняемыеТестовыеМодули Цикл
Для Каждого Набор Из Наборы.Клиентские Цикл
ЮТОбщий.Инкремент(Количество, Набор.Тесты.Количество());
КонецЦикла;
Для Каждого Набор Из Наборы.Серверные Цикл
ЮТОбщий.Инкремент(Количество, Набор.Тесты.Количество());
Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
Если Набор.Выполнять Тогда
ЮТОбщий.Инкремент(Количество, Набор.Тесты.Количество());
КонецЕсли;
КонецЦикла;
КонецЦикла;
@ -230,6 +231,10 @@
Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
Контекст = Контекст();
Если НЕ ЛогированиеВключено(Контекст) Тогда
Возврат;
КонецЕсли;
ЮТОбщий.Инкремент(Контекст.КоличествоВыполненныхТестов);
Информация(СтрШаблон("%1 Завершен тест `%2`", Прогресс(), ОписаниеСобытия.Тест.Имя));
@ -251,9 +256,12 @@
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
Процедура ПослеВсехТестов(ОписаниеСобытия) Экспорт
Контекст = Контекст();
Если НЕ ЛогированиеВключено(Контекст) Тогда
Возврат;
КонецЕсли;
#Если Клиент Тогда
Прогресс = Контекст().КоличествоВыполненныхТестов;
ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаЛогирования() + ".КоличествоВыполненныхТестов", Прогресс, Истина);
ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаЛогирования() + ".КоличествоВыполненныхТестов", Контекст.КоличествоВыполненныхТестов, Истина);
#КонецЕсли
Информация(СтрШаблон("Завершен модуль `%1`", ОписаниеСобытия.Модуль.МетаданныеМодуля.ПолноеИмя));
@ -312,6 +320,16 @@
#Область Запись
Функция ЛогированиеВключено(Знач Контекст = Неопределено, Приоритет = Неопределено)
Если Контекст = Неопределено Тогда
Контекст = Контекст();
КонецЕсли;
Возврат Контекст <> Неопределено И Контекст.Включено И (Приоритет = Неопределено ИЛИ Контекст.УровеньЛога <= Приоритет);
КонецФункции
Функция НакопленныеСообщенияЛогирования(Очистить = Ложь) Экспорт
Контекст = Контекст();
@ -329,7 +347,7 @@
Процедура Записать(УровеньЛога, Сообщение, Приоритет)
Контекст = Контекст();
Если Контекст = Неопределено ИЛИ НЕ Контекст.Включено ИЛИ Контекст.УровеньЛога > Приоритет Тогда
Если НЕ ЛогированиеВключено(Контекст, Приоритет) Тогда
Возврат;
КонецЕсли;

View File

@ -23,12 +23,13 @@
// Подсистема должна находится в подсистеме "ЮТФункциональность"
// Параметры:
// ИмяПодсистемы - Строка - Имя подсистемы
//
// Серверные - Булево - Возвращять модули доступные на сервере
// Клиентские - Булево - Возвращять модули доступные на клиенте
// Возвращаемое значение:
// Массив из Строка - Имена модулей входящих в подсистему
Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт
Функция МодулиПодсистемы(ИмяПодсистемы, Серверные = Истина, Клиентские = Истина) Экспорт
Возврат ЮТМетаданныеПовтИсп.МодулиПодсистемы(ИмяПодсистемы);
Возврат ЮТМетаданныеПовтИсп.МодулиПодсистемы(ИмяПодсистемы, Серверные, Клиентские);
КонецФункции
@ -40,7 +41,7 @@
// Возвращаемое значение:
// Структура - Описание менеджера:
// * ОписаниеТипа - см. ЮТМетаданныеСервер.ОписаниеТипаМетаданных
// * Реквизиты - Структура из см. ЮТМетаданныеСервер.ОписаниеРеквизита
// * Реквизиты - Структура из см. ЮТФабрика.ОписаниеРеквизита
// * ТабличныеЧасти - Структура из Структура -
Функция ОписаниеОбъектМетаданных(Знач Значение) Экспорт

View File

@ -18,9 +18,9 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт
Функция МодулиПодсистемы(ИмяПодсистемы, Серверные, Клиентские) Экспорт
Возврат ЮТМетаданныеСервер.МодулиПодсистемы(ИмяПодсистемы);
Возврат ЮТМетаданныеСервер.МодулиПодсистемы(ИмяПодсистемы, Серверные, Клиентские);
КонецФункции

View File

@ -49,10 +49,12 @@
// Подсистема должна находится в подсистеме "ЮТФункциональность"
// Параметры:
// ИмяПодсистемы - Строка - Имя подсистемы
// Серверные - Булево - Возвращять модули доступные на сервере
// Клиентские - Булево - Возвращять модули доступные на клиенте
//
// Возвращаемое значение:
// Массив из Строка - Имена модулей входящих в подсистему
Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт
Функция МодулиПодсистемы(Знач ИмяПодсистемы, Знач Серверные, Знач Клиентские) Экспорт
Подсистема = Метаданные.Подсистемы.ЮТФункциональность.Подсистемы.Найти(ИмяПодсистемы);
@ -68,7 +70,14 @@
Если Метаданные.ОбщиеМодули.Содержит(Объект) Тогда
Модули.Добавить(Объект.Имя);
Добавить = (Серверные И Клиентские)
ИЛИ (Серверные И (Объект.Сервер))
ИЛИ (Клиентские И (Объект.КлиентУправляемоеПриложение Или Объект.ВызовСервера));
// КлиентОбычноеПриложение сознательно не анализируется, он должен идти в паре с другой настройкой
Если Добавить Тогда
Модули.Добавить(Объект.Имя);
КонецЕсли;
КонецЕсли;
@ -111,7 +120,7 @@
КонецФункции
Функция ОписаниеОбъектМетаданных(Знач Значение, ЗаполнятьРеквизиты = Истина) Экспорт
Функция ОписаниеОбъектМетаданных(Знач Значение, Знач ЗаполнятьРеквизиты = Истина) Экспорт
МетаданныеОбъекта = ОбъектМетаданных(Значение);
ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
@ -274,22 +283,10 @@
ЭтоКлюч = ИменаКлючевыхПолей.Найти(Реквизит.Имя) <> Неопределено;
КонецЕсли;
КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит, ЭтоКлюч));
КоллекцияОписаний.Вставить(Реквизит.Имя, ЮТФабрика.ОписаниеРеквизита(Реквизит, ЭтоКлюч));
КонецЦикла;
КонецПроцедуры
Функция ОписаниеРеквизита(Реквизит, ЭтоКлюч) Экспорт
Описание = Новый Структура();
Описание.Вставить("Имя", Реквизит.Имя);
Описание.Вставить("Тип", Реквизит.Тип);
Описание.Вставить("Обязательный", Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку);
Описание.Вставить("ЭтоКлюч", ЭтоКлюч);
Возврат Описание;
КонецФункции
#КонецОбласти

View File

@ -109,11 +109,14 @@
// Параметры:
// Значение - Число
// Шаг - Число
Процедура Инкремент(Значение, Знач Шаг = 1) Экспорт
// Возвращаемое значение:
// Число - Результат инкремента
Функция Инкремент(Значение, Знач Шаг = 1) Экспорт
Значение = Значение + Шаг;
Возврат Значение;
КонецПроцедуры
КонецФункции
Функция ЧислоВСтроку(Значение) Экспорт
@ -135,7 +138,7 @@
Функция ПредставлениеПродолжительности(Знач Продолжительность) Экспорт
Представление = ЧислоВСтроку(Цел(Продолжительность / 1000));
Представление = ДобавитьСтроку(Представление, Продолжительность % 1000, ".");
Представление = ДобавитьСтроку(Представление, Формат(Продолжительность % 1000, "ЧЦ=3; ЧВН=;"), ".");
Инкремент(Представление, " сек");
@ -683,14 +686,18 @@
КонецПроцедуры
Функция СтрокаJSON(Значение) Экспорт
Функция СтрокаJSON(Значение, ИспользоватьСериализатор = Истина) Экспорт
#Если ВебКлиент Тогда
ВызватьИсключение МетодНеДоступен("ЮТОбщий.СтрокаJSON");
#Иначе
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Значение);
Если ИспользоватьСериализатор Тогда
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Значение);
Иначе
ЗаписатьJSON(ЗаписьJSON, Значение);
КонецЕсли;
Возврат ЗаписьJSON.Закрыть();
#КонецЕсли

View File

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

View File

@ -30,6 +30,13 @@
КонецФункции
// Формирует отчет в формате JSON
//
// Параметры:
// РезультатВыполнения - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
//
// Возвращаемое значение:
// ДвоичныеДанные - Данные отчета
Функция ДанныеОтчета(РезультатВыполнения) Экспорт
#Если ВебКлиент Тогда

View File

@ -30,6 +30,13 @@
КонецФункции
// Формирует отчет в формате jUnit
//
// Параметры:
// РезультатВыполнения - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
//
// Возвращаемое значение:
// ДвоичныеДанные - Данные отчета
Функция ДанныеОтчета(Знач РезультатВыполнения) Экспорт
Возврат СформироватьОтчетОТестировании(РезультатВыполнения);
@ -44,7 +51,7 @@
// Формирует отчет (xml-файл) и возвращает его в виде двоичных данных
//
// Параметры:
// РезультатТестирования - Массив - результаты всех сценариев теста
// РезультатТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
// Возвращаемое значение:
// ДвоичныеДанные - полученный отчет
Функция СформироватьОтчетОТестировании(РезультатТестирования) Экспорт
@ -58,9 +65,15 @@
Номер = 0;
Для Каждого Набор Из РезультатТестирования Цикл
ЗаписатьНабор(ЗаписьXML, Набор, Номер);
Номер = Номер + 1;
Для Каждого Модуль Из РезультатТестирования Цикл
Для Каждого Набор Из Модуль.НаборыТестов Цикл
ЗаписатьНабор(ЗаписьXML, Набор, Номер);
Номер = Номер + 1;
КонецЦикла;
КонецЦикла;
ЗаписатьСвойства(ЗаписьXML, Новый Структура("executor, reportDate", "BIA YAXUnit", ТекущаяДатаСеанса()));

View File

@ -94,7 +94,8 @@
Если ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Булево") Тогда
Параметры.ВыполнятьМодульноеТестирование = ЗначениеКлючаЗапуска;
Возврат Параметры;
Параметры.showReport = Истина;
Параметры.closeAfterTests = Ложь;
ИначеЕсли ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Строка") Тогда

View File

@ -26,7 +26,17 @@
Функция ОбработчикиСобытий() Экспорт
Возврат ЮТМетаданные.МодулиПодсистемы("ЮТОбработчикиСобытий");
Серверные = Ложь;
Клиентские = Ложь;
#Если Сервер Тогда
Серверные = Истина;
#КонецЕсли
#Если Клиент Тогда
Клиентские = Истина;
#КонецЕсли
Возврат ЮТМетаданные.МодулиПодсистемы("ЮТОбработчикиСобытий", Серверные, Клиентские);
КонецФункции

View File

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

View File

@ -278,6 +278,30 @@
КонецФункции
// Описание исполняемого тестового модуля.
// Содержит всю необходимую информацию для прогона тестов, а также данные результата
// Параметры:
// ТестовыйМодуль - см. ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Структура - Описание тестового модуля:
// * МетаданныеМодуля - см. ЮТФабрика.ОписаниеМодуля
// * НаборыТестов - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Ошибки - Массив из см. ЮТФабрика.ОписаниеВозникшейОшибки
// * НастройкиВыполнения- Структура - Настройки исполнения теста
Функция ОписаниеИсполняемогоТестовогоМодуля(ТестовыйМодуль) Экспорт
Описание = Новый Структура;
Описание.Вставить("МетаданныеМодуля", ТестовыйМодуль.МетаданныеМодуля);
Описание.Вставить("НаборыТестов", Новый Массив);
Описание.Вставить("Ошибки", ЮТОбщий.СкопироватьМассив(ТестовыйМодуль.Ошибки));
Описание.Вставить("НастройкиВыполнения", ЮТОбщий.СкопироватьСтруктуру(ТестовыйМодуль.НастройкиВыполнения));
Возврат Описание;
КонецФункции
// ОписаниеИсполняемогоНабораТестов
// Возвращает описание исполняемого тестового набора.
// Содержит данные необходимые для выполнения прогона тестов
@ -307,6 +331,7 @@
Описание.Вставить("Теги", НаборТестов.Теги);
Описание.Вставить("Ошибки", ЮТОбщий.СкопироватьМассив(НаборТестов.Ошибки));
Описание.Вставить("Режим", "");
Описание.Вставить("ТестовыйМодуль", ТестовыйМодуль);
Описание.Вставить("МетаданныеМодуля", ТестовыйМодуль.МетаданныеМодуля);
Описание.Вставить("Тесты", Новый Массив);
Описание.Вставить("Выполнять", Описание.Ошибки.Количество() = 0);
@ -593,6 +618,30 @@
КонецФункции
// Описание реквизита объекта метаданных
//
// Параметры:
// Реквизит - ОбъектМетаданных
// ЭтоКлюч - Булево - Это ключевой реквизит (ссылка, измерение)
//
// Возвращаемое значение:
// Структура - Описание реквизита:
// * Имя - Строка
// * Тип - ОписаниеТипов
// * Обязательный - Булево
// * ЭтоКлюч - Булево
Функция ОписаниеРеквизита(Знач Реквизит, Знач ЭтоКлюч) Экспорт
Описание = Новый Структура();
Описание.Вставить("Имя", Реквизит.Имя);
Описание.Вставить("Тип", Реквизит.Тип);
Описание.Вставить("Обязательный", Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку);
Описание.Вставить("ЭтоКлюч", ЭтоКлюч);
Возврат Описание;
КонецФункции
#КонецОбласти
#Область КонструкторыКонтекстов
@ -815,10 +864,9 @@
Функция НастройкиВыполнения() Экспорт
ПараметрыИсполнения = ПараметрыИсполненияТеста();
Настройки = Новый Структура();
ПараметрыИсполнения = ПараметрыИсполненияТеста();
Настройки.Вставить(ПараметрыИсполнения.ВТранзакции, Ложь);
Возврат Настройки;
@ -829,6 +877,7 @@
Параметры = Новый Структура();
Параметры.Вставить("file", "");
Параметры.Вставить("console", Ложь);
Параметры.Вставить("enable", Неопределено);
Параметры.Вставить("level", ЮТЛогирование.УровниЛога().Отладка);

View File

@ -9,7 +9,6 @@
<key>ru</key>
<value>Конструктор тестовых данных</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<defaultForm>DataProcessor.ЮТКонструкторТестовыхДанных.Form.КлиентскийКонструктор</defaultForm>
<forms uuid="c0ef2e2b-96b6-4e4c-b41d-32d571d74653">
<name>КлиентскийКонструктор</name>

View File

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

View File

@ -0,0 +1,33 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// 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.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область ОбработчикиСобытий
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.СозданиеНастройки",
,
ПараметрыВыполненияКоманды.Источник,
ПараметрыВыполненияКоманды.Уникальность,
ПараметрыВыполненияКоманды.Окно,
ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
#КонецОбласти

View File

@ -126,7 +126,7 @@
<item xsi:type="FilterItemComparison">
<left xsi:type="dcscor:Field">ДеревоТестов.ВремяВыполнения</left>
<comparisonType>Greater</comparisonType>
<right xsi:type="xs:decimal">1</right>
<right xsi:type="xs:decimal">1000</right>
</item>
</item>
<item xsi:type="FilterItemGroup">
@ -139,7 +139,7 @@
<item xsi:type="FilterItemComparison">
<left xsi:type="dcscor:Field">ДеревоТестов.ВремяВыполнения</left>
<comparisonType>Greater</comparisonType>
<right xsi:type="xs:decimal">10</right>
<right xsi:type="xs:decimal">10000</right>
</item>
</item>
</item>

View File

@ -3,9 +3,233 @@
<items xsi:type="form:FormGroup">
<name>ОсновнаяКоманднаяПанель</name>
<id>122</id>
<items xsi:type="form:FormGroup">
<name>ГруппаЗапуск</name>
<id>140</id>
<items xsi:type="form:Button">
<name>ЗапуститьВсеТестыОсновная</name>
<id>138</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>ЗапуститьВсеТестыОсновнаяРасширеннаяПодсказка</name>
<id>139</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<commandName>Form.Command.ЗапуститьВсеТесты</commandName>
<representation>Auto</representation>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<representationInContextMenu>Auto</representationInContextMenu>
</items>
<items xsi:type="form:FormGroup">
<name>ГруппаМенюЗапуск</name>
<id>134</id>
<items xsi:type="form:Button">
<name>ПерезапуститьУпавшиеТесты</name>
<id>136</id>
<title>
<key>ru</key>
<value>Упавшие тесты</value>
</title>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>ПерезапуститьУпавшиеТестыРасширеннаяПодсказка</name>
<id>137</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<commandName>Form.Command.ПерезапуститьУпавшиеТесты</commandName>
<representation>Auto</representation>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<representationInContextMenu>Auto</representationInContextMenu>
</items>
<items xsi:type="form:Button">
<name>ЗапуститьВсеТесты</name>
<id>126</id>
<title>
<key>ru</key>
<value>Все тесты</value>
</title>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>ЗапуститьВсеТестыРасширеннаяПодсказка</name>
<id>127</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<commandName>Form.Command.ЗапуститьВсеТесты</commandName>
<representation>Auto</representation>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<representationInContextMenu>Auto</representationInContextMenu>
</items>
<items xsi:type="form:Button">
<name>ЗапуститьВыделенныеТесты</name>
<id>142</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>ЗапуститьВыделенныеТестыРасширеннаяПодсказка</name>
<id>143</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<commandName>Form.Command.ЗапуститьВыделенныеТесты</commandName>
<representation>Auto</representation>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<representationInContextMenu>Auto</representationInContextMenu>
</items>
<items xsi:type="form:Button">
<name>ЗамерВремениВыполнения</name>
<id>128</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>ЗамерВремениВыполненияРасширеннаяПодсказка</name>
<id>129</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<commandName>Form.Command.ЗамерВремениВыполнения</commandName>
<representation>Auto</representation>
<onlyInAllActions>true</onlyInAllActions>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<representationInContextMenu>Auto</representationInContextMenu>
</items>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<title>
<key>ru</key>
<value> </value>
</title>
<extendedTooltip>
<name>ГруппаМенюЗапускРасширеннаяПодсказка</name>
<id>135</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<type>Popup</type>
<extInfo xsi:type="form:PopupGroupExtInfo">
<picture xsi:type="core:PictureRef">
<picture>StdPicture.GenerateReport</picture>
</picture>
</extInfo>
</items>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<title>
<key>ru</key>
<value>Группа1</value>
</title>
<extendedTooltip>
<name>ГруппаЗапускРасширеннаяПодсказка</name>
<id>141</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<extInfo xsi:type="form:ButtonGroupExtInfo">
<representation>Compact</representation>
</extInfo>
</items>
<items xsi:type="form:Button">
<name>ФормаСформироватьНастройки</name>
<id>125</id>
<id>17</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
@ -596,12 +820,45 @@
<contextMenu>
<name>ДеревоТестовКонтекстноеМеню</name>
<id>31</id>
<items xsi:type="form:Button">
<name>ДеревоТестовКонтекстноеМенюЗапуститьВыделенныеТесты</name>
<id>130</id>
<title>
<key>ru</key>
<value>Запустить выбранные тесты</value>
</title>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>ДеревоТестовКонтекстноеМенюЗапуститьВыделенныеТестыРасширеннаяПодсказка</name>
<id>131</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<commandName>Form.Command.ЗапуститьВыделенныеТесты</commandName>
<representation>Auto</representation>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<representationInContextMenu>Auto</representationInContextMenu>
</items>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<representation>Tree</representation>
<readOnly>true</readOnly>
@ -625,6 +882,8 @@
<rowsPicture xsi:type="core:PictureRef">
<picture>CommonPicture.ЮТЭлементыТестов</picture>
</rowsPicture>
<searchStringLocation>None</searchStringLocation>
<searchControlLocation>None</searchControlLocation>
</items>
<items xsi:type="form:FormGroup">
<name>ГруппаДанныеОшибок</name>
@ -1106,6 +1365,10 @@
<event>OnCreateAtServer</event>
<name>ПриСозданииНаСервере</name>
</handlers>
<handlers>
<event>OnOpen</event>
<name>ПриОткрытии</name>
</handlers>
<autoTitle>true</autoTitle>
<autoUrl>true</autoUrl>
<group>Vertical</group>
@ -1150,7 +1413,7 @@
<key>ru</key>
<value>Представление</value>
</title>
<id>4</id>
<id>12</id>
<valueType>
<types>String</types>
<stringQualifiers/>
@ -1168,7 +1431,7 @@
<key>ru</key>
<value>Состояние</value>
</title>
<id>6</id>
<id>20</id>
<valueType>
<types>String</types>
<stringQualifiers/>
@ -1403,10 +1666,10 @@
</additionalColumns>
</attributes>
<attributes>
<name>АдресДанных</name>
<name>АдресОтчета</name>
<title>
<key>ru</key>
<value>Адрес данных</value>
<value>Адрес отчета</value>
</title>
<id>16</id>
<valueType>
@ -1440,6 +1703,23 @@
<common>true</common>
</edit>
</attributes>
<attributes>
<name>ЗагрузитьТестыПриОткрытии</name>
<title>
<key>ru</key>
<value>Загрузить тесты при открытии</value>
</title>
<id>125</id>
<valueType>
<types>Boolean</types>
</valueType>
<view>
<common>true</common>
</view>
<edit>
<common>true</common>
</edit>
</attributes>
<formCommands>
<name>Сравнить</name>
<title>
@ -1471,11 +1751,99 @@
<use>
<common>true</common>
</use>
<picture xsi:type="core:PictureRef">
<picture>StdPicture.ReportSettings</picture>
</picture>
<action xsi:type="form:FormCommandHandlerContainer">
<handler>
<name>СформироватьНастройки</name>
</handler>
</action>
<representation>TextPicture</representation>
<currentRowUse>DontUse</currentRowUse>
</formCommands>
<formCommands>
<name>ЗапуститьВсеТесты</name>
<title>
<key>ru</key>
<value>Запустить все тесты</value>
</title>
<id>3</id>
<use>
<common>true</common>
</use>
<picture xsi:type="core:PictureRef">
<picture>StdPicture.GenerateReport</picture>
</picture>
<action xsi:type="form:FormCommandHandlerContainer">
<handler>
<name>ЗапуститьВсеТесты</name>
</handler>
</action>
<representation>TextPicture</representation>
<currentRowUse>DontUse</currentRowUse>
</formCommands>
<formCommands>
<name>ЗамерВремениВыполнения</name>
<title>
<key>ru</key>
<value>Замер времени выполнения</value>
</title>
<id>4</id>
<use>
<common>true</common>
</use>
<picture xsi:type="core:PictureRef">
<picture>StdPicture.BusinessProcessStart</picture>
</picture>
<action xsi:type="form:FormCommandHandlerContainer">
<handler>
<name>ЗамерВремениВыполнения</name>
</handler>
</action>
<representation>TextPicture</representation>
<currentRowUse>DontUse</currentRowUse>
</formCommands>
<formCommands>
<name>ЗапуститьВыделенныеТесты</name>
<title>
<key>ru</key>
<value>Выбранные тесты</value>
</title>
<id>5</id>
<use>
<common>true</common>
</use>
<picture xsi:type="core:PictureRef">
<picture>StdPicture.GenerateReport</picture>
</picture>
<action xsi:type="form:FormCommandHandlerContainer">
<handler>
<name>ЗапуститьВыделенныеТесты</name>
</handler>
</action>
<representation>TextPicture</representation>
<currentRowUse>DontUse</currentRowUse>
</formCommands>
<formCommands>
<name>ПерезапуститьУпавшиеТесты</name>
<title>
<key>ru</key>
<value>Перезапустить упавшие тесты</value>
</title>
<id>6</id>
<use>
<common>true</common>
</use>
<picture xsi:type="core:PictureRef">
<picture>CommonPicture.ЮТУпал</picture>
</picture>
<action xsi:type="form:FormCommandHandlerContainer">
<handler>
<name>ПерезапуститьУпавшиеТесты</name>
</handler>
</action>
<representation>TextPicture</representation>
<currentRowUse>DontUse</currentRowUse>
</formCommands>
<commandInterface>

View File

@ -16,22 +16,40 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область ОписаниеПеременных
&НаКлиенте
Перем ИсполняемыеТестовыеМодули;
&НаКлиенте
Перем ПараметрыЗапускаТестирования;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АдресХранилища") И ЭтоАдресВременногоХранилища(Параметры.АдресХранилища) Тогда
ОтобразитьРезультатыТестирования(Параметры.АдресХранилища);
АдресОтчета = Параметры.АдресХранилища;
КонецЕсли;
Параметры.Свойство("ЗагрузитьТесты", ЗагрузитьТестыПриОткрытии);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЗначениеЗаполнено(АдресОтчета) Тогда
ДанныеОтчета = ДанныеОтчета(АдресОтчета);
ПослеЗагрузкиТестов(ДанныеОтчета.РезультатыТестирования, ДанныеОтчета.ПараметрыЗапуска);
ИначеЕсли ЗагрузитьТестыПриОткрытии Тогда
ЗагрузитьТесты();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
@ -90,67 +108,114 @@
КонецПроцедуры
&НаКлиенте
Процедура ЗамерВремениВыполнения(Команда)
Обработчик = Новый ОписаниеОповещения("ПослеВодаКоличестваИтерацийЗамера", ЭтотОбъект);
ПоказатьВводЧисла(Обработчик, 100, "Укажите количество итераций замера", 3, 0);
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьВсеТесты(Команда)
ВыполнитьТестовыеМодули(ИсполняемыеТестовыеМодули);
КонецПроцедуры
&НаКлиенте
Процедура ПерезапуститьУпавшиеТесты(Команда)
СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста();
Статусы = ЮТОбщий.ЗначениеВМассиве(СтатусыИсполненияТеста.Ошибка, СтатусыИсполненияТеста.Сломан);
Модули = МодулиСоответствующиеСтатусу(Статусы);
ВыполнитьТестовыеМодули(Модули);
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьВыделенныеТесты(Команда)
Модули = ВыделенныеТестовыеМодули();
ВыполнитьТестовыеМодули(Модули);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура ОтобразитьРезультатыТестирования(АдресХранилища)
#Область ВыводОтчета
&НаСервереБезКонтекста
Функция ДанныеОтчета(Знач АдресХранилища)
Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
УдалитьИзВременногоХранилища(АдресХранилища);
РезультатТестирования = Данные.РезультатыТестирования;
Возврат Данные;
КонецФункции
&НаКлиенте
Процедура ОтобразитьРезультатТеста(СтрокаТеста, Тест, Набор)
СтрокаТеста.Представление = Тест.Имя;
СтрокаТеста.Контекст = НормализоватьКонтекст(Набор.Режим);
СтрокаТеста.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Тест.Длительность);
СтрокаТеста.ВремяВыполнения = Тест.Длительность;
СтрокаТеста.Состояние = Тест.Статус;
СтрокаТеста.ТипОбъекта = 3;
СтрокаТеста.Иконка = КартинкаСтатуса(Тест.Статус);
ЗаполнитьОшибки(СтрокаТеста, Тест);
КонецПроцедуры
&НаКлиенте
Функция ОбновитьСтатистикуНабора(СтрокаНабора)
СтатистикаНабора = СтатистикаНабора(СтрокаНабора);
Статусы = ЮТФабрика.СтатусыИсполненияТеста();
Если СтатистикаНабора.Сломано Тогда
СтрокаНабора.Состояние = Статусы.Сломан;
ИначеЕсли СтатистикаНабора.Упало Тогда
СтрокаНабора.Состояние = Статусы.Ошибка;
ИначеЕсли СтатистикаНабора.Пропущено Тогда
СтрокаНабора.Состояние = Статусы.Пропущен;
ИначеЕсли СтатистикаНабора.Неизвестно Тогда
СтрокаНабора.Состояние = Статусы.Ошибка;
ИначеЕсли СтатистикаНабора.Ожидание Тогда
СтрокаНабора.Состояние = Статусы.Ожидание;
Иначе
СтрокаНабора.Состояние = Статусы.Успешно;
КонецЕсли;
СтрокаНабора.Прогресс = ГрафическоеПредставлениеСтатистики(СтатистикаНабора);
СтрокаНабора.Иконка = КартинкаСтатуса(СтрокаНабора.Состояние);
СтрокаНабора.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(СтатистикаНабора.Продолжительность);
СтрокаНабора.ВремяВыполнения = СтатистикаНабора.Продолжительность;
Возврат СтатистикаНабора;
КонецФункции
&НаКлиенте
Процедура ОбновитьОбщуюСтатистику(ОбновлятьСтатистикуНаборов)
ОбщаяСтатистика = Статистика();
Для Каждого Набор Из РезультатТестирования Цикл
Для Каждого СтрокаНабора Из ДеревоТестов.ПолучитьЭлементы() Цикл
СтрокаНабора = ДеревоТестов.ПолучитьЭлементы().Добавить();
СтрокаНабора.Набор = Истина;
СтрокаНабора.Представление = Набор.Представление;
СтрокаНабора.Контекст = НормализоватьКонтекст(Набор.Режим);
СтрокаНабора.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Набор.Длительность);
СтрокаНабора.ВремяВыполнения = Набор.Длительность / 1000;
СтрокаНабора.ТипОбъекта = 2;
ЗаполнитьОшибки(СтрокаНабора, Набор);
СтатистикаНабора = Статистика();
Для Каждого Тест Из Набор.Тесты Цикл
СтрокаТеста = СтрокаНабора.ПолучитьЭлементы().Добавить();
СтрокаТеста.Представление = Тест.Имя;
СтрокаТеста.Контекст = НормализоватьКонтекст(Набор.Режим);
СтрокаТеста.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Тест.Длительность);
СтрокаТеста.ВремяВыполнения = Тест.Длительность / 1000;
СтрокаТеста.Состояние = Тест.Статус;
СтрокаТеста.ТипОбъекта = 3;
СтрокаТеста.Иконка = КартинкаСтатуса(Тест.Статус);
ЗаполнитьОшибки(СтрокаТеста, Тест);
ИнкрементСтатистики(СтатистикаНабора, Тест.Статус, Статусы);
КонецЦикла;
Если СтатистикаНабора.Сломано Тогда
СтрокаНабора.Состояние = Статусы.Сломан;
ИначеЕсли СтатистикаНабора.Упало Тогда
СтрокаНабора.Состояние = Статусы.Ошибка;
ИначеЕсли СтатистикаНабора.Пропущено Тогда
СтрокаНабора.Состояние = Статусы.Пропущен;
ИначеЕсли СтатистикаНабора.Неизвестно Тогда
СтрокаНабора.Состояние = Статусы.Ошибка;
Если ОбновлятьСтатистикуНаборов Тогда
СтатистикаНабора = ОбновитьСтатистикуНабора(СтрокаНабора);
Иначе
СтрокаНабора.Состояние = Статусы.Успешно;
СтатистикаНабора = СтатистикаНабора(СтрокаНабора);
КонецЕсли;
СтрокаНабора.Прогресс = ГрафическоеПредставлениеСтатистики(СтатистикаНабора);
СтрокаНабора.Иконка = КартинкаСтатуса(СтрокаНабора.Состояние);
Для Каждого Элемент Из СтатистикаНабора Цикл
ЮТОбщий.Инкремент(ОбщаяСтатистика[Элемент.Ключ], Элемент.Значение);
КонецЦикла;
@ -158,10 +223,27 @@
КонецЦикла;
Элементы.СтатистикаВыполнения.Заголовок = ПредставлениеСтатистики(ОбщаяСтатистика);
КонецПроцедуры
&НаСервереБезКонтекста
&НаКлиенте
Функция СтатистикаНабора(СтрокаНабора)
СтатистикаНабора = Статистика();
Статусы = ЮТФабрика.СтатусыИсполненияТеста();
Для Каждого СтрокаТеста Из СтрокаНабора.ПолучитьЭлементы() Цикл
ИнкрементСтатистики(СтатистикаНабора, СтрокаТеста.Состояние, Статусы);
ЮТОбщий.Инкремент(СтатистикаНабора.Продолжительность, СтрокаТеста.ВремяВыполнения);
КонецЦикла;
Возврат СтатистикаНабора;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьОшибки(СтрокаДерева, ОписаниеОбъекта)
Для Каждого Ошибка Из ОписаниеОбъекта.Ошибки Цикл
@ -176,7 +258,7 @@
КонецПроцедуры
&НаСервереБезКонтекста
&НаКлиенте
Функция Статистика()
Статистика = Новый Структура();
@ -185,13 +267,15 @@
Статистика.Вставить("Упало", 0);
Статистика.Вставить("Сломано", 0);
Статистика.Вставить("Пропущено", 0);
Статистика.Вставить("Ожидание", 0);
Статистика.Вставить("Неизвестно", 0);
Статистика.Вставить("Продолжительность", 0);
Возврат Статистика;
КонецФункции
&НаСервереБезКонтекста
&НаКлиентеНаСервереБезКонтекста
Функция НормализоватьКонтекст(Контекст)
Если СтрНачинаетсяС(Контекст, "Клиент") Тогда
@ -202,7 +286,7 @@
КонецФункции
&НаСервереБезКонтекста
&НаКлиентеНаСервереБезКонтекста
Процедура ИнкрементСтатистики(Статистика, Статус, Знач Статусы = Неопределено)
Если Статусы = Неопределено Тогда
@ -227,6 +311,10 @@
ЮТОбщий.Инкремент(Статистика.Пропущено);
ИначеЕсли Статус = Статусы.Ожидание Тогда
ЮТОбщий.Инкремент(Статистика.Ожидание);
Иначе
ЮТОбщий.Инкремент(Статистика.Неизвестно);
@ -235,6 +323,8 @@
КонецПроцедуры
#КонецОбласти
#Область Интерфейсное
&НаСервереБезКонтекста
@ -272,7 +362,13 @@
БлокиСтатистики = Новый Массив();
Разделитель = "; ";
БлокиСтатистики.Добавить(СтрШаблон("Тестов: %1/%2", Статистика.Всего, Статистика.Всего - Статистика.Пропущено));
БлокиСтатистики.Добавить(СтрШаблон("Тестов: %1/%2", Статистика.Всего - Статистика.Пропущено - Статистика.Ожидание, Статистика.Всего));
Если Статистика.Ожидание Тогда
БлокиСтатистики.Добавить(Разделитель);
БлокиСтатистики.Добавить(БиблиотекаКартинок.ЮТНеизвестный);
БлокиСтатистики.Добавить(" Ожидание: " + Статистика.Ожидание);
КонецЕсли;
Если Статистика.Пропущено Тогда
БлокиСтатистики.Добавить(Разделитель);
@ -298,6 +394,9 @@
БлокиСтатистики.Добавить(" Неизвестно: " + Статистика.Неизвестно);
КонецЕсли;
БлокиСтатистики.Добавить(Разделитель);
БлокиСтатистики.Добавить(" Время выполнения: " + ЮТОбщий.ПредставлениеПродолжительности(Статистика.Продолжительность));
Возврат Новый ФорматированнаяСтрока(БлокиСтатистики);
КонецФункции
@ -315,11 +414,14 @@
Функция БлокиСтатистики(Статистика)
Блоки = Новый Массив();
Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Успешно, "25AE88"));
Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Пропущено, "999999"));
Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Упало, "EFCE4A"));
Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Сломано, "D75A4A"));
Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Неизвестно, "9400d3"));
Ключи = "Количество, Цвет";
Блоки.Добавить(Новый Структура(Ключи, Статистика.Успешно, "25AE88"));
Блоки.Добавить(Новый Структура(Ключи, Статистика.Пропущено, "999999"));
Блоки.Добавить(Новый Структура(Ключи, Статистика.Упало, "EFCE4A"));
Блоки.Добавить(Новый Структура(Ключи, Статистика.Сломано, "D75A4A"));
Блоки.Добавить(Новый Структура(Ключи, Статистика.Ожидание, "BBBBBB"));
Блоки.Добавить(Новый Структура(Ключи, Статистика.Неизвестно, "9400d3"));
Сдвиг = 0;
Высота = 20;
@ -348,6 +450,233 @@
#КонецОбласти
#Область ЗагрузкаТестов
&НаКлиенте
Процедура ЗагрузитьТесты()
ПараметрыЗапуска = ПараметрыЗапуска();
ПараметрыЗагрузки = ЮТИсполнительКлиент.ПараметрыИсполнения();
ПараметрыЗагрузки.Цепочка.Добавить(Новый ОписаниеОповещения("ПослеЗагрузкиТестов", ЭтотОбъект, ПараметрыЗапуска));
ПараметрыЗагрузки.ПараметрыЗапуска = ПараметрыЗапуска;
ЮТСобытия.Инициализация(ПараметрыЗагрузки.ПараметрыЗапуска);
ЮТИсполнительКлиент.ОбработчикЗагрузитьТесты(Неопределено, ПараметрыЗагрузки);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗагрузкиТестов(Результат, ПараметрыЗапуска) Экспорт
ИсполняемыеТестовыеМодули = Результат;
ПараметрыЗапускаТестирования = ПараметрыЗапуска;
Для Каждого ТестовыйМодуль Из ИсполняемыеТестовыеМодули Цикл
Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
СтрокаНабора = ДеревоТестов.ПолучитьЭлементы().Добавить();
СтрокаНабора.Набор = Истина;
СтрокаНабора.Представление = Набор.Представление;
СтрокаНабора.Контекст = НормализоватьКонтекст(Набор.Режим);
СтрокаНабора.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Набор.Длительность);
СтрокаНабора.ВремяВыполнения = Набор.Длительность;
СтрокаНабора.ТипОбъекта = 2;
ЗаполнитьОшибки(СтрокаНабора, Набор);
Набор.Вставить("Идентификатор", СтрокаНабора.ПолучитьИдентификатор());
Для Каждого Тест Из Набор.Тесты Цикл
СтрокаТеста = СтрокаНабора.ПолучитьЭлементы().Добавить();
ОтобразитьРезультатТеста(СтрокаТеста, Тест, Набор);
Тест.Вставить("Идентификатор", СтрокаТеста.ПолучитьИдентификатор());
КонецЦикла;
КонецЦикла;
КонецЦикла;
ОбновитьОбщуюСтатистику(Истина);
ЮТКонтекст.УдалитьКонтекст();
КонецПроцедуры
#КонецОбласти
#Область ЗапускТестов
&НаКлиенте
Процедура ВыполнитьТестовыеМодули(Модули)
Если Модули.Количество() = 0 Тогда
ПоказатьПредупреждение(, "Нет тестов для запуска");
Возврат;
КонецЕсли;
ОповещениеПользователю("Прогон тестов", "Запушено выполнение тестов");
ЮТСобытия.Инициализация(ПараметрыЗапускаТестирования);
ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(Модули);
ЮТСобытия.ПередВыполнениемТестов(Модули);
Для Каждого Модуль Из Модули Цикл
Результат = ЮТИсполнительКлиент.ВыполнитьТестыМодуля(Модуль);
Для Каждого Набор Из Результат.НаборыТестов Цикл
Для Каждого Тест Из Набор.Тесты Цикл
Строка = ДеревоТестов.НайтиПоИдентификатору(Тест.Идентификатор);
ОтобразитьРезультатТеста(Строка, Тест, Набор);
КонецЦикла;
Строка = ДеревоТестов.НайтиПоИдентификатору(Набор.Идентификатор);
ОбновитьСтатистикуНабора(Строка);
КонецЦикла;
КонецЦикла;
ОбновитьОбщуюСтатистику(Ложь);
ЮТКонтекст.УдалитьКонтекст();
ОповещениеПользователю("Прогон тестов завершен", "Завершено выполнение тестов");
КонецПроцедуры
&НаКлиенте
Функция ВыделенныеТестовыеМодули()
МодулиКЗапуску = Новый Массив();
ВыделенныеСтроки = Элементы.ДеревоТестов.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 0 Тогда
Возврат МодулиКЗапуску;
КонецЕсли;
Для Каждого Модуль Из ИсполняемыеТестовыеМодули Цикл
НаборыКЗапуску = Новый Массив();
Для Каждого Набор Из Модуль.НаборыТестов Цикл
Если ВыделенныеСтроки.Найти(Набор.Идентификатор) <> Неопределено Тогда
НаборыКЗапуску.Добавить(Набор);
Продолжить;
КонецЕсли;
ТестыКЗапуску = Новый Массив();
Для Каждого Тест Из Набор.Тесты Цикл
Если ВыделенныеСтроки.Найти(Тест.Идентификатор) <> Неопределено Тогда
ТестыКЗапуску.Добавить(Тест);
КонецЕсли;
КонецЦикла;
Если ТестыКЗапуску.Количество() Тогда
ЗапускаемыйНабор = ЮТОбщий.СкопироватьСтруктуру(Набор);
ЗапускаемыйНабор.Тесты = ТестыКЗапуску;
НаборыКЗапуску.Добавить(ЗапускаемыйНабор);
КонецЕсли;
КонецЦикла;
Если НаборыКЗапуску.Количество() Тогда
ЗапускаемыйМодуль = ЮТОбщий.СкопироватьСтруктуру(Модуль);
ЗапускаемыйМодуль.НаборыТестов = НаборыКЗапуску;
МодулиКЗапуску.Добавить(ЗапускаемыйМодуль);
КонецЕсли;
КонецЦикла;
Возврат МодулиКЗапуску;
КонецФункции
&НаКлиенте
Функция МодулиСоответствующиеСтатусу(Статусы)
МодулиКЗапуску = Новый Массив();
ВыделенныеСтроки = Элементы.ДеревоТестов.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 0 Тогда
Возврат МодулиКЗапуску;
КонецЕсли;
Для Каждого Модуль Из ИсполняемыеТестовыеМодули Цикл
НаборыКЗапуску = Новый Массив();
Для Каждого Набор Из Модуль.НаборыТестов Цикл
ТестыКЗапуску = Новый Массив();
Для Каждого Тест Из Набор.Тесты Цикл
Если Статусы.Найти(Тест.Статус) <> Неопределено Тогда
ТестыКЗапуску.Добавить(Тест);
КонецЕсли;
КонецЦикла;
Если ТестыКЗапуску.Количество() Тогда
ЗапускаемыйНабор = ЮТОбщий.СкопироватьСтруктуру(Набор);
ЗапускаемыйНабор.Тесты = ТестыКЗапуску;
НаборыКЗапуску.Добавить(ЗапускаемыйНабор);
КонецЕсли;
КонецЦикла;
Если НаборыКЗапуску.Количество() Тогда
ЗапускаемыйМодуль = ЮТОбщий.СкопироватьСтруктуру(Модуль);
ЗапускаемыйМодуль.НаборыТестов = НаборыКЗапуску;
МодулиКЗапуску.Добавить(ЗапускаемыйМодуль);
КонецЕсли;
КонецЦикла;
Возврат МодулиКЗапуску;
КонецФункции
&НаКлиенте
Процедура ВыполнитьЗапускТестовПоПараметрам(ПараметрыЗапуска, Обработчик)
ЮТИсполнительКлиент.ВыполнитьМодульноеТестированиеПоНастройке(ПараметрыЗапуска, Обработчик);
КонецПроцедуры
#КонецОбласти
#Область ПараметрыЗапуска
&НаКлиенте
Функция ПараметрыЗапуска()
ПараметрыЗапуска = ЮТФабрика.ПараметрыЗапуска();
ПараметрыЗапуска.closeAfterTests = Ложь;
ПараметрыЗапуска.showReport = Ложь;
ПараметрыЗапуска.ВыполнятьМодульноеТестирование = Истина;
Возврат ПараметрыЗапуска;
КонецФункции
#КонецОбласти
&НаКлиенте
Процедура ОбновитьДоступностьСравнения()
@ -356,4 +685,74 @@
КонецПроцедуры
&НаКлиенте
Процедура ПослеВодаКоличестваИтерацийЗамера(Результат, ДополнительныеПараметры) Экспорт
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Возврат;
КонецЕсли;
ПараметрыЗамера = Новый Структура();
ПараметрыЗамера.Вставить("ПараметрыЗапуска", ПараметрыЗапуска());
ПараметрыЗамера.Вставить("КоличествоИтераций", Результат);
ПараметрыЗамера.Вставить("ТекущаяИтерация", 0);
ПараметрыЗамера.Вставить("Замеры", Новый Массив());
ПараметрыЗамера.Вставить("НачалоИтерации");
ПослеВыполненияИтерации(Неопределено, ПараметрыЗамера);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыполненияИтерации(Результат, ПараметрыЗамера) Экспорт
Если ПараметрыЗамера.ТекущаяИтерация > 0 Тогда
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - ПараметрыЗамера.НачалоИтерации;
ПараметрыЗамера.Замеры.Добавить(Длительность);
КонецЕсли;
Если ЮТОбщий.Инкремент(ПараметрыЗамера.ТекущаяИтерация) <= ПараметрыЗамера.КоличествоИтераций Тогда
Обработчик = Новый ОписаниеОповещения("ПослеВыполненияИтерации", ЭтотОбъект, ПараметрыЗамера);
ПараметрыЗамера.НачалоИтерации = ТекущаяУниверсальнаяДатаВМиллисекундах();
ВыполнитьЗапускТестовПоПараметрам(ПараметрыЗамера.ПараметрыЗапуска, Обработчик);
Иначе
ОбщееВремя = 0;
Для Каждого Замер Из ПараметрыЗамера.Замеры Цикл
ЮТОбщий.Инкремент(ОбщееВремя, Замер);
КонецЦикла;
Список = Новый СписокЗначений();
Список.ЗагрузитьЗначения(ПараметрыЗамера.Замеры);
Список.СортироватьПоЗначению();
ОбщееВремя = Окр(ОбщееВремя / 1000, 2);
СреднееВремя = Окр(ОбщееВремя / ПараметрыЗамера.Замеры.Количество(), 2);
МедианноеВремя = Окр(Список[Цел(Список.Количество() / 2) + 1].Значение / 1000, 2);
Сообщение = СтрШаблон("Количество итераций: %1
|Общее время: %2 сек
|Среднее время: %3 сек
|Медианное время: %4 сек", ПараметрыЗамера.Замеры.Количество(), ОбщееВремя, СреднееВремя, МедианноеВремя);
ЮТОбщий.СообщитьПользователю(Сообщение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОповещениеПользователю(Текст, Пояснение)
ПоказатьОповещениеПользователя(Текст,
,
Пояснение,
БиблиотекаКартинок.ЮТПодсистема,
СтатусОповещенияПользователя.Важное,
УникальныйИдентификатор);
КонецПроцедуры
#КонецОбласти

View File

@ -517,7 +517,7 @@
</items>
<items xsi:type="form:FormField">
<name>ВыводЛога</name>
<id>66</id>
<id>26</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
@ -659,6 +659,49 @@
<currentRowUse>DontUse</currentRowUse>
</extInfo>
</items>
<items xsi:type="form:FormField">
<name>ЛогированиеВКонсоль</name>
<id>84</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:DataPath">
<segments>ЛогированиеВКонсоль</segments>
</dataPath>
<extendedTooltip>
<name>ЛогированиеВКонсольРасширеннаяПодсказка</name>
<id>86</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>ЛогированиеВКонсольКонтекстноеМеню</name>
<id>85</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<type>CheckBoxField</type>
<editMode>Enter</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:CheckBoxFieldExtInfo"/>
</items>
<items xsi:type="form:FormField">
<name>ФайлКонфигурации</name>
<id>55</id>
@ -1073,7 +1116,7 @@
<name>ИмяФайлаЛога</name>
<title>
<key>ru</key>
<value>Отладочные сообщения</value>
<value>Логирование в файл</value>
</title>
<id>61</id>
<valueType>
@ -1152,6 +1195,23 @@
<segments>ИмяФайлаОтчета</segments>
</settingsSavedData>
</attributes>
<attributes>
<name>ЛогированиеВКонсоль</name>
<title>
<key>ru</key>
<value>Логирование в консоль</value>
</title>
<id>66</id>
<valueType>
<types>Boolean</types>
</valueType>
<view>
<common>true</common>
</view>
<edit>
<common>true</common>
</edit>
</attributes>
<formCommands>
<name>УстановитьФлажки</name>
<title>

View File

@ -323,8 +323,7 @@
#КонецЕсли
ПутьЗапускаемогоКлиента = ЮТФайлы.ОбъединитьПути(КаталогПрограммы(), Файл);
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Или СистемнаяИнформация.ТипПлатформы
= ТипПлатформы.Windows_x86_64 Тогда
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ПутьЗапускаемогоКлиента = ПутьЗапускаемогоКлиента + ".exe";
КонецЕсли;
@ -427,8 +426,8 @@
Конфигурация.closeAfterTests = Истина;
Конфигурация.reportPath = ИмяФайлаОтчета;
Конфигурация.logging.enable = ЗначениеЗаполнено(ИмяФайлаЛога);
Конфигурация.logging.file = ИмяФайлаЛога;
Конфигурация.logging.console = ЛогированиеВКонсоль;
Если ЗначениеЗаполнено(ИмяФайлаКодаВозврата) Тогда
Конфигурация.exitCode = ИмяФайлаКодаВозврата;
@ -538,6 +537,7 @@
ДобавитьОтмеченныеТесты(Строка.ПолучитьЭлементы(), Тесты);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:DataProcessor xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c1bdc484-8502-4c5d-bead-0a5861739c3c">
<mdclass:DataProcessor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c1bdc484-8502-4c5d-bead-0a5861739c3c">
<producedTypes>
<objectType typeId="5b4ab199-21bb-4d2c-9b3f-76400ff90d09" valueTypeId="46e26617-02e4-4719-87a0-982b4820504f"/>
<managerType typeId="cea40759-07dd-409f-8c26-be7e738c7fbe" valueTypeId="e3a7e7ca-1e0d-4fdf-9390-258825a6bba5"/>
@ -7,9 +7,8 @@
<name>ЮТЮнитТесты</name>
<synonym>
<key>ru</key>
<value>Юнит тесты</value>
<value>Юнит-тесты</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<defaultForm>DataProcessor.ЮТЮнитТесты.Form.Основная</defaultForm>
<forms uuid="c3c0fc7f-1c5e-47d9-b103-201517e2c100">
<name>Основная</name>
@ -54,4 +53,25 @@
</synonym>
<templateType>TextDocument</templateType>
</templates>
<commands uuid="38dff93f-270f-4fd9-9d79-aa529d5c4f89">
<name>ЗапускТестов</name>
<synonym>
<key>ru</key>
<value>Запуск тестирования</value>
</synonym>
<group>NavigationPanelImportant</group>
<representation>PictureAndText</representation>
<picture xsi:type="core:PictureRef">
<picture>CommonPicture.ЮТПодсистема</picture>
</picture>
</commands>
<commands uuid="608d6673-e26c-4216-bc5f-fc19acdc3baf">
<name>СформироватьНастройкиТестирования</name>
<synonym>
<key>ru</key>
<value>Сформировать настройки тестирования</value>
</synonym>
<group>NavigationPanelOrdinary</group>
<representation>Auto</representation>
</commands>
</mdclass:DataProcessor>

View File

@ -8,6 +8,7 @@
<includeHelpInContents>true</includeHelpInContents>
<includeInCommandInterface>true</includeInCommandInterface>
<content>CommonModule.МокитоСлужебный</content>
<content>CommonModule.ЮТИсполнительКлиент</content>
<content>CommonModule.ЮТЛогирование</content>
<content>CommonModule.ЮТТестовыеДанныеСлужебный</content>
<content>CommonModule.ЮТУтверждения</content>

View File

@ -40,7 +40,7 @@
Дельта = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
ЮТест.ОжидаетЧто(Дельта)
.МеждуИсключаяГраницы(3000, 3050);
.МеждуИсключаяГраницы(3000, 3200);
КонецПроцедуры