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:
commit
1d629d7a42
105
README.md
105
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`, при необходимости можно указать путь к файлу конфигурации запуска.
|
||||
|
||||
### Конфигурация запуска
|
||||
|
||||
|
@ -1,6 +1,12 @@
|
||||
# Пользовательский API
|
||||
|
||||
Текущая версия расширения предоставляет разработчикам тестов методы для удобной [регистрации тестов](test-registration.md).
|
||||
Для разработчиков тестов расширение предоставляет API для:
|
||||
|
||||
* [Регистрации тестовых сценариев](test-registration.md)
|
||||
* Формирования [утверждений](assertions.md) для проверки результата работы различных механизмов системы.
|
||||
* Создания [тестовых данных](test-data.md)
|
||||
* Передачи данных между тестами используя [контекст](context.md)
|
||||
* [Подмены](mockito.md) алгоритмов работы системы
|
||||
|
||||
Имеются [базовые методы проверки](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))
|
||||
.ВыбрасываетИсключение("Слишком много фактических параметров");
|
||||
ЮТУтверждения.Что(ОМ_ЮТУтверждения)
|
||||
.Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение"))
|
||||
.ВыбрасываетИсключение("Исключение");
|
||||
ЮТУтверждения.Что(ОМ_ЮТУтверждения)
|
||||
.Метод("МетодБезИсключение")
|
||||
.ВыбрасываетИсключение("Недостаточно фактических параметров");
|
||||
```
|
||||
|
32
docs/context.md
Normal file
32
docs/context.md
Normal file
@ -0,0 +1,32 @@
|
||||
# Контекст
|
||||
|
||||
Одним из важнейших блоков работы тестового движка является механизм контекстов.
|
||||
|
||||
Он позволяет:
|
||||
|
||||
1. хранить промежуточные данные и обеспечивать работу механизма текучих выражений
|
||||
2. передавать между тестами необходимые данные
|
||||
3. удалять тестовые данные (пока только временные файлы)
|
||||
|
||||
И имеет несколько ограничений:
|
||||
|
||||
1. Не синхронизируется между клиентом и сервером
|
||||
2. Тестовые контексты имеют ограниченное время жизни, например, контекст теста "живет" только в рамках теста и событиях "ПередКаждымТестом", "ПослеКаждогоТеста".
|
||||
|
||||
Для различных механизмов движка существуют различные контексты, такие как контекст утверждений, контекст теста и тд.
|
||||
|
||||
Разработчику тестов будут интересны следующие контексты:
|
||||
|
||||
* Контекст теста (`ЮТест.КонтекстТеста`) - живет в рамках одного теста, также доступен в обработчиках событий `ПередКаждымТестом` и `ПослеКаждогоТеста`
|
||||
* Контекст тестового набора (`ЮТест.КонтекстТестовогоНабора`) - живет в рамках набора тестов. Доступен в каждом тесте набора и в обработчиках событий
|
||||
* `ПередТестовымНабором`
|
||||
* `ПослеТестовогоНабора`
|
||||
* `ПередКаждымТестом`
|
||||
* `ПослеКаждогоТеста`
|
||||
* Контекст тестового модуля (`ЮТест.КонтекстМодуля`) - живет в рамках тестового модуля. Доступен в каждом тесте модуля и в обработчиках событий
|
||||
* `ПередВсемиТестами`
|
||||
* `ПослеВсехТестов`
|
||||
* `ПередТестовымНабором`
|
||||
* `ПослеТестовогоНабора`
|
||||
* `ПередКаждымТестом`
|
||||
* `ПослеКаждогоТеста`
|
BIN
docs/images/compare.png
Normal file
BIN
docs/images/compare.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
BIN
docs/images/link-base-project.png
Normal file
BIN
docs/images/link-base-project.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
BIN
docs/images/project-import.png
Normal file
BIN
docs/images/project-import.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
38
docs/install.md
Normal file
38
docs/install.md
Normal file
@ -0,0 +1,38 @@
|
||||
# Установка
|
||||
|
||||
## Установка в EDT
|
||||
|
||||
### Первичная установка тестового движка в рабочее пространство (workspace)
|
||||
|
||||
1. Качаем архив [последнего релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
|
||||
2. Распаковываем содержимое в каталог с исходниками (не в воркспейс)
|
||||
3. Импортируем проект
|
||||
|
||||

|
||||
4. Привязываем импортированный проект расширения к конфигурации
|
||||
|
||||

|
||||
|
||||
5. Обновляем конфигурацию
|
||||
6. В конфигураторе снимаем с расширения **безопасный режим** и **защиту от опасных действий**
|
||||
7. Готово, можно приступить к написанию тестов.
|
||||
|
||||
### Обновление тестового движка
|
||||
|
||||
1. Качаем архив [последнего релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
|
||||
2. Если вы дорабатывали движок, то скачиваем архив оригинальной установленной версии движка
|
||||
3. Разархивируем их во временный каталог
|
||||
4. Воспользуемся механизмом сравнения объединения EDT
|
||||
|
||||

|
||||
* Второй источник - каталог к новой версии тестового движка
|
||||
* Использование третьего источника нужно для трехстороннего сравнения и применяется при доработках движка.
|
||||
5. Нажимаем "Объединить"
|
||||
6. Готово.
|
||||
|
||||
## Установка в конфигуратор
|
||||
|
||||
1. Качаем расширение (cfe) из [последнего релиза](https://github.com/bia-technologies/yaxunit/releases/latest)
|
||||
2. Загружаем в конфигуратор
|
||||
3. Снимаем с расширения **безопасный режим** и **защиту от опасных действий**
|
||||
4. Готово
|
92
docs/test-data.md
Normal file
92
docs/test-data.md
Normal 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, Версия, Данные);
|
||||
|
||||
КонецФункции
|
||||
```
|
@ -1,10 +1,35 @@
|
||||
# Регистрация тестовых методов
|
||||
# Регистрация тестовых методов (ЮТТесты)
|
||||
|
||||
Работа с регистрацией тестовых методов реализована в модуле `ЮТТесты`.
|
||||
Кроме того, чтобы написать тестовые сценарии, разработчик должен зарегистрировать их в движке.
|
||||
Регистрация выполняется внутри предопределенного экспортного метод `ИсполняемыеСценарии`, который обязательно должен находиться в тестовом модуле.
|
||||
|
||||
Возможности:
|
||||
```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)
|
||||
|
@ -28,10 +28,52 @@
|
||||
|
||||
ЮТТесты
|
||||
.Тест("Пропустить")
|
||||
.Тест("ПроверкаКонтекста")
|
||||
;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПередВсемиТестами() Экспорт
|
||||
|
||||
ЮТест.Контекст().УстановитьЗначение("Глобальный", 1);
|
||||
ЮТест.Контекст().УстановитьЗначение("Заменяемый", 5);
|
||||
ЮТест.Контекст().УстановитьЗначение("Коллекция", Новый Массив());
|
||||
ЮТест.Контекст().Значение("Коллекция").Добавить("ПередВсемиТестами");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПередТестовымНабором() Экспорт
|
||||
|
||||
ЮТест.Контекст().УстановитьЗначение("Набор", 2);
|
||||
ЮТест.Контекст().Значение("Коллекция").Добавить("ПередТестовымНабором");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПередКаждымТестом() Экспорт
|
||||
|
||||
ЮТест.Контекст().УстановитьЗначение("Тест", 3);
|
||||
ЮТест.Контекст().УстановитьЗначение("Заменяемый", 3);
|
||||
ЮТест.Контекст().Значение("Коллекция").Добавить("ПередКаждымТестом");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПослеКаждогоТеста() Экспорт
|
||||
|
||||
ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеКаждогоТеста");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПослеТестовогоНабора() Экспорт
|
||||
|
||||
ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеТестовогоНабора");
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПослеВсехТестов() Экспорт
|
||||
|
||||
ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеВсехТестов");
|
||||
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция")).ИмеетДлину(6);
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура Пропустить() Экспорт
|
||||
|
||||
ЮТест.Пропустить();
|
||||
@ -39,6 +81,16 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПроверкаКонтекста() Экспорт
|
||||
|
||||
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Глобальный"), "Значение глобального контекста").Равно(1);
|
||||
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Набор"), "Значение контекста набора").Равно(2);
|
||||
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Тест"), "Значение контекста теста").Равно(3);
|
||||
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Заменяемый"), "Замененное значение контекста").Равно(3);
|
||||
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция")).ИмеетДлину(3);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
Loading…
x
Reference in New Issue
Block a user