--- tags: [Getting started, Test data] --- # Тестовые данные Почти в каждом тесте разработчику необходимы данные, которые он будет использовать при тестировании: элементы справочников, документы, остатки и тд. Есть разные подходы к работе с тестовыми данными: 1. Ручное наполнение тестовой базы (мы предварительно создаем все что необходимо для тестов в базе, а потом используем её для прогона тестов) 2. Использование файлов с данными (макеты - сгенерированные в нужном формате файлы с описанием тестовых данных, загружаемые при выполнении тестов) 3. Программное создание нужных данных внутри теста У каждого из вариантов есть свои плюсы и минусы, и при грамотной компоновке можно достичь наилучшего результата. Например: * Ручное наполнение базы не учитывает последующие доработки системы, нужна миграция на новые алгоритмы и структуру, и, если таких данных будет много, то миграция будет занимать большое время. А также в этом случае нам необходимо завязываться на конкретные записи в системе, и при их изменении тестом мы можем сломать другие тесты. Поэтому, предварительное наполнение базы должно быть минимальным. * В случае использования макетов данных возникают некоторые трудности с их доработкой и вариативностью, например, в новом тесте нужны данные из макета, но с некоторыми изменениями. В этом случае нам потребуется создавать новый макет или проверять, не сломают ли наши изменения другие тесты. Также при таком подходе сложно контролировать и искать какие макеты используются и кем. * Программное создание тестовых данных увеличивает время и сложность теста. Если грамотно распределить тестовые данные на способы создания, мы можем добиться оптимального результата. Например, можно статичные данные создать вручную, сложные кейсы данных засунуть в макеты, а для программного создания реализовать методы-конструкторы, которые будем переиспользовать. Таким образом, сможем уйти от минусов данного подхода или минимизировать их вред. В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные`. Сейчас это минимальный набор методов, который в дальнейшем будет развиваться. Он позволяет: * Создавать данные информационной базы * Генерировать случайные значения * Работать с файлами * Использовать таблицы markdown в качестве макетов данных Примеры 1. Генерация фейкового документа ```bsl #Если Сервер Тогда Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара); #Иначе Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара"); #КонецЕсли Конструктор .Фикция("Поставщик") .Фикция("Склад") .Фикция("Валюта") .Фикция("Организация") .ТабличнаяЧасть("Товары"); Для Инд1 = 1 По ЮТест.Данные().СлучайноеЧисло(1, 5) Цикл Конструктор.ДобавитьСтроку() .Фикция("Товар") .Установить("Цена", ЮТест.Данные().СлучайноеПоложительноеЧисло(9999, 2)) .Установить("Количество", ЮТест.Данные().СлучайноеПоложительноеЧисло(20)) .Установить("Сумма", Конструктор.ДанныеСтроки().Цена * Конструктор.ДанныеСтроки().Количество) КонецЦикла; Ссылка = Конструктор.Провести(); ``` 2. Генерация произвольных фейковых данных ```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, Версия, Данные); КонецФункции ``` 3. Чтение из таблицы Markdown ```bsl Макет = "| Имя | ИмяКоллекции | Конструктор | Группы | Ссылочный | Реквизиты | Измерения | Ресурсы | РеквизитыАдресации | ТабличныеЧасти | ||------------------------|-------------------------|----------------------|--------|-----------|-----------|-----------|---------|--------------------|----------------| || Справочник | Справочники | СоздатьЭлемент | + | + | + | | | | + | || Документ | Документы | СоздатьДокумент | | + | + | | | | + | || ПланВидовХарактеристик | ПланыВидовХарактеристик | СоздатьЭлемент | + | + | + | | | | + | || ПланСчетов | ПланыСчетов | СоздатьСчет | | + | + | | | | + | || ПланВидовРасчета | ПланыВидовРасчета | СоздатьВидРасчета | | + | + | | | | + | || ПланОбмена | ПланыОбмена | СоздатьУзел | | + | + | | | | + | || РегистрСведений | РегистрыСведений | СоздатьНаборЗаписей | | | + | + | + | | | || РегистрНакопления | РегистрыНакопления | СоздатьНаборЗаписей | | | + | + | + | | | || РегистрБухгалтерии | РегистрыБухгалтерии | СоздатьНаборЗаписей | | | + | + | + | | | || РегистрРасчета | РегистрыРасчета | СоздатьНаборЗаписей | | | + | + | + | | | || БизнесПроцесс | БизнесПроцессы | СоздатьБизнесПроцесс | | + | + | | | | + | || Задача | Задачи | СоздатьЗадачу | | + | + | | | + | + | |"; КоллекцияОписаний = ЮТТестовыеДанные.ТаблицаMarkDown(Макет); ТипыМетаданных = Новый Структура(); Для Каждого Запись Из КоллекцияОписаний Цикл Описание = Новый Структура(); Описание.Вставить("Имя", Запись.Имя); Описание.Вставить("ИмяКоллекции", Запись.ИмяКоллекции); Описание.Вставить("Конструктор", Запись.Конструктор); Описание.Вставить("Группы", Запись.Группы = "+"); Описание.Вставить("Ссылочный", Запись.Ссылочный = "+"); Описание.Вставить("Реквизиты", Запись.Реквизиты = "+"); Описание.Вставить("Измерения", Запись.Измерения = "+"); Описание.Вставить("Ресурсы", Запись.Ресурсы = "+"); Описание.Вставить("РеквизитыАдресации", Запись.РеквизитыАдресации = "+"); Описание.Вставить("ТабличныеЧасти", Запись.ТабличныеЧасти = "+"); ТипыМетаданных.Вставить(Описание.Имя, Описание); ТипыМетаданных.Вставить(Описание.ИмяКоллекции, Описание); КонецЦикла; Возврат ТипыМетаданных; ```