Skip to content

Latest commit

 

History

History
215 lines (160 loc) · 22 KB

Создание-файлов-тестов.MD

File metadata and controls

215 lines (160 loc) · 22 KB

Создание файлов-тестов

Создаем новую внешнюю обработку, т. н. тестовый набор

Тестовые случаи (экспортные методы без параметров, чье имя может начинаться на Тест (необязательно)) могут располагаться:

  • в модуле обработки для тестирования "серверной" части приложения
  • в модуле основной формы обработки для тестирования методов, которые располагаются в клиентской части приложения

Тестовый случай считается успешно выполненным, если в процессе его выполнения не было исключения.

Соответственно, для того чтобы тест упал, нужно выбросить исключение 1С. Для этого используются вызовы специальных методов-утверждений из фреймворка xUnit. См. Методы проверки/утверждений

Примеры тестов

Предопределенные свойства (переменные) теста

  • КонтекстЯдра - переменная, которая содержит в себе ссылку на экземпляр фреймворка xUnit - объект обработки xddTestRunner

    • имя КонтекстЯдра необязательно, можно использовать любое другое имя переменной
    • значение этой переменной должно быть заполнено в методе Инициализация
  • Переменная КонтекстЯдра предоставляет доступ к следующим методам программного интерфейса фреймворка тестирования:

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

ТекущийКонтейнерСтруктура = КонтекстЯдра.Объект.ТекущийКонтейнер;

где, ТекущийКонтейнерСтруктура - структура с ключами:

  • Имя - Строка - Имя группы тестов, так как указано в методе НачатьГруппу()
  • Тип - Строка - для группы тестов тип "Контейнер"
  • Строки - Массив - элемент массива Структура с описанием и параметрами каждого конкретного теста
  • Контекст - Произвольный - Контекст, который передается между тестами. Контекст управляется методами СохранитьКонтекст и ПолучитьКонтекст

Предопределенные методы теста

  • Инициализация(КонтекстЯдраПараметр) - процедура, которая должна инициализировать контекст ядра и заполнить значение переменной КонтекстЯдра. Так же в этой процедуре должны быть инициализированны переменные подключаемых плагинов, например, Ожидаем или Утверждения. Метод вызывается перед началом каждого теста (тестового случая), до вызова метода ПередЗапускомТеста.

    • КонтекстЯдраПараметр - ссылка на экземпляр фреймворка xUnit - объект обработки xddTestRunner
  • ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) - процедура, которая заполняет набор описаний тестовых случаев и тестовых сценариев, именно этот набор и является списком выполняемых тестов/сценариев

    • НаборТестов - ссылка на экземпляр внешней обработки ЗагрузчикФайла, которая предоставляет программный интерфейс добавления тестов, групп тестов и управления порядком выполнения тестов. Смотрите API объекта НаборТестов
    • КонтекстЯдраПараметр (необязательный) - ссылка на экземпляр фреймворка xUnit - объект обработки xddTestRunner. При реализации метода ЗаполнитьНаборТестов рекомендуется инициализировать переменную КонтекстЯдра = КонтекстЯдраПараметр для получения доступа к программному интерфейсу Контекста ядра.
  • ПолучитьСписокТестов - функция - (рекомендуется использование ЗаполнитьНаборТестов)

    • должна вернуть массив описаний тестовых случаев
    • именно этот массив и является списком выполняемых тестов
    • функция без параметров
  • ПередЗапускомТеста - процедура (необязательная)

    • вызывается перед запуском каждого теста
  • ПослеЗапускаТеста - процедура (необязательная)

    • вызывается после запуска каждого теста
    • метод вызывается независимо от того, успешно прошел тест или упал.

API НаборТестов

  • Добавить(ИмяМетода, Параметры, Представление) - функция, которая добавляет тестовый случай в набор тестов и возвращает структуру - элемент контейнера Группа тестов.

    • ИмяМетода - Строка - параметр должен указывать на экспортную процедуру из текущего модуля. Количество параметров этой процедуры должно совпадать с количеством параметров из второго параметра Параметры. Если Параметры не заданы, процедура тестового случая должна быть без параметров.
    • Параметры (необязательно) - Массив - параметры тестового случая. Задаются только на этапе создания набора тестов. Параметры теста можно задать с помощью метода ПараметрыТеста.
    • Представление (необязательно) - Строка - представление тестового случая в окне браузера тестов.
  • НачатьГруппу(ИмяГруппы, СтрогийПорядокВыполнения) - процедура, которая создает группу тестов. Удобно для выполнения сценариев, т. е. последовательных шагов тестов.

    • ИмяГруппы - Строка - наименование группы тестов
    • СтрогийПорядокВыполнения - Булево - выполнять тесты в порядке объявления, иначе - случайный порядок
  • ПараметрыТеста(Парам1, Парам2, Парам3, ... Парам9) - функция, которая позволяет задать параметры для тестового случая. Возвращает массив с элементами - параметрами.

    • Парам1 - Произвольный - (обязательно) значение первого параметра
    • Парам2 ... Парам9 - Произвольный - (необязательно) значения следующих параметров
  • СлучайныйПорядокВыполнения - процедура, которая определяет возможность случайного выполнения тестов в группе тестов. Удобно для несвязанных тестов. Метод устанавливает ключ СлучайныйПорядокВыполнения в структуре КонтейнерТестов:

КонтейнерТестов.СлучайныйПорядокВыполнения = Истина;
  • СтрогийПорядокВыполнения - процедура, которая определяет возможность случайного выполнения тестов в группе тестов. Удобно для сценарных тестов, которые должны выполняться строго последовательно друг за другом. Метод устанавливает ключ СлучайныйПорядокВыполнения в структуре КонтейнерТестов:
КонтейнерТестов.СлучайныйПорядокВыполнения = Ложь;
  • ПродолжитьВыполнениеПослеПаденияТеста - процедура, которая устанавливает ключ ПродолжитьВыполнениеПослеПаденияТестав в структуре КонтейнерТестов:
КонтейнерТестов.ПродолжитьВыполнениеПослеПаденияТеста = Истина;
  • ОстановитьВыполнениеПослеПаденияТестов - процедура, которая устанавливает ключ ПродолжитьВыполнениеПослеПаденияТестав в структуре КонтейнерТестов:
КонтейнерТестов.ПродолжитьВыполнениеПослеПаденияТеста = Ложь;
  • ДобавитьДеструктор(ИмяМетодаДеструктора, Представление) - функция, которая возвращает структуру - элемент контейнера Группа тестов. Действует как деструктор в контейнере тестов (группе тестов). Выполняется один раз, в конце группы тестов. Параметры:
    • ИмяМетодаДеструктора - Строка - параметр должен указывать на экспортную процедуру из текущего модуля.
    • Представление - Строка - наименование для представления в браузере тестирования.

Базовые приемы написания тестов

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

Перед запуском теста начинаем транзакцию, после выполнения теста транзакция отменяется. В итоге в базе не остается никаких следов тестирования и тесты работают независимо.

Можно использовать следующий шаблон методов теста

Процедура ПередЗапускомТеста() Экспорт
	НачатьТранзакцию();
КонецПроцедуры

Процедура ПослеЗапускаТеста() Экспорт
	Если ТранзакцияАктивна() Тогда
	    ОтменитьТранзакцию();
	КонецЕсли;
КонецПроцедуры

Базовый шаблон файла-теста (серверный тест в модуле обработки)

Перем КонтекстЯдра;
Перем Утверждения;

//{ основная процедура для юнит-тестирования xUnitFor1C
Процедура Инициализация(КонтекстЯдраПараметр) Экспорт
	КонтекстЯдра = КонтекстЯдраПараметр;
	Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения");
КонецПроцедуры

Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт
  КонтекстЯдра = КонтекстЯдраПараметр;
  НаборТестов.НачатьГруппу("Группа тестов");
  НаборТестов.Добавить("ТестДолжен_СложитьДваИДва");
КонецПроцедуры

//}

//{ Блок юнит-тестов

Процедура ПередЗапускомТеста() Экспорт
	НачатьТранзакцию();
КонецПроцедуры

Процедура ПослеЗапускаТеста() Экспорт
	Если ТранзакцияАктивна() Тогда
	    ОтменитьТранзакцию();
	КонецЕсли;
КонецПроцедуры

Процедура ТестДолжен_СложитьДваИДва() Экспорт
	Утверждения.ПроверитьРавенство(2 + 2, 4, "2 + 2, 4");
КонецПроцедуры

//}

Использование параметрических тестов

Пример теста:

Процедура ЗаполнитьНаборТестов(НаборТестов) Экспорт
	НаборТестов.НачатьГруппу("Группа параметризованных тестов со строгим порядком выполнения", Истина);

	НаборТестов.Добавить("ТестДолжен_СохранитьРезультатСложенияВКонтекст", 
НаборТестов.ПараметрыТеста(5, 7), "Тест должен сохранить результат сложения (5 + 7) в контекст");

	Тест = НаборТестов.Добавить("ТестДолжен_СравнитьКонтекстСоСвоимПараметром");
	Тест.Параметры.Добавить(12);
КонецПроцедуры
// { Группа параметризованных тестов со строгим режимом выполнения
Процедура ТестДолжен_СохранитьРезультатСложенияВКонтекст(Знач1, Знач2) Экспорт
	КонтекстЯдра.СохранитьКонтекст(Знач1 + Знач2);
КонецПроцедуры

Процедура ТестДолжен_СравнитьКонтекстСоСвоимПараметром(Результат) Экспорт
	Контекст = КонтекстЯдра.ПолучитьКонтекст();
	Ожидаем.Что(Контекст).Равно(Результат);
КонецПроцедуры
// } Группа параметризованных тестов со строгим режимом выполнения

Пример Кода теста с параметрами