Перейти к основному содержимому

Программное создание тестовых данных

Доступ к методам генерации тестовых реализован через ЮТест.Данные(), этот метод возвращает общий модуль ЮТТестовыеДанные.

подсказка

Не рекомендуется обращаться к модулю ЮТТестовыеДанные напрямую, используйте ЮТест.Данные()

Возможности

Инструменты работы с тестовыми данными можно разделить на следующие группы:

  • Генераторы случайных значений
  • Методы создания данных в информационной базе
  • Методы загрузки из макетов
  • Работа с файлами

Генераторы случайных данных

Как уже говорилось в статье в YAxUnit сделан большой упор на генерацию случайных тестовых данных, которая позволяет улучшить покрытие и сократить количество "лишнего" кода. Поставив в самом начале на такой подход мы еще ни разу в нем не разочаровались.

Создание случайных данных базируется на генерации примитивных значения:

Методы создания данных в информационной базе

Создание пустышек

Создание записей в базе с минимальным заполнения (наменование, код, номер, дата).
Полезно использовать когда вам нужна ссылка определенного типа, но не важно ее заполнение.

  • ЮТест.Данные().СоздатьЭлемент - Создает новый элемент справочника или плана видов характеристик

    Товар = ЮТест.Данные().СоздатьЭлемент(Справочники.Товары); // На основании менеджера
    Товар = ЮТест.Данные().СоздатьЭлемент("Справочники.Товары"); // На основании имени менеджера
    
    ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
    ПараметрыЗаписи.ОбменДаннымиЗагрузка = Истина;
    Товар = ЮТест.Данные().СоздатьЭлемент("Справочники.Товары", , , ПараметрыЗаписи); // Запись в режиме ОбменДанными.Загрузка = Истина
  • ЮТест.Данные().СоздатьДокумент - Создает новый документ

    Товар = ЮТест.Данные().СоздатьДокумент(Документ.ПриходТовара); // На основании менеджера
    Товар = ЮТест.Данные().СоздатьДокумент("Документ.ПриходТовара"); // На основании имени менеджера
  • ЮТест.Данные().СоздатьГруппу - Создает новую группу справочника или плана видов характеристик

    Товар = ЮТест.Данные().СоздатьГруппу(Документ.ПриходТовара); // На основании менеджера
    Товар = ЮТест.Данные().СоздатьГруппу("Документ.ПриходТовара"); // На основании имени менеджера
  • ЮТест.Данные().Фикция - Создает новый объект на основании его типа

    Товар = ЮТест.Данные().Фикция(Тип("ДокументСсылка.ПриходТовара"));
    Товар = ЮТест.Данные().Фикция(Новый ОписаниеТипов("ДокументСсылка.ПриходТовара"));
    Товар = ЮТест.Данные().Фикция(Новый ОписаниеТипов("ДокументСсылка.ПриходТовара, ДокументСсылка.РасходТовара")); // Будет выбран случайный тип

Конструктор объекта

ЮТест.Данные().КонструкторОбъекта - инструмент, с помощью которого вы можете создать объект информационной базы с необходимыми реквизитами. Конструктор позволяет:

  • В более компактной форме заполнять объект
  • Имеет методы записи и проведения
  • При возникновении ошибки оборачивает их в более понятные человеку описания
  • Киллер фича - Фикция, ФикцияРеквизитов и ФикцияОбязательныхПолей. Устанавливает случайно сгенерированные значения реквизитов. Таким образом делается акцент на важных для теста реквизитах и экономит "строки" на генерацию ненужных значений
  • Умеет создавать данные с клиента и удалять их по окончании теста
Полное описание

Описание всех методов и примеры можно посмотреть в описании конструктора объекта

Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара")
    .ФикцияРеквизитов("Поставщик, Склад")
    .ФикцияОбязательныхПолей()
    .ТабличнаяЧасть("Товары")
  
ОбщиеДанные = Новый Структура("ВидЦены, Поставщик", Закупочная, Конструктор.ДанныеОбъекта().Поставщик);

Для Инд = 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_"

// Использование в конструкторе объекта
Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары")
    .Установить("Наименование", "Товар " + ЮТест.Данные().СлучайнаяСтрока())
    .Установить("Идентификатор", ЮТест.Данные().Фикция(Тип("УникальныйИдентификатор")))
    .Записать();