diff --git a/README.md b/README.md index c66dab46..ef9e06a2 100644 --- a/README.md +++ b/README.md @@ -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`, при необходимости можно указать путь к файлу конфигурации запуска. ### Конфигурация запуска diff --git a/docs/api-topic.md b/docs/api-topic.md index 14b86d54..42a391e7 100644 --- a/docs/api-topic.md +++ b/docs/api-topic.md @@ -1,6 +1,12 @@ # Пользовательский API -Текущая версия расширения предоставляет разработчикам тестов методы для удобной [регистрации тестов](test-registration.md). +Для разработчиков тестов расширение предоставляет API для: + +* [Регистрации тестовых сценариев](test-registration.md) +* Формирования [утверждений](assertions.md) для проверки результата работы различных механизмов системы. +* Создания [тестовых данных](test-data.md) +* Передачи данных между тестами используя [контекст](context.md) +* [Подмены](mockito.md) алгоритмов работы системы Имеются [базовые методы проверки](assertions.md) результатов работы различных механизмов системы. diff --git a/docs/assertions.md b/docs/assertions.md index 2f4fa94f..d1965e05 100644 --- a/docs/assertions.md +++ b/docs/assertions.md @@ -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)) + .ВыбрасываетИсключение("Слишком много фактических параметров"); + ЮТУтверждения.Что(ОМ_ЮТУтверждения) + .Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение")) + .ВыбрасываетИсключение("Исключение"); + ЮТУтверждения.Что(ОМ_ЮТУтверждения) + .Метод("МетодБезИсключение") + .ВыбрасываетИсключение("Недостаточно фактических параметров"); + ``` diff --git a/docs/context.md b/docs/context.md new file mode 100644 index 00000000..805299c0 --- /dev/null +++ b/docs/context.md @@ -0,0 +1,32 @@ +# Контекст + +Одним из важнейших блоков работы тестового движка является механизм контекстов. + +Он позволяет: + +1. хранить промежуточные данные и обеспечивать работу механизма текучих выражений +2. передавать между тестами необходимые данные +3. удалять тестовые данные (пока только временные файлы) + +И имеет несколько ограничений: + +1. Не синхронизируется между клиентом и сервером +2. Тестовые контексты имеют ограниченное время жизни, например, контекст теста "живет" только в рамках теста и событиях "ПередКаждымТестом", "ПослеКаждогоТеста". + +Для различных механизмов движка существуют различные контексты, такие как контекст утверждений, контекст теста и тд. + +Разработчику тестов будут интересны следующие контексты: + +* Контекст теста (`ЮТест.КонтекстТеста`) - живет в рамках одного теста, также доступен в обработчиках событий `ПередКаждымТестом` и `ПослеКаждогоТеста` +* Контекст тестового набора (`ЮТест.КонтекстТестовогоНабора`) - живет в рамках набора тестов. Доступен в каждом тесте набора и в обработчиках событий + * `ПередТестовымНабором` + * `ПослеТестовогоНабора` + * `ПередКаждымТестом` + * `ПослеКаждогоТеста` +* Контекст тестового модуля (`ЮТест.КонтекстМодуля`) - живет в рамках тестового модуля. Доступен в каждом тесте модуля и в обработчиках событий + * `ПередВсемиТестами` + * `ПослеВсехТестов` + * `ПередТестовымНабором` + * `ПослеТестовогоНабора` + * `ПередКаждымТестом` + * `ПослеКаждогоТеста` diff --git a/docs/images/compare.png b/docs/images/compare.png new file mode 100644 index 00000000..d59eed68 Binary files /dev/null and b/docs/images/compare.png differ diff --git a/docs/images/link-base-project.png b/docs/images/link-base-project.png new file mode 100644 index 00000000..de0a3cf6 Binary files /dev/null and b/docs/images/link-base-project.png differ diff --git a/docs/images/project-import.png b/docs/images/project-import.png new file mode 100644 index 00000000..da9b480f Binary files /dev/null and b/docs/images/project-import.png differ diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 00000000..67e398de --- /dev/null +++ b/docs/install.md @@ -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. Готово diff --git a/docs/test-data.md b/docs/test-data.md new file mode 100644 index 00000000..71dbe3bb --- /dev/null +++ b/docs/test-data.md @@ -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, Версия, Данные); + +КонецФункции +``` diff --git a/docs/test-registration.md b/docs/test-registration.md index 6f52c3a6..a9446c4a 100644 --- a/docs/test-registration.md +++ b/docs/test-registration.md @@ -1,10 +1,35 @@ -# Регистрация тестовых методов +# Регистрация тестовых методов (ЮТТесты) -Работа с регистрацией тестовых методов реализована в модуле `ЮТТесты`. +Кроме того, чтобы написать тестовые сценарии, разработчик должен зарегистрировать их в движке. +Регистрация выполняется внутри предопределенного экспортного метод `ИсполняемыеСценарии`, который обязательно должен находиться в тестовом модуле. -Возможности: +```bsl + +Процедура ИсполняемыеСценарии() Экспорт + + // Регистрация тестов + ЮТТесты // Регистрация тестов выполняет через модуль регистратор + .ДобавитьТестовыйНабор("Математические методы") // Набор - объединение тестов + .ДобавитьТест("Сложение") // Обязательно при регистрации указываем имя экспортного метода + .ДобавитьТест("Вычитание", "Вычитание") // Также можно указать представление теста + .ДобавитьТест("Вычитание", "ВычитаниеСервер", , "Сервер") // Контекст исполнения, по умолчанию тест выполняется во всех контекстах модуля + .ДобавитьКлиентскийТест("УмножениеНаКлиенте") // Есть отдельный метод для регистрации клиентских тестов + .ДобавитьСерверныйТест("ДелениеНаСервере", "Деление на сервер") // Есть отдельный метод для регистрации серверных тестов + .ДобавитьТестовыйНабор("Строковые методы") + .ДобавитьТест("СтрНайти") + .ДобавитьТест("СтрРазделить"); + +КонецПроцедуры + +``` + +Этот метод автоматически вызывается тестовым движком при старте тестирования. + +Как видно из примера выше, регистрация выполняется с помощью методов модуля `ЮТТесты`. + +Он позволяет: * Объединять тесты в наборы, указывать теги, по которым возможно формировать отборы запускаемых тестов -* Указать контекст вызова, например, для клиент-серверного модуля (или метода) можно реализовать два теста в одном тестовом модуле, проверяющих логику и на клиенте, и на сервере. -* Организовывать черновика, регистрируя нереализованные тесты -* Планируется, предоставить функционал параметризированных тестов. +* Указывать контекст вызова, например, для клиент-серверного модуля (или метода) можно реализовать тесты в одном тестовом модуле, проверяющие логику и на клиенте, и на сервере. +* Указывать параметры выполнения тестов. +* Организовывать черновики, регистрируя нереализованные тесты. diff --git a/exts/yaxunit/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl b/exts/yaxunit/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl index 868d778d..215bfbe4 100644 --- a/exts/yaxunit/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ОМ_ЮТУтверждения/Module.bsl @@ -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) diff --git a/exts/yaxunit/src/CommonModules/ОМ_ЮТест/Module.bsl b/exts/yaxunit/src/CommonModules/ОМ_ЮТест/Module.bsl index 49f58756..18c08c15 100644 --- a/exts/yaxunit/src/CommonModules/ОМ_ЮТест/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ОМ_ЮТест/Module.bsl @@ -28,10 +28,52 @@ ЮТТесты .Тест("Пропустить") + .Тест("ПроверкаКонтекста") ; КонецПроцедуры +Процедура ПередВсемиТестами() Экспорт + + ЮТест.Контекст().УстановитьЗначение("Глобальный", 1); + ЮТест.Контекст().УстановитьЗначение("Заменяемый", 5); + ЮТест.Контекст().УстановитьЗначение("Коллекция", Новый Массив()); + ЮТест.Контекст().Значение("Коллекция").Добавить("ПередВсемиТестами"); + +КонецПроцедуры + +Процедура ПередТестовымНабором() Экспорт + + ЮТест.Контекст().УстановитьЗначение("Набор", 2); + ЮТест.Контекст().Значение("Коллекция").Добавить("ПередТестовымНабором"); + +КонецПроцедуры + +Процедура ПередКаждымТестом() Экспорт + + ЮТест.Контекст().УстановитьЗначение("Тест", 3); + ЮТест.Контекст().УстановитьЗначение("Заменяемый", 3); + ЮТест.Контекст().Значение("Коллекция").Добавить("ПередКаждымТестом"); + +КонецПроцедуры + +Процедура ПослеКаждогоТеста() Экспорт + + ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеКаждогоТеста"); + +КонецПроцедуры + +Процедура ПослеТестовогоНабора() Экспорт + + ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеТестовогоНабора"); +КонецПроцедуры + +Процедура ПослеВсехТестов() Экспорт + + ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеВсехТестов"); + ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция")).ИмеетДлину(6); +КонецПроцедуры + Процедура Пропустить() Экспорт ЮТест.Пропустить(); @@ -39,6 +81,16 @@ КонецПроцедуры +Процедура ПроверкаКонтекста() Экспорт + + ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Глобальный"), "Значение глобального контекста").Равно(1); + ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Набор"), "Значение контекста набора").Равно(2); + ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Тест"), "Значение контекста теста").Равно(3); + ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Заменяемый"), "Замененное значение контекста").Равно(3); + ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция")).ИмеетДлину(3); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции