Библиотека предназначена для облегчения создания модульных тестов для конфигураций на платформе 1С:Предприятие версии 8.3. Библиотека реализована в виде расширения. Такой подход позволяет хранить тесты отдельно от конфигурации. Что, так же, дополнительно даёт возможность подключать реализованные ранее тесты к другим информационным базам с такой же конфигурацией.
Тестируемые объекты добавляются в состав расширения библиотеки. В результате чего возможно реализовывать тесты не экспортных функций объектов, а так же строить наглядное дерево тестов в форме обозревателя тестов. Тесты сгруппированы так же, как объекты метаданных в дереве конфигурации.
На данный момент библиотека находится в стадии активной разработки. Будут добавляться новые возможности. Поэтому далее описана лишь общая базовая информация для начала создания тестов. Все основные процедуры и функции снабжены подробными комментарии, которые помогут разобраться в использовании библиотеки.
Библиотека тестирования выполнена в виде расширения, поэтому для её подключения необходимо просто подключить расширение к основной конфигурации.
После подключения расширения пользователям, которые будут выполнять тестирование в правах доступа необходимо добавить роль мт_ВыполнениеТестирования.
Перед созданием первого теста необходимо поместить в подключенное расширение объект, для функций и процедур которого создаются тесты. Например, для написания тестов общего модуля "ДоставкаТоваров" необходимо поместить в расширение этот общий модуль. А чтобы создать тест для процедуры "ЗаполнитьНаименованиеДляПечатиПоШаблону" формы элемента справочника "Номенклатура" необходимо добавить в расширение саму форму элемента справочника "Номенклатура".
Добавленный объект необходимо включить в подсистему "мт_ТестируемыеОбъекты" расширения. Так, если в расширение была добавлена форма элемента справочника "Номенклатура", то сам справочник "Номенклатура" необходимо включить в состав подсистемы "мт_ТестируемыеОбъекты".
Тестовые процедуры создаются в модуле добавленного в расширение объекта. Такие процедуры должны быть отмечены ключевым словом "Экспорт".
Создание тестовой процедуры.
В общем случае, тестовая процедура создаётся без параметров.
Пример тестовой процедуры:
Процедура тест_УправлениеДоступностью_СкладНеЗаполнен_СтраницыНеДоступны() Экспорт
// Инициализация
Объект.Склад = Неопределено;
// Выполнение тестируемой процедуры
УправлениеДоступность();
// Проверка
мт_ТестированиеКлиентСервер.ПроверитьЭлементФормыНеДоступен(Элементы.Страницы);
КонецПроцедуры
Проверка результата.
Если тестируемая функция не прошла требуемую проверку, то необходимо вызвать исключение с описанием проблемы.
Например,
Если Элементы.Страницы.Доступность Тогда
ВызватьИсключение НСтр("ru='Страницы формы должны быть НЕ доступны'");
КонецЕсли;
Для облегчения выполнения проверки результатов в общем модуле "мт_ТестированиеКлиентСервер" создан ряд вспомогательных процедур. Так, в примере тестовой процедуры из листинга выше, для проверки доступности элемента используется процедура "ПроверитьЭлементФормыНеДоступен", которая, по сути, выполняет те же дейстия, что и в примере проверки результата, но требует всего одной строки кода вместо трёх.
Добавление созданной процедуры в список тестов.
Для того, чтобы выполнить созданный тест, его необходимо добавить в список тестовых процедур. Для этого в том же модуле, где располагаются тестовые процедуры необходимо добавить экспортную процедуру "тест_ДобавитьТестыВСписок(СписокТестов)". В этой процедуре необходимо добавить все ваши тесты в список с помощью вызова функции "мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок".
Пример процедуры "тест_ДобавитьТестыВСписок".
Процедура тест_ДобавитьТестыВСписок(СписокТестов) Экспорт
мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок(
СписокТестов,
"тест_УправлениеДоступностью_СкладЗаполнен_СтраницыДоступны");
мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок(
СписокТестов,
"тест_УправлениеДоступностью_СкладНеЗаполнен_СтраницыНеДоступны");
КонецПроцедуры
Создание тестовой процедуры с параметрами.
При необходимости, в тестовую процедуру можное передать один произвольный параметр. Для передачи нескольких параметров можно использовать тип Структура.
Значения параметров указываются при добавлении теста в список в процедуре "мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок".
Пример тестовой процедуры с параметром:
Процедура тест_УправлениеДоступностью_ЗаполнениеСклад_ПроверкаДоступностиСтраниц(Параметры) Экспорт
// Инициализация
Объект.Склад = Параметры.Склад;
// Выполнение тестируемой процедуры
УправлениеДоступность();
// Проверка
мт_ТестированиеКлиентСервер.ПроверитьЗначенияРавны(
Параметры.Доступность,
Элементы.Страницы.Доступность);
КонецПроцедуры
Добавление тестовой процедуры с параметрами в список тестов.
Для указания значений параметров тестовой процедуры используются дополнительные параметры процедуры "мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок":
- Параметры - значения параметра;
- Уточнение - строкое представление для уточнения теста в списке тестов.
Пример добавления тестовой процедуры с параметрами в список тестов.
Процедура тест_ДобавитьТестыВСписок(СписокТестов) Экспорт
Параметры = Новый Структура("Склад, Доступность", КакойТоСклад, Истина);
мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок(
СписокТестов,
"тест_УправлениеДоступностью_ЗаполнениеСклад_ПроверкаДоступностиСтраниц",
Параметры,
НСтр("ru='Склад указан'"));
//
Параметры = Новый Структура("Склад, Доступность", Неопределено, Ложь);
мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок(
СписокТестов,
"тест_УправлениеДоступностью_ЗаполнениеСклад_ПроверкаДоступностиСтраниц",
Параметры,
НСтр("ru='Склад НЕ указан'"));
КонецПроцедуры
Для запуска на выполнение тестов используется обработка Обозреватель тестов. Данная обработка находится в разделе Модульное тестирование (добавляется при подключении расширения библиотеки).
В данной форме все реализованные тесты выведены в виде дерева и сгруппированы по объектам метаданных.
Есть возможность запуска как всех тестов сразу, так и в разных вариациях:
- выполнить выбранный тест (или группу тестов);
- повторить запуск тестов, которые выполнялись в прошлый раз;
- выполнить только не пройденные, пройденные или те тесты, которые ещё ни разу не выполнялись (новые тесты).
Результаты выполнения тестов сохраняются в лог-файл формата JSON, что, при необходимости, позволяет загружать эти результаты для анализа в другие системы.
В форме обозревателя тестов предусмотрены настройки для автоматического запуска тестов, что вместе с использованием лог-файла позволяет выполнять запуск тестов и проверку результатов их выполнения полностью в автоматическом режиме.
В библиотеке так же реализован функционал для облегчения тестирования HTTP-сервисов (тестирование Web-сервисов на данный момент не поддерживается). Что позволяет отказаться от использования сторонних программ (таких, как Postman) и расположить все тесты в одном месте.
Перед началом тестирования в настройках формы обозревателя тестов необходимо указать адрес публикации информационной базы и учётные данные для подключения.
Тесты HTTP-сервисов располагаются в общем серверном модуле. Поэтому в расширении нужно создать общий серверный модуль, например, "HTTPСервисыТестирование", реализовать в нём экспортную функцию "тест_ДобавитьТестыВСписок" и создать процедуры тестирования (выполнить те же действия, что и при создании тестов для любых других объектом, см. выше Создание теста).
Для вызова HTTP-сервиса используется процедура "мт_ТестированиеHTTPСервисовКлиентСервер.ВызватьМетодHttpСервиса" (подробнее об использовании функции описано в комментарии-описании к ней).
Например, есть HTTP-сервис "ВнутреннаяИнтеграция", в котором реализован шаблон URL "ПолучитьПриходныйОрдерПоШтрихкоду", реализующий метод "GET". Данный метод принимает штрихкод документа "Приходный кассовый ордер" и возвращает его номер и дату.
Пример процедуры для тестирования HTTP-сервиса.
Процедура тест_ПриходныйОрдерПоШтрихкодуGET_ДокументНайден() Экспорт
// Найдем подходящий документ для тестирования (последний проведённый).
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПриходныйОрдерНаТовары.Ссылка КАК Ссылка,
| ПриходныйОрдерНаТовары.Номер КАК Номер,
| ПриходныйОрдерНаТовары.Дата КАК Дата
|ИЗ
| Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары
|ГДЕ
| ПриходныйОрдерНаТовары.Проведен
|
|УПОРЯДОЧИТЬ ПО
| ПриходныйОрдерНаТовары.МоментВремени УБЫВ");
ДанныеДокумента = Запрос.Выполнить().Выбрать();
Если Не ДанныеДокумента.Следующий() Тогда
ТекстСообщения = НСтр("ru='В системе отсутствуют приходные ордера. Выполнить тест невозможно.'");
ВызватьИсключение ТекстСообщения;
КонецЕсли;
// Получим его штрихкод.
ДокументСсылка = ДанныеДокумента.Ссылка;
ШтрихкодДокумента = ШтрихкодированиеПечатныхФорм.ЧисловойКодПоСсылке(ДокументСсылка);
// Вызовем HTTP-сервис.
ПараметрыВызова = Новый Структура;
ПараметрыВызова.Вставить("ПараметрыЗапроса", Новый Структура("barcode", ШтрихкодДокумента));
Ответ = мт_ТестированиеHTTPСервисовКлиентСервер.ВызватьМетодHttpСервиса(
"ВнутреннаяИнтеграция.ПолучитьПриходныйОрдерПоШтрихкоду",
ПараметрыВызова,
"JSON");
// И проверим ответ.
мт_ТестированиеКлиентСервер.ПроверитьВызовHttpМетодаВыполненУспешно(Ответ);
ТекстОшибки = Ответ.Тело["error"];
Если ЗначениеЗаполнено(ТекстОшибки) Тогда
ВызватьИсключение НСтр("ru='При вызове метода произошла ошибка: '") + ТекстОшибки;
КонецЕсли;
ПолученныйНомер = Ответ.Тело["response"]["number"];
ПолученнаяДата = XMLЗначение(Тип("Дата"), Ответ.Тело["response"]["number"]);
Если Не (ПолученныйНомер = ДанныеДокумента.Номер И ПолученнаяДата = ДанныеДокумента.Дата) Тогда
ВызватьИсключение НСтр("ru='Возвращен неверный документ'");
КонецЕсли;
КонецПроцедуры
Реализация библиотеки в виде расширения, помимо множества плюсов имеет один большой недостаток: с её помощью нельзя так же просто создать тесты для процедур и функций, реализованных в другом расширении.
Один из возможных вариантов тестирования является объединение тестируемого расширения с расширением библиотеки и добавление тестов в это общее расширение. Т.е. к разрабатываемому расширению добавляется функционал тестирования.
Для объединения расширений необходимо выполнить следующие действия:
- В конфигураторе открыть список расширений через пункт меню Кофигурация / Расширения конфигурации.
- В списке расширений выбрать нужное расширение и выполнить команду Конфигурация / Сравнить, объединить с конфигурацией из файла в командной панели формы списка расширений.
- Выбрать на диске файл расширения с библиотекой тестирования.
- В окне сравнения, объединения снять флаг с корневого элемента дерева, выбрать в меню команду Действия / Отметить по подсистемам файла" и выбрать две подсистемы: мт_МодульноеТестирование и мт_ТестируемыеОбъекты.
- Нажать кнопку Выполнить для завершения объединения.
Данный способ имеет очевидный минус: тестовый код будет находиться вместе с рабочим кодом. Частично проблему можно уменьшить, поместив процедуры тестирования в отдельную область, например "АвтоматизированноеТестирование". Или поместить тестовые методы в отдельный(-ые) общий(-ие) модуль(-и). Но в таком случает пропадает возможность тестирования не экспортных процедур и функции.