Создаем новую внешнюю обработку, т. н. тестовый набор
Тестовые случаи (экспортные методы без параметров, чье имя может начинаться на Тест (необязательно)) могут располагаться:
- в модуле обработки для тестирования "серверной" части приложения
- в модуле основной формы обработки для тестирования методов, которые располагаются в клиентской части приложения
Тестовый случай считается успешно выполненным, если в процессе его выполнения не было исключения.
Соответственно, для того чтобы тест упал, нужно выбросить исключение 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);
КонецПроцедуры
Процедура ТестДолжен_СравнитьКонтекстСоСвоимПараметром(Результат) Экспорт
Контекст = КонтекстЯдра.ПолучитьКонтекст();
Ожидаем.Что(Контекст).Равно(Результат);
КонецПроцедуры
// } Группа параметризованных тестов со строгим режимом выполнения