1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-01-23 18:54:40 +02:00

Merge pull request #2 from bia-technologies/develop

Update from original
This commit is contained in:
Vitaliy Chernenko 2023-08-31 08:17:37 +03:00 committed by GitHub
commit 246588634b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
40 changed files with 1568 additions and 303 deletions

View File

@ -2,13 +2,18 @@ name: Build and test
on:
push:
branches: [ feature/**, develop ]
pull_request:
pull_request_target:
branches: [ develop ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
checks: write
id-token: write
jobs:
build_artifacts:
name: Build artifacts
@ -20,7 +25,7 @@ jobs:
secrets: inherit
tests_linux_ru:
name: Test on Linux 8.3.21.1895 ru_RU
name: Tests Linux 8.3.21.1895 ru_RU
uses: ./.github/workflows/run-tests-linux.yml
needs: build_artifacts
with:
@ -29,8 +34,9 @@ jobs:
secrets: inherit
tests_linux_en:
name: Test on Linux 8.3.21.1895 en_US
name: Tests Linux 8.3.21.1895 en_US
uses: ./.github/workflows/run-tests-linux.yml
if: false
needs: build_artifacts
with:
v8_version: 8.3.21.1895
@ -40,7 +46,7 @@ jobs:
secrets: inherit
tests_windows_ru:
name: Test on Windows 8.3.21.1895 ru_RU
name: Tests Windows 8.3.21.1895 ru_RU
uses: ./.github/workflows/run-tests-windows.yml
needs: build_artifacts
with:
@ -49,7 +55,7 @@ jobs:
secrets: inherit
tests_macos_ru:
name: Test on MacOS 8.3.21.1895 ru_RU
name: Tests MacOS 8.3.21.1895 ru_RU
uses: ./.github/workflows/run-tests-macos.yml
needs: build_artifacts
with:

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,20 +147,21 @@ jobs:
- name: view output
if: always()
run: cat output.log
run: cat ./output.log
- name: upload-artifact
uses: actions/upload-artifact@v3
if: always()
with:
name: report-linux-${{ inputs.v8_version }}-${{ inputs.locale }}
name: Tests report. Linux ${{ inputs.v8_version }} ${{ inputs.locale }}
path: reports/*.*
- name: Publish Test Report
uses: mikepenz/action-junit-report@v3
if: always()
with:
job_name: Tests Linux ${{ inputs.v8_version }} ${{ inputs.locale }}
check_name: Tests report. Linux ${{ inputs.v8_version }} ${{ inputs.locale }}
report_paths: reports/report.xml
fail_on_failure: ${{ inputs.fail_on_failure }}
require_passed_tests: ${{ inputs.fail_on_failure }}
update_check: true
require_passed_tests: true

View File

@ -43,7 +43,8 @@ jobs:
-Dsonar.host.url=https://sonar.openbsl.ru
-Dsonar.branch.name=${{ env.BRANCH_NAME }}
-Dsonar.projectVersion=${{ steps.extract_version.outputs.version }}
-Dsonar.qualitygate.wait=true
-Dsonar.qualitygate.timeout=300
# Анализ проекта в SonarQube (PR)
# https://docs.sonarqube.org/latest/analysis/pull-request/
- name: Анализ в SonarQube (pull-request)
@ -57,3 +58,5 @@ jobs:
-Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }}
-Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }}
-Dsonar.scm.revision=${{ github.event.pull_request.head.sha }}
-Dsonar.qualitygate.wait=true
-Dsonar.qualitygate.timeout=300

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 @@
Если Метаданные.ОбщиеМодули.Содержит(Объект) Тогда
Модули.Добавить(Объект.Имя);
Добавить = (Серверные И Клиентские)
ИЛИ (Серверные И (Объект.Сервер))
ИЛИ (Клиентские И (Объект.КлиентУправляемоеПриложение Или Объект.ВызовСервера));
// КлиентОбычноеПриложение сознательно не анализируется, он должен идти в паре с другой настройкой
Если Добавить Тогда
Модули.Добавить(Объект.Имя);
КонецЕсли;
КонецЕсли;
@ -101,6 +110,7 @@
Описание.Имя = Модуль.Имя;
Описание.КлиентУправляемоеПриложение = Модуль.КлиентУправляемоеПриложение;
Описание.КлиентОбычноеПриложение = Модуль.КлиентОбычноеПриложение;
Описание.Глобальный = Модуль.Глобальный;
Описание.Сервер = Модуль.Сервер;
Описание.ВызовСервера = Модуль.ВызовСервера;
Описание.Расширение = Модуль.РасширениеКонфигурации().Имя;
@ -110,7 +120,7 @@
КонецФункции
Функция ОписаниеОбъектМетаданных(Знач Значение, ЗаполнятьРеквизиты = Истина) Экспорт
Функция ОписаниеОбъектМетаданных(Знач Значение, Знач ЗаполнятьРеквизиты = Истина) Экспорт
МетаданныеОбъекта = ОбъектМетаданных(Значение);
ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
@ -273,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

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

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c2bf54a9-2026-41ed-8971-af1be24299c2">
<name>ЮТСтроки</name>
<synonym>
<key>ru</key>
<value>Строки</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -166,28 +166,26 @@
// Генерирует и возвращает случайную строку указанной длины, строка может содержать цифры, английские и русские буквы в разных регистрах.
//
// Параметры:
// Длина - Число - Длина генерируемой строки, без учета префикса
// Длина - Число - Длина генерируемой строки с учетом префикса
// Префикс - Строка - Префикс строки
// ДопустимыеСимволы - Строка - Допустимые символы из которая будет формироваться случайно строка
// ДопустимыеСимволы - Строка - Допустимые символы из которая будет формироваться случайная строка
//
// Возвращаемое значение:
// Строка - Случайная строка
Функция СлучайнаяСтрока(Знач Длина = 10, Префикс = "", ДопустимыеСимволы = Неопределено) Экспорт
Функция СлучайнаяСтрока(Знач Длина = 10, Префикс = "", Знач ДопустимыеСимволы = Неопределено) Экспорт
Если ДопустимыеСимволы = Неопределено Тогда
Строка = "1234567890абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Иначе
Строка = ДопустимыеСимволы;
ДопустимыеСимволы = ЮТСтроки.РусскиеБуквы(Истина, Истина) + ЮТСтроки.АнглийскиеБуквы(Истина, Истина) + ЮТСтроки.Цифры();
КонецЕсли;
Результат = "";
КоличествоСимволов = СтрДлина(Строка);
КоличествоСимволов = СтрДлина(ДопустимыеСимволы);
Длина = Длина - СтрДлина(Префикс);
Для Инд = 1 По Длина Цикл
Результат = Результат + Сред(Строка, СлучайноеЧисло(1, КоличествоСимволов), 1);
Результат = Результат + Сред(ДопустимыеСимволы, СлучайноеЧисло(1, КоличествоСимволов), 1);
КонецЦикла;
@ -195,6 +193,28 @@
КонецФункции
// Возвращяет случайный валидный идентификатор
//
// Параметры:
// Длина - Число - Длина генерируемой строки с учетом префикса
// Префикс - Строка - Префикс строки
//
// Возвращаемое значение:
// Строка - Случайный идентификатор
Функция СлучайныйИдентификатор(Знач Длина = 10, Знач Префикс = "") Экспорт
НаборСимволов = "_" + ЮТСтроки.РусскиеБуквы(Истина, Истина) + ЮТСтроки.АнглийскиеБуквы(Истина, Истина);
Если ПустаяСтрока(Префикс) Тогда
Префикс = СлучайнаяСтрока(1, "", НаборСимволов);
КонецЕсли;
НаборСимволов = НаборСимволов + ЮТСтроки.Цифры();
Возврат СлучайнаяСтрока(Длина, Префикс, НаборСимволов);
КонецФункции
// Генерирует и возвращает случайную дату в указанном интервале (если не указан используется `0001-01-01 - 3999-12-31`).
//
// Параметры:
@ -427,7 +447,7 @@
ЗаменяемыеСтроки = ЮТТестовыеДанныеСлужебный.ПодстрокиДляЗаменыВИменахСвойств();
ЗначениеКолонки = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст;
Пока ЗначениеЗаполнено(ЗначениеКолонки) Цикл
Пока ЗначениеЗаполнено(ЗначениеКолонки) Цикл
Для Каждого Замена Из ЗаменяемыеСтроки Цикл
ПодстрокаПоиска = Замена.Ключ;
@ -435,7 +455,7 @@
ИмяКолонки = СтрЗаменить(ЗначениеКолонки, ПодстрокаПоиска, ПодстрокаЗамены);
КонецЦикла;
Сведения = Новый Структура("НомерКолонки, ИмяКолонки", НомерКолонки, ИмяКолонки);
Сведения = Новый Структура("НомерКолонки, ИмяКолонки", НомерКолонки, ИмяКолонки);
СведенияКолонок.Добавить(Сведения);
НомерКолонки = НомерКолонки + 1;
@ -445,14 +465,14 @@
НомерСтроки = НомерСтроки + 1;
Пока ЕстьЗначенияВСтроке(ТабличныйДокумент, НомерСтроки, СведенияКолонок) Цикл
Пока ЕстьЗначенияВСтроке(ТабличныйДокумент, НомерСтроки, СведенияКолонок) Цикл
Структура = Новый Структура;
Для Каждого Сведения Из СведенияКолонок Цикл
Для Каждого Сведения Из СведенияКолонок Цикл
Значение = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, Сведения.НомерКолонки).Текст);
Структура.Вставить(Сведения.ИмяКолонки, Значение);
КонецЦикла;
КонецЦикла;
МассивДанных.Добавить(Структура);
@ -558,15 +578,15 @@
// * ОбменДаннымиЗагрузка - Булево - По умолчанию - Истина
// Возвращаемое значение:
// см. ЮТТестовыеДанные_ТаблицыЗначений.ТаблицаЗначенийИзМассиваСтруктур
Функция ТаблицаЗначенийИзТабличногоДокумента(ТабличныйДокумент, ОписанияТипов, КэшЗначений = Неопределено,
Функция ТаблицаЗначенийИзТабличногоДокумента(ТабличныйДокумент, ОписанияТипов, КэшЗначений = Неопределено,
ЗаменяемыеЗначения = Неопределено, ПараметрыСозданияОбъектов = Неопределено) Экспорт
Параметры = ЮТТестовыеДанные_ТаблицыЗначений.ПараметрыЗаполненияТаблицыЗначений(ПараметрыСозданияОбъектов);
ИсточникДанных = СтруктурыТабличногоДокумента(ТабличныйДокумент);
ТаблицаЗначений = ЮТТестовыеДанные_ТаблицыЗначений.ТипизированнаяТаблицаЗначений(
ИсточникДанных,
ОписанияТипов,
КэшЗначений,
ИсточникДанных,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
Параметры
);
@ -586,15 +606,15 @@
// * ОбменДаннымиЗагрузка - Булево - По умолчанию - Истина
// Возвращаемое значение:
// см. ЮТТестовыеДанные_ТаблицыЗначений.ТаблицаЗначенийИзМассиваСтруктур
Функция ТаблицаЗначенийИзТаблицыMarkDown(Строки, ОписанияТипов, КэшЗначений = Неопределено,
Функция ТаблицаЗначенийИзТаблицыMarkDown(Строки, ОписанияТипов, КэшЗначений = Неопределено,
ЗаменяемыеЗначения = Неопределено, ПараметрыСозданияОбъектов = Неопределено) Экспорт
Параметры = ЮТТестовыеДанные_ТаблицыЗначений.ПараметрыЗаполненияТаблицыЗначений(ПараметрыСозданияОбъектов);
ИсточникДанных = ТаблицаMarkDown(Строки);
ТаблицаЗначений = ЮТТестовыеДанные_ТаблицыЗначений.ТипизированнаяТаблицаЗначений(
ИсточникДанных,
ОписанияТипов,
КэшЗначений,
ИсточникДанных,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
Параметры
);
@ -644,4 +664,4 @@
КонецФункции
#КонецОбласти
#КонецОбласти

View File

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

View File

@ -115,6 +115,10 @@
// Булево - Этот модуль содержит тесты
Функция ЭтоТестовыйМодуль(МетаданныеМодуля) Экспорт
Если МетаданныеМодуля.Глобальный Тогда
Возврат Ложь;
КонецЕсли;
#Если Сервер Тогда
Возврат ЮТОбщий.МетодМодуляСуществует(МетаданныеМодуля.Имя, ИмяМетодаСценариев());
#КонецЕсли

View File

@ -92,6 +92,7 @@
<commonModules>CommonModule.ЮТСобытия</commonModules>
<commonModules>CommonModule.ЮТСравнениеКлиентСервер</commonModules>
<commonModules>CommonModule.ЮТСравнениеСервер</commonModules>
<commonModules>CommonModule.ЮТСтроки</commonModules>
<commonModules>CommonModule.ЮТТестовыеДанные</commonModules>
<commonModules>CommonModule.ЮТТестовыеДанные_ТаблицыЗначений</commonModules>
<commonModules>CommonModule.ЮТТестовыеДанныеВызовСервера</commonModules>

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);
КонецПроцедуры

View File

@ -29,6 +29,7 @@
.ДобавитьСерверныйТест("СтруктурыТабличногоДокумента")
.ДобавитьСерверныйТест("ТаблицаЗначенийИзТабличногоДокумента")
.ДобавитьСерверныйТест("ТаблицаЗначенийИзТаблицыMarkDown")
.ДобавитьТест("СлучайныйИдентификатор")
;
КонецПроцедуры
@ -91,6 +92,22 @@
КонецПроцедуры
Процедура СлучайныйИдентификатор() Экспорт
Проверка = Новый Структура();
Для Инд = 1 По 100 Цикл
Идентификатор = ЮТест.Данные().СлучайныйИдентификатор(Инд);
ЮТест.ОжидаетЧто(Проверка)
.Метод("Вставить").Параметр(Идентификатор)
.НеВыбрасываетИсключение(, "Сформирован не валидный идентификатор: " + Идентификатор);
КонецЦикла;
КонецПроцедуры
#Если Сервер Тогда
Процедура СтруктурыТабличногоДокумента() Экспорт
@ -116,7 +133,7 @@
.Свойство("[2].Цена").Равно("1000000")
.Свойство("[2].Количество").Равно("1")
.Свойство("[2].Сумма").Равно("1000000")
;
;
КонецПроцедуры
@ -143,9 +160,9 @@
// Вызов тестируемого сценария
ТаблицаРезультатов = ЮТест.Данные().ТаблицаЗначенийИзТабличногоДокумента(
ИсходныеДанные,
ИсходныеДанные,
ОписанияТипов,
КэшЗначений,
КэшЗначений,
ЗаменяемыеЗначения
);
@ -172,7 +189,7 @@
.Свойство("[2].Товар.Описание").Заполнено()
.Свойство("[2].Количество").Равно(1)
.Свойство("[2].Цена").Равно(1000000)
;
;
КонецПроцедуры
@ -180,7 +197,7 @@
// Подготовка тестового окружения
ИсходныеДанные =
ИсходныеДанные =
"| Товар | Цена | Количество | Сумма |
||---------|-------|------------|-------|
|| Товар 1 | 100 | 1 | 100 |
@ -197,7 +214,7 @@
// Вызов тестируемого сценария
ТаблицаРезультатов = ЮТест.Данные().ТаблицаЗначенийИзТаблицыMarkDown(
ИсходныеДанные,
ИсходныеДанные,
ОписанияТипов
);
@ -218,10 +235,10 @@
.Свойство("[2].Количество").Равно(1)
.Свойство("[2].Цена").Равно(300.9)
.Свойство("[2].Сумма").Равно(300.9)
;
;
КонецПроцедуры
#КонецЕсли
#КонецЕсли
#КонецОбласти