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

Merge branch 'feature/ONECICD-555' into 'develop'

ONECICD-555 / Документация

Closes ONECICD-555

See merge request orais/ci_cd/yaxunit!9
This commit is contained in:
Максимов Валерий Валерьевич (000044217) 2022-10-04 16:39:36 +03:00
commit 1d629d7a42
12 changed files with 377 additions and 74 deletions

105
README.md
View File

@ -1,14 +1,14 @@
# YAXUnit. Расширение для запуска тестов
* [Назначение](#назначение)
* [Возможности](#возможности)
* [Пример тестового модуля](#пример-тестового-модуля)
* [Запуск](#запуск)
* [Конфигурация запуска](#конфигурация-запуска)
* [Строка запуска предприятия](#строка-запуска-предприятия)
* [Запуск из EDT](#запуск-из-edt)
* [Благодарности](#благодарности)
* [Лицензия](#лицензия)
- [Назначение](#назначение)
- [Возможности](#возможности)
- [Пример тестового модуля](#пример-тестового-модуля)
- [Запуск](#запуск)
- [Конфигурация запуска](#конфигурация-запуска)
- [Строка запуска предприятия](#строка-запуска-предприятия)
- [Запуск из EDT](#запуск-из-edt)
- [Благодарности](#благодарности)
- [Лицензия](#лицензия)
## Назначение
@ -16,19 +16,20 @@
### Возможности
* YAXUnit - это расширение с открытым исходным кодом, которое используется для написания и выполнения тестов
* Разрабатывался с оглядкой на JUnit5, пожалуй лучший фреймворк тестирования
* Предоставляет движок выполнения тестов
* Предоставляет утверждения для проверки ожидаемых результатов
* Тесты могут быть организованы в наборы и выполнятся в разных контекстах
* Позволяет быстрее и проще не только писать, но и читать тесты
* Результаты тестирования могут быть сохранены в отчет, на текущий момент jUnit и json.
* Большая часть пользовательского API реализована как [текучие выражения](https://ru.wikipedia.org/wiki/Fluent_interface)
* Предусмотрена возможность расширения функциональности, можно регистрировать свои форматы отчетов, добавлять модули с утверждениями
* Реализован [плаги для EDT](https://gitlab.dellin.ru/orais/tools/ru.biatech.edt.xtest), который упрощает процесс запуска тестов
- YAXUnit - это расширение с открытым исходным кодом, которое используется для написания и выполнения тестов
- Разрабатывалось с оглядкой на JUnit5, пожалуй, лучший фреймворк тестирования
- Предоставляет движок выполнения тестов
- Предоставляет утверждения для проверки ожидаемых результатов
- Тесты могут быть организованы в наборы и выполняться в разных контекстах
- Позволяет быстрее и проще не только писать, но и читать тесты
- Результаты тестирования могут быть сохранены в отчет, на текущий момент jUnit и json.
- Большая часть пользовательского API реализована как [текучие выражения](https://ru.wikipedia.org/wiki/Fluent_interface)
- Предусмотрена возможность расширения функциональности, можно регистрировать свои форматы отчетов, добавлять модули с утверждениями
- Реализован [плаги для EDT](https://gitlab.dellin.ru/orais/tools/ru.biatech.edt.xtest), который упрощает процесс запуска тестов
Подробнее, с функциональностью, вы можете ознакомится прочитав [документацию](docs/api-topic.md) и попробовав написать тесты
Подробнее ознакомиться с функциональностью вы можете изучив [документацию](docs/api-topic.md).
А для того, что бы начать писать тесты необходимо [установить расширение](docs/install.md) в свою IDE (конфигуратор или EDT).
## Пример тестового модуля
Для создания теста нужно в расширении (в отдельном или в том же) добавить модуль, содержащий экспортный метод регистрации - `ИсполняемыеСценарии` и реализовать тесты.
@ -36,22 +37,21 @@
Пример модуля тестов:
```bsl
#Область ТестыAPI
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
// Регистрация тестов
ЮТТесты // Регистрация тестов выполняет через модуль регистратор
.ТестовыйНабор ("Математические методы") // Набор - объединение тестов
.Тест("Сложение") // Обязательно при регистрации указываем имя экспортного метода
.Тест("Вычитание", "Вычитание") // Также можно указать представление теста
.Тест("Вычитание", "ВычитаниеСервер", , "Сервер") // Контекст исполнения, по умолчанию тест выполняется во всех контекстах модуля
.ТестКлиент("УмножениеНаКлиенте") // Есть отдельный метод для регистрации клиентских тестов
.ТестСервер("ДелениеНаСервере", "Деление на сервер") // Есть отдельный метод для регистрации серверных тестов
.Тест("ВызовДеления", "Вызов деления", , "ВызовСервера"); // А для вызова сервер нет метода, поэтому только так
.ТестовыйНабор("Строковые методы")
.Тест("СтрНайти")
.Тест("СтрРазделить);
Процедура ИсполняемыеСценарии() Экспорт
// Регистрация тестов
ЮТТесты // Регистрация тестов выполняет через модуль регистратор
.ДобавитьТестовыйНабор("Математические методы") // Набор - объединение тестов
.ДобавитьТест("Сложение") // Обязательно при регистрации указываем имя экспортного метода
.ДобавитьТест("Вычитание", "Вычитание") // Также можно указать представление теста
.ДобавитьТест("Вычитание", "ВычитаниеСервер", , "Сервер") // Контекст исполнения, по умолчанию тест выполняется во всех контекстах модуля
.ДобавитьКлиентскийТест("УмножениеНаКлиенте") // Есть отдельный метод для регистрации клиентских тестов
.ДобавитьСерверныйТест("ДелениеНаСервере", "Деление на сервер") // Есть отдельный метод для регистрации серверных тестов
.ДобавитьТестовыйНабор("Строковые методы")
.ДобавитьТест("СтрНайти")
.ДобавитьТест("СтрРазделить");
КонецПроцедуры
@ -62,13 +62,13 @@
Процедура Сложение() Экспорт
// Реализация теста на сложение
ЮТУтверждения.Что(2 + 3, "2 + 3") // Используя модуль утверждений установим проверяемое значение и пояснение
ЮТест.ОжидаетЧто(2 + 3, "2 + 3") // Используя модуль утверждений установим проверяемое значение и пояснение
.ИмеетТип("Число") // Проверим тип
.Заполнено() // Заполненность проверяемого значения
.Больше(0) // Сравним с нулем
.Равно(5); // Проверим ожидаемый результат
ЮТУтверждения.Что(-8 + 8, "-8 + 8") // Проверим второй вариант
ЮТест.ОжидаетЧто(-8 + 8, "-8 + 8") // Проверим второй вариант
.Равно(0);
КонецПроцедуры
@ -76,10 +76,7 @@
Процедура Вычитание() Экспорт
// Реализация теста на вычитание
ЮТУтверждения.Что(2 - 3, "2 - 3")
.ИмеетТип("Число")
.Заполнено()
.Меньше(0);
ЮТест.ОжидаетЧто(2 - 3, "2 - 3").ИмеетТип("Число").Заполнено().Меньше(0);
КонецПроцедуры
@ -100,27 +97,27 @@
Процедура ПередТестовымНабором() Экспорт
// Выполняется перед каждым тестовым набором для каждого контекста выполнения
Контекст = ЮТКонтекст.КонтекстНабора(); // Контекст набора служит для хранения любых данных, нужных при тестировании
// Контекст живет в рамках контекста выполнения,
// таки образом, через контекст нельзя передавать данные между серверными и клиентскими тестами
Контекст = ЮТест.КонтекстТестовогоНабора(); // Контекст набора служит для хранения любых данных, нужных при тестировании
// Контекст живет в рамках контекста выполнения,
// таки образом, через контекст нельзя передавать данные между серверными и клиентскими тестами
Контекст.Вставить("ВремяНачала", ТекущаяУниверсальнаяДатаВМиллисекундах());
КонецПроцедуры
Процедура ПередТестом() Экспорт
Процедура ПередКаждымТестом() Экспорт
// Выполняется перед каждым тестом
Контекст = ЮТКонтекст.КонтекстТеста(); // Контекст теста служит для хранения любых данных, нужных при тестировании
// Контекст создает перед тестом и уничтожается после его выполнения
// В контекст например, можно помещать созданные в процессе данные, что бы потом их удалить
Контекст = ЮТест.КонтекстТеста(); // Контекст теста служит для хранения любых данных, нужных при тестировании
// Контекст создает перед тестом и уничтожается после его выполнения
// В контекст например, можно помещать созданные в процессе данные, что бы потом их удалить
Контекст.Вставить("ВремяНачала", ТекущаяУниверсальнаяДатаВМиллисекундах());
КонецПроцедуры
Процедура ПослеТеста() Экспорт
Процедура ПослеКаждогоТеста() Экспорт
// Выполняется после каждого теста
Контекст = ЮТКонтекст.КонтекстТеста();
Контекст = ЮТест.КонтекстТеста();
Сообщить("Время выполнения теста: " + ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.ВремяНачала);
КонецПроцедуры
@ -129,8 +126,8 @@
// Выполняется после каждого тестового набора для каждого контекста выполнения
// Применяется для очистки данных и т.д.
Контекст = ЮТКонтекст.КонтекстНабора();
Сообщить("Время выполнения набора: " + ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.ВремяНачала);
Контекст = ЮТест.КонтекстТестовогоНабора();
Сообщить("Время выполнения набора: " + ТекущаяУниверсальнаяДатаВМиллисекундах() - Контекст.ВремяНачала);
КонецПроцедуры
@ -138,7 +135,7 @@
// Выполняется после выполнения всех тестов контекста, те если есть тесты и на клиенте и на сервер, то метод будет выполнен 2 раза
// В этом событии все контексты уже уничтожены
Сообщить("Тестирование завершено");
Сообщить("Тестирование завершено");
КонецПроцедуры
@ -152,7 +149,7 @@
## Запуск
Для запуска тестов необходимо создать конфигурацию запуска и указать ее при запуске предприятия в параметре `RunUnitTests`
Для запуска тестов необходимо запустить 1С:Предприятие с параметром `RunUnitTests`, при необходимости можно указать путь к файлу конфигурации запуска.
### Конфигурация запуска

View File

@ -1,6 +1,12 @@
# Пользовательский API
Текущая версия расширения предоставляет разработчикам тестов методы для удобной [регистрации тестов](test-registration.md).
Для разработчиков тестов расширение предоставляет API для:
* [Регистрации тестовых сценариев](test-registration.md)
* Формирования [утверждений](assertions.md) для проверки результата работы различных механизмов системы.
* Создания [тестовых данных](test-data.md)
* Передачи данных между тестами используя [контекст](context.md)
* [Подмены](mockito.md) алгоритмов работы системы
Имеются [базовые методы проверки](assertions.md) результатов работы различных механизмов системы.

View File

@ -1,25 +1,86 @@
# Утверждения
Утверждения реализует модуль `ЮТУтверждения`
Каждый тестовый сценарий должен проверить результат работы тестируемого метода, будь то функция или процедура.
Особенности
Для написания таких проверок реализован механизм утверждений, позволяющий в лаконичной форме описать свои ожидания, требования к результату.
* API реализован по модели [текучих выражения](https://ru.wikipedia.org/wiki/Fluent_interface), с целью повышения удобства и читаемости тестов
Работу с утверждениями реализует модуль `ЮТУтверждения`.
Доступ к утверждениям обеспечивает метод `ЮТест.ОжидаетЧто`, который возвращает инициализированный модуль `ЮТУтверждения`
Особенности реализации утверждений:
* Реализованы по модели [текучих выражений](https://ru.wikipedia.org/wiki/Fluent_interface), с целью повышения удобства и читаемости тестов
```bsl
ЮТУтверждения.Что(Контекст)
ЮТест.ОжидаетЧто(Контекст)
.ИмеетТип("Структура")
.Свойство("ПрефиксОшибки").Равно("Контекст метода с параметрами")
.Свойство("ИмяМетода").Равно("МетодБезИсключение")
.Свойство("ПараметрыМетода").ИмеетТип("Массив")
.Свойство("ПараметрыМетода").ИмеетДлину(1);
.Свойство("ИмяМетода").Заполнено().Равно("МетодБезИсключение")
.Свойство("ПараметрыМетода").ИмеетТип("Массив").ИмеетДлину(1);
```
* Большая часть методов это сравнения фактического и ожидаемого результат, но есть несколько методов настройки
* Реализован минимально необходимый набор проверок
* Большая часть методов - это сравнения фактического и ожидаемого результатов, но есть несколько методов настройки
* `Что` - устанавливает проверяемый объект. Все дальнейшие проверки будут выполняется с этим объектом
* `Метод` - устанавливает имя и параметры проверяемого метода. Для методов имеет два утверждения `ВыбрасываетИсключение` и `НеВыбрасываетИсключение`
* `Метод` - устанавливает имя и параметры проверяемого метода. Для проверки методов имеются утверждения `ВыбрасываетИсключение` и `НеВыбрасываетИсключение`
* `Параметр` - добавляет параметр метода. Создан для удобства установки параметров проверяемого метода
* `Свойство` - устанавливает проверяемое свойство и проверяет его наличие.
* Можно указывать вложенные свойства через точку, например, `Свойство("Контекст.ИмяМетода")`.
* Также, первая проверка вызванная после этого метода будет относится к свойству объекта.
* Также, первая проверка, вызванная после этого метода, будет относиться к свойству объекта.
Например, `ЮТУтверждения.Что(Контекст).Свойство("ИмяМетода").Равно("МетодБезИсключение")` эквивалентно `Контекст.ИмяМетода = "МетодБезИсключение"`
Например, `ЮТест.ОжидаетЧто(Контекст).Свойство("ИмяМетода").Равно("МетодБезИсключение")` эквивалентно `Контекст.ИмяМетода = "МетодБезИсключение"`
* Все методы имеют параметр `ОписаниеПроверки` для описания конкретной проверки
Примеры:
1. Базовые проверки
```bsl
ЮТест.ОжидаетЧто(2 + 3, "2 + 3") // Используя модуль утверждений установим проверяемое значение и пояснение
.ИмеетТип("Число") // Проверим тип
.Заполнено() // Заполненность проверяемого значения
.Больше(0) // Сравним с нулем
.Равно(5); // Проверим ожидаемый результат
```
2. Проверка сложного объекта
```bsl
Объект = ЮТОбщий.ЗначениеВМассиве("1", "2", "3");
ЮТУтверждения.Что(Объект, "Проверка элементов массива")
.Содержит("1")
.НеСодержит(1)
.Элемент(0).Равно("1")
.Элемент(1).Равно("2")
.Элемент(-1).Равно("3")
.Свойство("[00]").Равно("1")
.Свойство("[1]").Равно("2")
.Свойство("[-1]").Равно("3")
.НетСвойства(3)
.НетСвойства("[3]");
Объект.Добавить(Новый Структура("Первый, Второй", 1, ЮТОбщий.ЗначениеВМассиве(2)));
ЮТУтверждения.Что(Объект, "Проверка свойства элемента массива")
.Свойство("[3].Первый").Равно(1)
.Свойство("[3].Второй[-1]").Равно(2)
.Свойство("[3].Второй[0]").Равно(2)
```
3. Проверка вызова метода
```bsl
ЮТУтверждения.Что(ОМ_ЮТУтверждения)
.Метод("МетодБезИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение"))
.НеВыбрасываетИсключение()
.НеВыбрасываетИсключение("Ожидаемое исключение");
ЮТУтверждения.Что(ОМ_ЮТУтверждения)
.Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение", 2))
.ВыбрасываетИсключение("Слишком много фактических параметров");
ЮТУтверждения.Что(ОМ_ЮТУтверждения)
.Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение"))
.ВыбрасываетИсключение("Исключение");
ЮТУтверждения.Что(ОМ_ЮТУтверждения)
.Метод("МетодБезИсключение")
.ВыбрасываетИсключение("Недостаточно фактических параметров");
```

32
docs/context.md Normal file
View File

@ -0,0 +1,32 @@
# Контекст
Одним из важнейших блоков работы тестового движка является механизм контекстов.
Он позволяет:
1. хранить промежуточные данные и обеспечивать работу механизма текучих выражений
2. передавать между тестами необходимые данные
3. удалять тестовые данные (пока только временные файлы)
И имеет несколько ограничений:
1. Не синхронизируется между клиентом и сервером
2. Тестовые контексты имеют ограниченное время жизни, например, контекст теста "живет" только в рамках теста и событиях "ПередКаждымТестом", "ПослеКаждогоТеста".
Для различных механизмов движка существуют различные контексты, такие как контекст утверждений, контекст теста и тд.
Разработчику тестов будут интересны следующие контексты:
* Контекст теста (`ЮТест.КонтекстТеста`) - живет в рамках одного теста, также доступен в обработчиках событий `ПередКаждымТестом` и `ПослеКаждогоТеста`
* Контекст тестового набора (`ЮТест.КонтекстТестовогоНабора`) - живет в рамках набора тестов. Доступен в каждом тесте набора и в обработчиках событий
* `ПередТестовымНабором`
* `ПослеТестовогоНабора`
* `ПередКаждымТестом`
* `ПослеКаждогоТеста`
* Контекст тестового модуля (`ЮТест.КонтекстМодуля`) - живет в рамках тестового модуля. Доступен в каждом тесте модуля и в обработчиках событий
* `ПередВсемиТестами`
* `ПослеВсехТестов`
* `ПередТестовымНабором`
* `ПослеТестовогоНабора`
* `ПередКаждымТестом`
* `ПослеКаждогоТеста`

BIN
docs/images/compare.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

38
docs/install.md Normal file
View File

@ -0,0 +1,38 @@
# Установка
## Установка в EDT
### Первичная установка тестового движка в рабочее пространство (workspace)
1. Качаем архив [последнего релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
2. Распаковываем содержимое в каталог с исходниками (не в воркспейс)
3. Импортируем проект
![Импорт проекта](images/project-import.png)
4. Привязываем импортированный проект расширения к конфигурации
![Связь с базовым проектом](images/link-base-project.png)
5. Обновляем конфигурацию
6. В конфигураторе снимаем с расширения **безопасный режим** и **защиту от опасных действий**
7. Готово, можно приступить к написанию тестов.
### Обновление тестового движка
1. Качаем архив [последнего релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
2. Если вы дорабатывали движок, то скачиваем архив оригинальной установленной версии движка
3. Разархивируем их во временный каталог
4. Воспользуемся механизмом сравнения объединения EDT
![Сравнение объединение](images/compare.png)
* Второй источник - каталог к новой версии тестового движка
* Использование третьего источника нужно для трехстороннего сравнения и применяется при доработках движка.
5. Нажимаем "Объединить"
6. Готово.
## Установка в конфигуратор
1. Качаем расширение (cfe) из [последнего релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
2. Загружаем в конфигуратор
3. Снимаем с расширения **безопасный режим** и **защиту от опасных действий**
4. Готово

92
docs/test-data.md Normal file
View File

@ -0,0 +1,92 @@
# Тестовые данные
Почти в каждом тесте разработчику необходимы данные, которые он будет использовать при тестировании: элементы справочников, документы, остатки и тд.
Есть разные подходы к работе с тестовыми данными:
1. Ручное наполнение тестовой базы (мы предварительно создаем все что необходимо для тестов в базе, а потом используем её для прогона тестов)
2. Использование файлов с данными (макеты - сгенерированные в нужном формате файлы с описанием тестовых данных, загружаемые при выполнении тестов)
3. Программное создание нужных данных внутри теста
У каждого из вариантов есть свои плюсы и минусы, и при грамотной компоновке можно достичь наилучшего результата.
Например:
* Ручное наполнение базы не учитывает последующие доработки системы, нужна миграция на новые алгоритмы и структуру, и, если таких данных будет много, то миграция будет занимать большое время. А также в этом случае нам необходимо завязываться на конкретные записи в системе, и при их изменении тестом мы можем сломать другие тесты. Поэтому, предварительное наполнение базы должно быть минимальным.
* В случае использования макетов данных возникают некоторые трудности с их доработкой и вариативностью, например, в новом тесте нужны данные из макета, но с некоторыми изменениями. В этом случае нам потребуется создавать новый макет или проверять, не сломают ли наши изменения другие тесты. Также при таком подходе сложно контролировать и искать какие макеты используются и кем.
* Программное создание тестовых данных увеличивает время и сложность теста.
Если грамотно распределить тестовые данные на способы создания, мы можем добиться оптимального результата.
Например, можно статичные данные создать вручную, сложные кейсы данных засунуть в макеты, а для программного создания реализовать методы-конструкторы, которые будем переиспользовать. Таким образом, сможем уйти от минусов данного подхода или минимизировать их вред.
В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные`.
Сейчас это минимальный набор методов, который в дальнейшем будет развиваться. Он позволяет:
* Создавать данные информационной базы
* Генерировать случайные значения
* Работать с файлами
* Использовать таблицы markdown в качестве макетов данных
Примеры
```bsl
Функция ОписаниеСервера(Знач Идентификатор = Неопределено) Экспорт
Описание = БазовоеОписаниеОбъекта(Идентификатор, "СРВ");
Описание.Вставить("Адрес", ЮТТестовыеДанные.СлучайныйIPАдрес());
Описание.Вставить("ЧастотаЯдра", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(4, 3));
Описание.Вставить("КоличествоЯдер", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(10));
Описание.Вставить("КоличествоПотоков", Описание.КоличествоЯдер * 2);
Описание.Вставить("ПроизводительностьПроцессора", Описание.ЧастотаЯдра * Описание.КоличествоЯдер);
Описание.Вставить("ОбъемПамяти", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(1024, 3));
Описание.Вставить("Диски", Новый Массив());
Описание.Вставить("Кластер");
Для Инд = 1 По ЮТТестовыеДанные.СлучайноеЧисло(1, 3) Цикл
Описание.Диски.Добавить(ОписаниеДиска());
КонецЦикла;
Возврат Описание;
КонецФункции
Функция ОписаниеЗаявкиНаСозданиеВМ() Экспорт
Описание = Новый Структура();
Описание.Вставить("Наименование", "req-" + ЮТТестовыеДанные.СлучайнаяСтрока());
Описание.Вставить("ДатаДобавления", глПолучитьМосковскоеВремя());
Описание.Вставить("ДатаОкончанияАренды", глДобавитьКДате(глПолучитьМосковскоеВремя(), "ДЕНЬ", 2));
Описание.Вставить("Адрес", ЮТТестовыеДанные.СлучайныйIPАдрес());
Описание.Вставить("Проект", Проект());
Описание.Вставить("Мейнтейнер", ПараметрыСеанса.Сотрудник);
Описание.Вставить("КоличествоCPU", ЮТТестовыеДанные.СлучайноеЧисло(1, 4));
Описание.Вставить("КоличествоПамяти", ЮТТестовыеДанные.СлучайноеЧисло(1, 16));
Описание.Вставить("КоличествоДисков", ЮТТестовыеДанные.СлучайноеЧисло(1, 16));
Описание.Вставить("ОперационнаяСистема", ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ОперационныеСистемы));
Описание.Вставить("СредаЭксплуатации", "");
Описание.Вставить("Назначение", ЮТТестовыеДанные.СоздатьЭлемент(Справочники.НазначенияВиртуальныхМашин));
Описание.Вставить("ТипСреды", Справочники.ТипыИнформационныхСред.BETA);
Описание.Вставить("КодСервиса", ЮТТестовыеДанные.СлучайнаяСтрока(, 1));
Возврат Описание;
КонецФункции
Функция НовыйОбразDocker(Версия, ПоУмолчанию = Истина) Экспорт
Данные = Новый Структура("Адрес, ВерсияПлатформы, ТипПлатформы, ИспользоватьПоУмолчанию");
Данные.Адрес = "gitlab.ru/orais/ci_cd/1cws-apache24:" + Версия;
Данные.ВерсияПлатформы = Версия;
Данные.ТипПлатформы = Перечисления.ТипыСоединенияИсточникаДанных.Соединение1СПредприятие83Сервер;
Данные.ИспользоватьПоУмолчанию = ПоУмолчанию;
Возврат ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ОбразыDocker, Версия, Данные);
КонецФункции
```

View File

@ -1,10 +1,35 @@
# Регистрация тестовых методов
# Регистрация тестовых методов (ЮТТесты)
Работа с регистрацией тестовых методов реализована в модуле `ЮТТесты`.
Кроме того, чтобы написать тестовые сценарии, разработчик должен зарегистрировать их в движке.
Регистрация выполняется внутри предопределенного экспортного метод `ИсполняемыеСценарии`, который обязательно должен находиться в тестовом модуле.
Возможности:
```bsl
Процедура ИсполняемыеСценарии() Экспорт
// Регистрация тестов
ЮТТесты // Регистрация тестов выполняет через модуль регистратор
.ДобавитьТестовыйНабор("Математические методы") // Набор - объединение тестов
.ДобавитьТест("Сложение") // Обязательно при регистрации указываем имя экспортного метода
.ДобавитьТест("Вычитание", "Вычитание") // Также можно указать представление теста
.ДобавитьТест("Вычитание", "ВычитаниеСервер", , "Сервер") // Контекст исполнения, по умолчанию тест выполняется во всех контекстах модуля
.ДобавитьКлиентскийТест("УмножениеНаКлиенте") // Есть отдельный метод для регистрации клиентских тестов
.ДобавитьСерверныйТест("ДелениеНаСервере", "Деление на сервер") // Есть отдельный метод для регистрации серверных тестов
.ДобавитьТестовыйНабор("Строковые методы")
.ДобавитьТест("СтрНайти")
.ДобавитьТест("СтрРазделить");
КонецПроцедуры
```
Этот метод автоматически вызывается тестовым движком при старте тестирования.
Как видно из примера выше, регистрация выполняется с помощью методов модуля `ЮТТесты`.
Он позволяет:
* Объединять тесты в наборы, указывать теги, по которым возможно формировать отборы запускаемых тестов
* Указать контекст вызова, например, для клиент-серверного модуля (или метода) можно реализовать два теста в одном тестовом модуле, проверяющих логику и на клиенте, и на сервере.
* Организовывать черновика, регистрируя нереализованные тесты
* Планируется, предоставить функционал параметризированных тестов.
* Указывать контекст вызова, например, для клиент-серверного модуля (или метода) можно реализовать тесты в одном тестовом модуле, проверяющие логику и на клиенте, и на сервере.
* Указывать параметры выполнения тестов.
* Организовывать черновики, регистрируя нереализованные тесты.

View File

@ -162,7 +162,7 @@
КонецПопытки;
ПроверитьОшибкуУтверждения(Ошибка, "Ожидали, что проверяемое значение `Структура` содержит свойство `Объект.Нулевой`, но это не так");
Объект = Мокито.МассивПараметров("1", "2", "3");
Объект = ЮТОбщий.ЗначениеВМассиве("1", "2", "3");
ЮТУтверждения.Что(Объект, "Проверка элементов массива")
.Элемент(0).Равно("1")
.Элемент(1).Равно("2")
@ -173,7 +173,7 @@
.НетСвойства(3)
.НетСвойства("[3]");
Объект.Добавить(Новый Структура("Первый, Второй", 1, Мокито.МассивПараметров(2)));
Объект.Добавить(Новый Структура("Первый, Второй", 1, ЮТОбщий.ЗначениеВМассиве(2)));
ЮТУтверждения.Что(Объект, "Проверка свойства элемента массива")
.Свойство("[3].Первый").Равно(1)
.Свойство("[3].Второй[-1]").Равно(2)

View File

@ -28,10 +28,52 @@
ЮТТесты
.Тест("Пропустить")
.Тест("ПроверкаКонтекста")
;
КонецПроцедуры
Процедура ПередВсемиТестами() Экспорт
ЮТест.Контекст().УстановитьЗначение("Глобальный", 1);
ЮТест.Контекст().УстановитьЗначение("Заменяемый", 5);
ЮТест.Контекст().УстановитьЗначение("Коллекция", Новый Массив());
ЮТест.Контекст().Значение("Коллекция").Добавить("ПередВсемиТестами");
КонецПроцедуры
Процедура ПередТестовымНабором() Экспорт
ЮТест.Контекст().УстановитьЗначение("Набор", 2);
ЮТест.Контекст().Значение("Коллекция").Добавить("ПередТестовымНабором");
КонецПроцедуры
Процедура ПередКаждымТестом() Экспорт
ЮТест.Контекст().УстановитьЗначение("Тест", 3);
ЮТест.Контекст().УстановитьЗначение("Заменяемый", 3);
ЮТест.Контекст().Значение("Коллекция").Добавить("ПередКаждымТестом");
КонецПроцедуры
Процедура ПослеКаждогоТеста() Экспорт
ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеКаждогоТеста");
КонецПроцедуры
Процедура ПослеТестовогоНабора() Экспорт
ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеТестовогоНабора");
КонецПроцедуры
Процедура ПослеВсехТестов() Экспорт
ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеВсехТестов");
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция")).ИмеетДлину(6);
КонецПроцедуры
Процедура Пропустить() Экспорт
ЮТест.Пропустить();
@ -39,6 +81,16 @@
КонецПроцедуры
Процедура ПроверкаКонтекста() Экспорт
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Глобальный"), "Значение глобального контекста").Равно(1);
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Набор"), "Значение контекста набора").Равно(2);
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Тест"), "Значение контекста теста").Равно(3);
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Заменяемый"), "Замененное значение контекста").Равно(3);
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция")).ИмеетДлину(3);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции