Создаем новую внешнюю обработку, т. н. тестовый набор
Тестовые случаи (экспортные методы без параметров, чье имя может начинаться на Тест
(необязательно)) могут располагаться:
- в модуле обработки для тестирования "серверной" части приложения
- в модуле основной формы обработки для тестирования методов, которые располагаются в клиентской части приложения
Тестовый случай считается успешно выполненным, если в процессе его выполнения не было исключения.
Соответственно, для того чтобы тест упал, нужно выбросить исключение 1С. Для этого используются вызовы специальных методов-утверждений из фреймворка xUnit
. См. Методы проверки/утверждений
-
КонтекстЯдра
- переменная, которая содержит в себе ссылку на экземпляр фреймворкаxUnit
- объект обработкиxddTestRunner
- имя
КонтекстЯдра
необязательно, можно использовать любое другое имя переменной - значение этой переменной должно быть заполнено в методе
Инициализация
- имя
-
Переменная
КонтекстЯдра
предоставляет доступ к следующим методам программного интерфейса фреймворка тестирования:Плагин(Идентификатор)
- функция, которая возвращает объект внешней обработки плагина. ПараметрИдентификатор
- Строка - наименование плагина (имя внешней обработки)СохранитьКонтекст(Контекст)
- процедура, которая в реквизитеТекущийКонтейнер
(Структура) устанавливает ключ Контекст. ПараметрКонтекст
- Произвольный - пользовательское значение, которое будет доступно из тестов.ПолучитьКонтекст()
- функция, которая возвращает значение ключа Контекст из реквизита объекта-обработкиТекущийКонтейнер
.ГлобальныйКонтекст()
- функция возвращает переменную (структура), которая содержит глобальный контекст. Глобальный контекст существует только на клиенте и в процессе работы браузера тестирования не передается на сервер. Глобальный контекст инициализируется пустой структурой при открытии управляемой формы браузера тестирования.ГлобальныйКонтекстДобавить(Ключ, ЗначениеКонтекста)
- процедура, которая добавляет значениеЗначениеКонтекста
в глобальный контекст с ключемКлюч
Значение контекста существует весь сеанс тестирования. Глобальный контекст хранится на клиенте и в отличии от контекста сохраненного методомСохранитьКонтекст(Контекст)
не передается на сервер при выполнении внутренней логики браузера тестирования.ГлобальныйКонтекстЗначение(Ключ)
- функция, которая возвращает значение элемента контекста с ключемКлюч
. Если в глобальном контексте не существует элемента с таким ключем, то будет возвращено значениеНеопределено
ГлобальныйКонтекстУдалить(Ключ)
- процедура, которая удаляет из глобального контекста элемент с ключемКлюч
ГлобальныйКонтекстОчистить()
- процедура, которая удаляет все элементы глобального контекста.ВывестиСообщение(ТекстСообщения, Статус)
- процедура, которая выводит сообщение пользователю. Параметры:ТекстСообщения
- Строка - текст сообщения пользователюСтатус
- СтатусСообщения - примерСтатусСообщения.Важное
ВывестиСообщениеВЛогФайл(Сообщение)
- процедура, которая выводит сообщение в лог-файл. ПараметрСообщение
- Строка.ВызватьОшибкуПроверки(СообщениеОшибки)
- процедура, которая стандартным образом генерирует исключение и прерывает выполнение теста.
-
Переменная
КонтекстЯдра
предоставляет доступ к реквизитуТекущийКонтейнер
, который содержит информацию о группе тестов, выполняющейся в данный момент. Пример вызова на клиенте:
ТекущийКонтейнерСтруктура = КонтекстЯдра.Объект.ТекущийКонтейнер;
где, ТекущийКонтейнерСтруктура
- структура с ключами:
- Имя - Строка - Имя группы тестов, так как указано в методе НачатьГруппу()
- Тип - Строка - для группы тестов тип "Контейнер"
- Строки - Массив - элемент массива Структура с описанием и параметрами каждого конкретного теста
- Контекст - Произвольный - Контекст, который передается между тестами. Контекст управляется методами
СохранитьКонтекст
иПолучитьКонтекст
-
Инициализация(КонтекстЯдраПараметр)
- процедура, которая должна инициализировать контекст ядра и заполнить значение переменнойКонтекстЯдра
. Так же в этой процедуре должны быть инициализированны переменные подключаемых плагинов, например,Ожидаем
илиУтверждения
. Метод вызывается перед началом каждого теста (тестового случая), до вызова методаПередЗапускомТеста
.КонтекстЯдраПараметр
- ссылка на экземпляр фреймворкаxUnit
- объект обработки xddTestRunner
-
ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр)
- процедура, которая заполняет набор описаний тестовых случаев и тестовых сценариев, именно этот набор и является списком выполняемых тестов/сценариевНаборТестов
- ссылка на экземпляр внешней обработкиЗагрузчикФайла
, которая предоставляет программный интерфейс добавления тестов, групп тестов и управления порядком выполнения тестов. Смотрите API объекта НаборТестовКонтекстЯдраПараметр
(необязательный) - ссылка на экземпляр фреймворкаxUnit
- объект обработки xddTestRunner. При реализации методаЗаполнитьНаборТестов
рекомендуется инициализировать переменнуюКонтекстЯдра = КонтекстЯдраПараметр
для получения доступа к программному интерфейсу Контекста ядра.
-
ПолучитьСписокТестов
- функция - (рекомендуется использованиеЗаполнитьНаборТестов
)- должна вернуть массив описаний тестовых случаев
- именно этот массив и является списком выполняемых тестов
- функция без параметров
-
ПередЗапускомТеста
- процедура (необязательная)- вызывается перед запуском каждого теста
-
ПослеЗапускаТеста
- процедура (необязательная)- вызывается после запуска каждого теста
- метод вызывается независимо от того, успешно прошел тест или упал.
-
Добавить(ИмяМетода, Параметры, Представление)
- функция, которая добавляет тестовый случай в набор тестов и возвращает структуру - элемент контейнера Группа тестов.ИмяМетода
- Строка - параметр должен указывать на экспортную процедуру из текущего модуля. Количество параметров этой процедуры должно совпадать с количеством параметров из второго параметраПараметры
. ЕслиПараметры
не заданы, процедура тестового случая должна быть без параметров.Параметры
(необязательно) - Массив - параметры тестового случая. Задаются только на этапе создания набора тестов. Параметры теста можно задать с помощью методаПараметрыТеста
.Представление
(необязательно) - Строка - представление тестового случая в окне браузера тестов.
-
НачатьГруппу(ИмяГруппы, СтрогийПорядокВыполнения)
- процедура, которая создает группу тестов. Удобно для выполнения сценариев, т. е. последовательных шагов тестов.ИмяГруппы
- Строка - наименование группы тестовСтрогийПорядокВыполнения
- Булево - выполнять тесты в порядке объявления, иначе - случайный порядок
-
ПараметрыТеста(Парам1, Парам2, Парам3, ... Парам9)
- функция, которая позволяет задать параметры для тестового случая. Возвращает массив с элементами - параметрами.- Парам1 - Произвольный - (обязательно) значение первого параметра
- Парам2 ... Парам9 - Произвольный - (необязательно) значения следующих параметров
-
СлучайныйПорядокВыполнения
- процедура, которая определяет возможность случайного выполнения тестов в группе тестов. Удобно для несвязанных тестов. Метод устанавливает ключ СлучайныйПорядокВыполнения в структуреКонтейнерТестов
:
КонтейнерТестов.СлучайныйПорядокВыполнения = Истина;
СтрогийПорядокВыполнения
- процедура, которая определяет возможность случайного выполнения тестов в группе тестов. Удобно для сценарных тестов, которые должны выполняться строго последовательно друг за другом. Метод устанавливает ключ СлучайныйПорядокВыполнения в структуреКонтейнерТестов
:
КонтейнерТестов.СлучайныйПорядокВыполнения = Ложь;
ПродолжитьВыполнениеПослеПаденияТеста
- процедура, которая устанавливает ключ ПродолжитьВыполнениеПослеПаденияТестав в структуреКонтейнерТестов
:
КонтейнерТестов.ПродолжитьВыполнениеПослеПаденияТеста = Истина;
ОстановитьВыполнениеПослеПаденияТестов
- процедура, которая устанавливает ключ ПродолжитьВыполнениеПослеПаденияТестав в структуреКонтейнерТестов
:
КонтейнерТестов.ПродолжитьВыполнениеПослеПаденияТеста = Ложь;
ДобавитьДеструктор(ИмяМетодаДеструктора, Представление)
- функция, которая возвращает структуру - элемент контейнера Группа тестов. Действует как деструктор в контейнере тестов (группе тестов). Выполняется один раз, в конце группы тестов. Параметры:ИмяМетодаДеструктора
- Строка - параметр должен указывать на экспортную процедуру из текущего модуля.Представление
- Строка - наименование для представления в браузере тестирования.
Для гарантирования независимости тестов (это одно из основных требований к тестам) рекомендуется использовать механизм транзакций.
Перед запуском теста начинаем транзакцию, после выполнения теста транзакция отменяется. В итоге в базе не остается никаких следов тестирования и тесты работают независимо.
Можно использовать следующий шаблон методов теста
Процедура ПередЗапускомТеста() Экспорт
НачатьТранзакцию();
КонецПроцедуры
Процедура ПослеЗапускаТеста() Экспорт
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПроцедуры
Перем КонтекстЯдра;
Перем Утверждения;
//{ основная процедура для юнит-тестирования xUnitFor1C
Процедура Инициализация(КонтекстЯдраПараметр) Экспорт
КонтекстЯдра = КонтекстЯдраПараметр;
Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения");
КонецПроцедуры
Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт
КонтекстЯдра = КонтекстЯдраПараметр;
НаборТестов.НачатьГруппу("Группа тестов");
НаборТестов.Добавить("ТестДолжен_СложитьДваИДва");
КонецПроцедуры
//}
//{ Блок юнит-тестов
Процедура ПередЗапускомТеста() Экспорт
НачатьТранзакцию();
КонецПроцедуры
Процедура ПослеЗапускаТеста() Экспорт
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПроцедуры
Процедура ТестДолжен_СложитьДваИДва() Экспорт
Утверждения.ПроверитьРавенство(2 + 2, 4, "2 + 2, 4");
КонецПроцедуры
//}
Пример теста:
Процедура ЗаполнитьНаборТестов(НаборТестов) Экспорт
НаборТестов.НачатьГруппу("Группа параметризованных тестов со строгим порядком выполнения", Истина);
НаборТестов.Добавить("ТестДолжен_СохранитьРезультатСложенияВКонтекст",
НаборТестов.ПараметрыТеста(5, 7), "Тест должен сохранить результат сложения (5 + 7) в контекст");
Тест = НаборТестов.Добавить("ТестДолжен_СравнитьКонтекстСоСвоимПараметром");
Тест.Параметры.Добавить(12);
КонецПроцедуры
// { Группа параметризованных тестов со строгим режимом выполнения
Процедура ТестДолжен_СохранитьРезультатСложенияВКонтекст(Знач1, Знач2) Экспорт
КонтекстЯдра.СохранитьКонтекст(Знач1 + Знач2);
КонецПроцедуры
Процедура ТестДолжен_СравнитьКонтекстСоСвоимПараметром(Результат) Экспорт
Контекст = КонтекстЯдра.ПолучитьКонтекст();
Ожидаем.Что(Контекст).Равно(Результат);
КонецПроцедуры
// } Группа параметризованных тестов со строгим режимом выполнения