Программное создание тестовых данных
Доступ к методам генерации тестовых реализован через ЮТест.Данные()
, этот метод возвращает общий модуль ЮТТестовыеДанные
.
Не рекомендуется обращаться к модулю ЮТТестовыеДанные
напрямую, используйте ЮТест.Данные()
Возможности
Инструменты работы с тестовыми данными можно разделить на следующие группы:
- Генераторы случайных значений
- Методы создания данных в информационной базе
- Методы загрузки из макетов
- Работа с файлами
Генераторы случайных данных
Как уже говорилось в статье в YAxUnit сделан большой упор на генерацию случайных тестовых данных, которая позволяет улучшить покрытие и сократить количество "лишнего" кода. Поставив в самом начале на такой подход мы еще ни разу в нем не разочаровались.
Создание случайных данных базируется на генерации примитивных значения:
-
Числа
ЮТест.Данные().СлучайноеЧисло
- Формирует случайное число в указанном диапазонеЮТест.Данные().СлучайноеПоложительноеЧисло
- Формирует случайное положительное число ограниченное максимумомЮТест.Данные().СлучайноеОтрицательноеЧисло
- Формирует случайное отрицательное число ограниченное минимумом
-
Строки
ЮТест.Данные().СлучайнаяСтрока
- Формирует случайную строку указанной длиныЮТест.Данные().СлучайныйИдентификатор
- Формирует случайный валидный идентификатор (Первым символом должна быть буква или символ подчеркивания, каждый из последующих символов может быть буквой, цифрой или символом подчеркивания)ЮТест.Данные().СлучайныйIPАдрес
- Формирует случайный IP адресЮТест.Данные().СлучайныйНомерТелефона
- Формирует случайный номер телефонаЮТест.Данные().УникальнаяСтрока
- Создает строку на базе нового уникального идентификатора
-
Даты
ЮТест.Данные().СлучайнаяДата
- Формирует случайную дату в указанном диапазонеЮТест.Данные().СлучайноеВремя
- Формирует случайное времяЮТест.Данные().СлучайнаяДатаВБудущем
- Формирует случайную дату в будущем (больше текущей) с возможностью ограничить максимальное значение.
Пример:СлучайнаяДатаВБудущем(2, "часа")
- будет сформирована дата в интервале (ТекущаяДата, ТекущаяДата + 2 часа]ЮТест.Данные().СлучайнаяДатаВПрошлом
- Формирует случайную дату в прошлом (меньше текущей) с возможностью ограничить минимальное значение.
Пример:СлучайнаяДатаВПрошлом(2, "часа")
- будет сформирована дата в интервале [ТекущаяДата - 2 часа, ТекущаяДата)ЮТест.Данные().СлучайнаяДатаПосле
- Формирует случайную дату, которая больше указанной с возможностью ограничить максимальное значение.
Пример:СлучайнаяДатаПосле(Дата, 2, "часа")
- будет сформирована дата в интервале (Дата, Дата + 2 часа]ЮТест.Данные().СлучайнаяДатаДо
- Формирует случайную дату, которая меньше указанной с возможностью ограничить минимальное значение.
Пример:СлучайнаяДатаДо(Дата, 2, "часа")
- будет сформирована дата в интервале [Дата - 2 часа, Дата)
-
Булево
ЮТест.Данные().СлучайноеБулево
- Возвращает случайное булево
-
Получение случайного из предопределенного списка
-
ЮТест.Данные().СлучайноеЗначениеИзСписка
- Возвращает случайное значение из указанного спискаВозможныеЗначения = ЮТКоллекции.ЗначениеВМассиве(-1, 0, 1); Возврат ЮТест.Данные().СлучайноеЗначениеИзСписка(ВозможныеЗначения);
-
ЮТест.Данные().СлучайноеЗначениеПеречисления
- Возвращает случайное значение перечисления Примеры:Цена = ЮТест.Данные().СлучайноеЗначениеПеречисления(Перечисления.ВидыЦен); // Можно получить значение через указание менеджера Цена = ЮТест.Данные().СлучайноеЗначениеПеречисления("Перечисление.ВидыЦен"); // Или имя объекта метаданных (подходит для работы с клиента)
-
ЮТест.Данные().СлучайноеПредопределенноеЗначение
- Возвращает случайное предопределенное значение Примеры:Цена = ЮТест.Данные().СлучайноеПредопределенноеЗначение(Справочники.ВидыЦен); // Можно получить значение через указание менеджера Цена = ЮТест.Данные().СлучайноеПредопределенноеЗначение("Справочник.ВидыЦен"); // Или имя объекта метаданных (подходит для работы с клиента)
-
-
ЮТест.Данные().Подражатель
- генератор правдоподобных данных. Генерирует случайные данные на базе словарей, является реализацией faker для 1С.ЮТест.Данные().Подражатель().Люди
ЮТест.Данные().Подражатель().Компании
Наименование
- Формирует случайное наименование компанииИНН
- Формирует случайный ИНН компанииКПП
- Формирует случайный КПП компании
ЮТест.Данные().Подражатель().Банки
НомерСчета
- Формирует случайный номер банковского счетаБИК
- Формирует случайный валидный БИК банка
Методы создания данных в информационной базе
Создание пустышек
Создание записей в базе с минимальным заполнения (наменование, код, номер, дата).
Полезно использовать когда вам нужна ссылка определенного типа, но не важно ее заполнение.
-
ЮТест.Данные().СоздатьЭлемент
- Создает новый элемент справочника или плана видов характеристикТовар = ЮТест.Данные().СоздатьЭлемент(Справочники.Товары); // На основании менеджера Товар = ЮТест.Данные().СоздатьЭлемент("Справочники.Товары"); // На основании имени менеджера ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи(); ПараметрыЗаписи.ОбменДаннымиЗагрузка = Истина; Товар = ЮТест.Данные().СоздатьЭлемент("Справочники.Товары", , , ПараметрыЗаписи); // Запись в режиме ОбменДанными.Загрузка = Истина
-
ЮТест.Данные().СоздатьДокумент
- Создает новый документТовар = ЮТест.Данные().СоздатьДокумент(Документ.ПриходТовара); // На основании менеджера Товар = ЮТест.Данные().СоздатьДокумент("Документ.ПриходТовара"); // На основании имени менеджера
-
ЮТест.Данные().СоздатьГруппу
- Создает новую группу справочника или плана видов характеристикТовар = ЮТест.Данные().СоздатьГруппу(Документ.ПриходТовара); // На основании менеджера Товар = ЮТест.Данные().СоздатьГруппу("Документ.ПриходТовара"); // На основании имени менеджера
-
ЮТест.Данные().Фикция
- Создает новый объект на основании его типаТовар = ЮТест.Данные().Фикция(Тип("ДокументСсылка.ПриходТовара")); Товар = ЮТест.Данные().Фикция(Новый ОписаниеТипов("ДокументСсылка.ПриходТовара")); Товар = ЮТест.Данные().Фикция(Новый ОписаниеТипов("ДокументСсылка.ПриходТовара, ДокументСсылка.РасходТовара")); // Будет выбран случайный тип
Конструктор объекта
ЮТест.Данные().КонструкторОбъекта
- инструмент, с помощью которого вы можете создать объект информационной базы с необходимыми реквизитами.
Конструктор позволяет:
- В более компактной форме заполнять объект
- Имеет методы записи и проведения
- При возникновении ошибки оборачивает их в более понятные человеку описания
- Киллер фича -
Фикция
,ФикцияРеквизитов
иФикцияОбязательныхПолей
. Устанавливает случайно сгенерированные значения реквизитов. Таким образом делается акцент на важных для теста реквизитах и экономит "строки" на генерацию ненужных значений - Умеет создавать данные с клиента и удалять их по окончании теста
Описание всех методов и примеры можно посмотреть в описании конструктора объекта
Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара")
.ФикцияРеквизитов("Поставщик, Склад")
.ФикцияОбязательныхПолей()
.ТабличнаяЧасть("Товары")
ОбщиеДанные = Новый Структура("ВидЦены, Поставщик", Закупочная, Конструктор.ДанныеОбъекта().Поставщик);
Для Инд = 1 По 3 Цикл
Конструктор.ДобавитьСтроку()
.Фикция("Товар")
.УстановитьРеквизиты(ОбщиеДанные)
.Установить("Цена", ЮТест.Данные().СлучайноеПоложительноеЧисло(9999, 2))
.Установить("Количество", ЮТест.Данные().СлучайноеПоложительноеЧисло(20))
.Установить("Сумма", Конструктор.ДанныеСтроки().Цена * Конструктор.ДанныеСтроки().Количество)
КонецЦикла;
Возврат Конструктор.Провести();
Конструктор движения документа
ЮТест.Данные().КонструкторДвижений
- инструмент, с помощью которого вы можете формировать необходимые для теста движения документа.
С его помощью вы можете сократить время на подготовку данных и упростить логику их создания.
Конструктор позволяет:
- В более компактной форме формировать движения объекта.
- При возникновении ошибки оборачивает их в более понятные человеку описания.
- Киллер фича -
Фикция
,ФикцияРеквизитов
иФикцияОбязательныхПолей
. Устанавливает случайно сгенерированные значения реквизитов.
Таким образом делается акцент на важных для теста реквизитах и экономит "строки" на генерацию ненужных значений. - Умеет создавать данные с клиента и удалять их по окончании теста.
Описание всех методов и примеры можно посмотреть в описании конструктора движений
// Создание пустышки документа, будет использоваться в качестве регистратора
Документ = ЮТест.Данные().СоздатьДокумент("Документы.УстановкаЦен");
// Формирование нужных проводок по регистру ЦеныТоваров
ЮТест.Данные().КонструкторДвижений(Документ, "ЦеныТоваров") // Инициализация конструктора
.ДобавитьСтроку() // Добавление записи в набор
.ФикцияРеквизитов("Товар, ВидЦен") // Заполнение фиктивными данными
.Установить("Цена", 0) // Установка цены
.Записать(); // Сохранение
// Создание дополнительных данных
Документ = ЮТест.Данные().СоздатьДокумент("Документы.РасходТовара");
Покупатель = ЮТест.Данные().СоздатьЭлемент("Справочники.Контрагенты");
// Инициализация конструктора
Конструктор = ЮТест.Данные().КонструкторДвижений(Документ, "Продажи");
// Заполнение движений
Для Инд = 1 По 10 Цикл
Конструктор
.ДобавитьСтроку()
.Установить("Покупатель", Покупатель)
.ФикцияРеквизитов("Товар, Сумма");
КонецЦикла;
// Сохранение записей в базе
Конструктор.Записать();
Загрузка данных из макетов
Работа с макетами описана в отдельной статье
Работа с файлами
ЮТест.Данные().НовыйФайл
- Создает новый файл, который будет удален после тестаЮТест.Данные().НовоеИмяВременногоФайла
- Возвращает имя нового файла, по окончании выполнения теста этот файл будет удален
Создание XDTO
При тестировании обменов или интеграций, использующих SOAP или XML, вам может пригодиться ЮТест.Данные().КонструкторОбъектаXDTO
. Этот инструмент позволяет легко создавать и заполнять объекты XDTO с поддержкой автоматической генерации данных. Он был создан на основании уже проверенного и зарекомендовавшего себя ЮТест.Данные().КонструкторОбъекта
и обладает схожим API.
Основные возможности
- Создание объектов XDTO с автоматической генерацией данных
- Поддержка вложенных объектов и коллекций
- Автоматическое заполнение обязательных полей
- Генерация случайных значений с учетом типа данных
- Поддержка примитивных типов, объектов и перечислений
Методы конструктора
Установить(ИмяРеквизита, Значение)
- Устанавливает значение указанного реквизита объектаУстановитьРеквизиты(ЗначенияРеквизитов)
- Устанавливает значения реквизитов объекта из структурыФикция(ИмяРеквизита)
- Генерирует и устанавливает случайное значение для реквизита с учетом его типа:- Для примитивных типов генерируется случайное значение
- Для объектных типов создается новый объект
- Для коллекций генерируется случайное количество случайных элементов
ФикцияРеквизитов(ИменаРеквизитов)
- Генерирует случайные значения для списка реквизитовФикцияОбязательныхПолей()
- Заполняет все обязательные поля случайными значениямиФикцияНезаполненных()
- Заполняет все незаполненные реквизиты случайными значениямиФикцияНезаполненныхИсключая(ИменаИсключений)
- Заполняет все незаполненные реквизиты случайными значениями, кроме указанныхДобавитьНовый(ИмяРеквизита)
- Добавляет новый объект в коллекцию. Все последующие вызовы установки реквизитов будут относиться к этому добавленному объектуПерейтиКВладельцу()
- Возвращает контекст заполнения к родительскому объекту. Используется после методаДобавитьНовый
для переключения контекста заполнения на родительский объектДанныеОбъекта()
- Возвращает созданный объект XDTO
Поддерживаемые типы данных
Конструктор поддерживает следующие типы данных XDTO:
- Примитивные типы:
string
- генерирует случайную строкуboolean
- генерирует случайное булево значениеinteger
- генерирует случайное целое числоdecimal
- генерирует случайное число с точностью до 3 знаковtime
- генерирует случайное времяdate
- генерирует случайную дату (начало дня)dateTime
- генерирует случайную дату и время
- Ссылочные типы:
AnyRef
- генерирует уникальную строкуAnyDBRef
- генерирует уникальную строку
- Перечисления:
- Для типов с фасетами перечислений выбирается случайное значение из списка допустимых
Примеры использования
// Пример 1: Создание простого объекта
Тип = СериализаторXDTO.XMLТип(Тип("ДокументОбъект.Заказ"));
Объект = ЮТест.Данные().КонструкторОбъектаXDTO(Тип.ИмяТипа, Тип.URIПространстваИмен)
.Установить("Номер", "ТЕС-000001")
.Установить("Дата", ТекущаяДата())
.ФикцияОбязательныхПолей()
.ДанныеОбъекта();
// Пример 2: Работа с коллекциями
Объект = ЮТест.Данные().КонструкторОбъектаXDTO(Тип.ИмяТипа, Тип.URIПространстваИмен)
.ФикцияОбязательныхПолей()
// Добавляем первую строку товаров
.ДобавитьНовый("Товары")
.Установить("Количество", 10)
.ФикцияРеквизитов("Номенклатура, Цена")
.ПерейтиКВладельцу() // Возвращаемся к основному объекту для добавления следующей строки
// Добавляем вторую строку товаров
.ДобавитьНовый("Товары")
.Установить("Количество", 20)
.ФикцияРеквизитов("Номенклатура, Цена")
.ДанныеОбъекта();
// Пример 3: Использование структуры для установки значений
Реквизиты = Новый Структура;
Реквизиты.Вставить("Номер", "ТЕС-000001");
Реквизиты.Вставить("Дата", ТекущаяДата());
Объект = ЮТест.Данные().КонструкторОбъектаXDTO(Тип.ИмяТипа, Тип.URIПространстваИмен)
.УстановитьРеквизиты(Реквизиты)
.ФикцияНезаполненных()
.ДанныеОбъекта();
Примеры
Генерация фейкового документа
#Если Сервер Тогда
Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара);
#Иначе
Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара");
#КонецЕсли
Конструктор
.ФикцияРеквизитов("Поставщик, Склад, Валюта")
.Установить("Организация", ЮТест.Данные().КонструкторОбъекта("Справочники.Организации").Установить("КакойТоТамУчет", Истина))
.ТабличнаяЧасть("Товары");
Для Инд1 = 1 По ЮТест.Данные().СлучайноеЧисло(1, 5) Цикл
Конструктор.ДобавитьСтроку()
.Фикция("Товар")
.Установить("Цена", ЮТест.Данные().СлучайноеПоложительноеЧисло(9999, 2))
.Установить("Количество", ЮТест.Данные().СлучайноеПоложительноеЧисло(20))
.Установить("Сумма", Конструктор.ДанныеСтроки().Цена * Конструктор.ДанныеСтроки().Количество)
КонецЦикла;
Ссылка = Конструктор.Провести();
Генерация произвольных фейковых данных
Функция ОписаниеСервера(Знач Идентификатор = Неопределено) Экспорт
Описание = БазовоеОписаниеОбъекта(Идентификатор, "СРВ");
Описание.Вставить("Адрес", ЮТТестовыеДанные.Случайный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, 100); // Случайное число от 1 до 100
ПоложительноеЧисло = ЮТест.Данные().СлучайноеПоложительноеЧисло(100); // Случайное положительное число до 100
ОтрицательноеЧисло = ЮТест.Данные().СлучайноеОтрицательноеЧисло(-100); // Случайное отрицательное число до -100
// Генерация идентификаторов
УникальныйИд = ЮТест.Данные().Фикция(Тип("УникальныйИдентификатор")); // Новый уникальный идентификатор
СтроковыйИд = ЮТест.Данные().СлучайныйИдентификатор(10, "ID_"); // Случайный строковый идентификатор длиной 10 с префиксом "ID_"
// Использование в конструкторе объекта
Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары")
.Установить("Наименование", "Товар " + ЮТест.Данные().СлучайнаяСтрока())
.Установить("Идентификатор", ЮТест.Данные().Фикция(Тип("УникальныйИдентификатор")))
.Записать();