Программное создание тестовых данных
Доступ к методам генерации тестовых реализован через ЮТест.Данные(), этот метод возвращает общий модуль ЮТТестовыеДанные.
Не рекомендуется обращаться к модулю ЮТТестовыеДанные напрямую, используйте ЮТест.Данные()
Возможности
Инструменты работы с тестовыми данными можно разделить на следующие группы:
- Генераторы случайных значений
- Методы создания данных в информационной базе
- Методы загрузки из макетов
- Работа с файлами
Генераторы случайных данных
Как уже говорилось в статье в 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_"
// Использование в конструкторе объекта
Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары")
.Установить("Наименование", "Товар " + ЮТест.Данные().СлучайнаяСтрока())
.Установить("Идентификатор", ЮТест.Данные().Фикция(Тип("УникальныйИдентификатор")))
.Записать();