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

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

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

подсказка

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

Возможности

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

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

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

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

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

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

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

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

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

    Товар = ЮТест.Данные().СоздатьЭлемент(Справочники.Товары); // На основании менеджера
    Товар = ЮТест.Данные().СоздатьЭлемент("Справочники.Товары"); // На основании имени менеджера

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

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

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

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

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

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

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

ОбщиеДанные = Новый Структура("ВидЦены, Поставщик", Закупочная, Конструктор.ДанныеОбъекта().Поставщик);

Для Инд = 1 По 3 Цикл
Конструктор.ДобавитьСтроку()
.Фикция("Товар")
.УстановитьРеквизиты(ОбщиеДанные)
.Установить("Цена", ЮТест.Данные().СлучайноеПоложительноеЧисло(9999, 2))
.Установить("Количество", ЮТест.Данные().СлучайноеПоложительноеЧисло(20))
.Установить("Сумма", Конструктор.ДанныеСтроки().Цена * Конструктор.ДанныеСтроки().Количество)
КонецЦикла;

Возврат Конструктор.Провести();

Конструктор движения документа

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

Конструктор позволяет:

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

// Формирование нужных проводок по регистру ЦеныТоваров
ЮТест.Данные().КонструкторДвижений(Документ, "ЦеныТоваров") // Инициализация конструктора
.ДобавитьСтроку() // Добавление записи в набор
.ФикцияРеквизитов("Товар, ВидЦен") // Заполнение фиктивными данными
.Установить("Цена", 0) // Установка цены
.Записать(); // Сохранение

// Создание дополнительных данных
Документ = ЮТест.Данные().СоздатьДокумент("Документы.РасходТовара");
Покупатель = ЮТест.Данные().СоздатьЭлемент("Справочники.Контрагенты");

// Инициализация конструктора
Конструктор = ЮТест.Данные().КонструкторДвижений(Документ, "Продажи");

// Заполнение движений
Для Инд = 1 По 10 Цикл
Конструктор
.ДобавитьСтроку()
.Установить("Покупатель", Покупатель)
.ФикцияРеквизитов("Товар, Сумма");
КонецЦикла;

// Сохранение записей в базе
Конструктор.Записать();

Загрузка данных из макетов

Работа с макетами описана в отдельной статье

Работа с файлами

Создание XDTO

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

Тип = СериализаторXDTO.XMLТип(Тип("ДокументОбъект.Заказ"));

Дата = ЮТест.Данные().СлучайнаяДата();
Номер = ЮТест.Данные().СлучайнаяСтрока(9);
Сумма = ЮТест.Данные().СлучайноеЧисло();
Реквизиты = Новый Структура("Number, Сумма", Номер, Сумма);

Объект = ЮТест.Данные().КонструкторОбъектаXDTO(Тип.ИмяТипа, Тип.URIПространстваИмен)
.Установить("Date", Дата)
.ФикцияОбязательныхПолей()
.УстановитьРеквизиты(Реквизиты)
.Фикция("Покупатель")
.ДобавитьНовый("Товары")
.ФикцияРеквизитов("Цена, Количество")
.ДанныеОбъекта();

Он был создан на основании уже проверенного и зарекомендовавшего себя ЮТест.Данные().КонструкторОбъекта и обладает схожим API.

  • Установить(ИмяРеквизита, Значение) - Устанавливает значение указанного реквизита объекта.

  • УстановитьРеквизиты(ЗначенияРеквизитов) - Устанавливает значения реквизитов объекта.

  • Фикция(ИмяРеквизита) - на основании типа создаваемого объекта определяет тип реквизита и устанавливает для него случайное значение.

    • Для примитивных значение генерируется случайное значение
    • Для объектных типов создается новый объект
    • Для коллекций - генерируется случайно количество случайных элементов (на основании типа)
  • ФикцияОбязательныхПолей() - на основании типа создаваемого объекта определяет список обязательных полей и для каждого из них вызывается метод Фикция.

  • ФикцияНезаполненных() - для всех незаполненных полей создаваемого объекта вызывает метод Фикция.

  • ФикцияРеквизитов() - для перечисленных полей создаваемого объекта вызывает метод Фикция.

  • ДобавитьНовый(ИмяРеквизита) - Добавляет новый объект в указанную реквизит-коллекцию. Все последующие вызовы установки реквизитов будут относится к этому добавленному объекту.

  • ПерейтиКВладельцу() - используется после метода ДобавитьНовый для переключения контекста заполнения на родительский объект. Например вам необходимо добавить две строки в табличную часть.

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

    Здесь перед добавлением второй строки нужно переключится (ПерейтиКВладельцу) на основной объект и после этого можно добавить строку.

  • ДанныеОбъекта() - возвращает созданный объект XDTO.

Примеры

Генерация фейкового документа

#Если Сервер Тогда
Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара);
#Иначе
Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара");
#КонецЕсли

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

Для Инд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, Версия, Данные);

КонецФункции