Skip to content

Библиотека для облегчения создания модульных тестов для конфигураций на платформе 1С:Предприятие версии 8.3. Библиотека реализована в виде расширения.

License

Notifications You must be signed in to change notification settings

ltfriend/UnitTestFor1C

Repository files navigation

Библиотека модульного тестирования для 1С:Предприятие 8.3.

Библиотека предназначена для облегчения создания модульных тестов для конфигураций на платформе 1С:Предприятие версии 8.3. Библиотека реализована в виде расширения. Такой подход позволяет хранить тесты отдельно от конфигурации. Что, так же, дополнительно даёт возможность подключать реализованные ранее тесты к другим информационным базам с такой же конфигурацией.

Тестируемые объекты добавляются в состав расширения библиотеки. В результате чего возможно реализовывать тесты не экспортных функций объектов, а так же строить наглядное дерево тестов в форме обозревателя тестов. Тесты сгруппированы так же, как объекты метаданных в дереве конфигурации.

Быстрый старт.

На данный момент библиотека находится в стадии активной разработки. Будут добавляться новые возможности. Поэтому далее описана лишь общая базовая информация для начала создания тестов. Все основные процедуры и функции снабжены подробными комментарии, которые помогут разобраться в использовании библиотеки.

Подключение библиотеки.

Библиотека тестирования выполнена в виде расширения, поэтому для её подключения необходимо просто подключить расширение к основной конфигурации.

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

Создание теста.

Перед созданием первого теста необходимо поместить в подключенное расширение объект, для функций и процедур которого создаются тесты. Например, для написания тестов общего модуля "ДоставкаТоваров" необходимо поместить в расширение этот общий модуль. А чтобы создать тест для процедуры "ЗаполнитьНаименованиеДляПечатиПоШаблону" формы элемента справочника "Номенклатура" необходимо добавить в расширение саму форму элемента справочника "Номенклатура".

Добавленный объект необходимо включить в подсистему "мт_ТестируемыеОбъекты" расширения. Так, если в расширение была добавлена форма элемента справочника "Номенклатура", то сам справочник "Номенклатура" необходимо включить в состав подсистемы "мт_ТестируемыеОбъекты".

Тестовые процедуры создаются в модуле добавленного в расширение объекта. Такие процедуры должны быть отмечены ключевым словом "Экспорт".

Создание тестовой процедуры.

В общем случае, тестовая процедура создаётся без параметров.

Пример тестовой процедуры:

Процедура тест_УправлениеДоступностью_СкладНеЗаполнен_СтраницыНеДоступны() Экспорт
	
	// Инициализация
	Объект.Склад = Неопределено;
	
	// Выполнение тестируемой процедуры
	УправлениеДоступность();
	
	// Проверка
	мт_ТестированиеКлиентСервер.ПроверитьЭлементФормыНеДоступен(Элементы.Страницы);
	
КонецПроцедуры

Проверка результата.

Если тестируемая функция не прошла требуемую проверку, то необходимо вызвать исключение с описанием проблемы.

Например,

Если Элементы.Страницы.Доступность Тогда
	ВызватьИсключение НСтр("ru='Страницы формы должны быть НЕ доступны'");
КонецЕсли;

Для облегчения выполнения проверки результатов в общем модуле "мт_ТестированиеКлиентСервер" создан ряд вспомогательных процедур. Так, в примере тестовой процедуры из листинга выше, для проверки доступности элемента используется процедура "ПроверитьЭлементФормыНеДоступен", которая, по сути, выполняет те же дейстия, что и в примере проверки результата, но требует всего одной строки кода вместо трёх.

Добавление созданной процедуры в список тестов.

Для того, чтобы выполнить созданный тест, его необходимо добавить в список тестовых процедур. Для этого в том же модуле, где располагаются тестовые процедуры необходимо добавить экспортную процедуру "тест_ДобавитьТестыВСписок(СписокТестов)". В этой процедуре необходимо добавить все ваши тесты в список с помощью вызова функции "мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок".

Пример процедуры "тест_ДобавитьТестыВСписок".

Процедура тест_ДобавитьТестыВСписок(СписокТестов) Экспорт

	мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок(
		СписокТестов,
		"тест_УправлениеДоступностью_СкладЗаполнен_СтраницыДоступны");
	мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок(
		СписокТестов,
		"тест_УправлениеДоступностью_СкладНеЗаполнен_СтраницыНеДоступны");
	
КонецПроцедуры

Создание тестовой процедуры с параметрами.

При необходимости, в тестовую процедуру можное передать один произвольный параметр. Для передачи нескольких параметров можно использовать тип Структура.

Значения параметров указываются при добавлении теста в список в процедуре "мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок".

Пример тестовой процедуры с параметром:

Процедура тест_УправлениеДоступностью_ЗаполнениеСклад_ПроверкаДоступностиСтраниц(Параметры) Экспорт
	
	// Инициализация
	Объект.Склад = Параметры.Склад;
	
	// Выполнение тестируемой процедуры
	УправлениеДоступность();
	
	// Проверка
	мт_ТестированиеКлиентСервер.ПроверитьЗначенияРавны(
		Параметры.Доступность,
		Элементы.Страницы.Доступность);
	
КонецПроцедуры

Добавление тестовой процедуры с параметрами в список тестов.

Для указания значений параметров тестовой процедуры используются дополнительные параметры процедуры "мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок":

  • Параметры - значения параметра;
  • Уточнение - строкое представление для уточнения теста в списке тестов.

Пример добавления тестовой процедуры с параметрами в список тестов.

Процедура тест_ДобавитьТестыВСписок(СписокТестов) Экспорт

	Параметры = Новый Структура("Склад, Доступность", КакойТоСклад, Истина);

	мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок(
		СписокТестов,
		"тест_УправлениеДоступностью_ЗаполнениеСклад_ПроверкаДоступностиСтраниц",
		Параметры,
		НСтр("ru='Склад указан'"));
	
	//

	Параметры = Новый Структура("Склад, Доступность", Неопределено, Ложь);

	мт_ТестированиеСлужебныйКлиентСервер.ДобавитьТестВСписок(
		СписокТестов,
		"тест_УправлениеДоступностью_ЗаполнениеСклад_ПроверкаДоступностиСтраниц",
		Параметры,
		НСтр("ru='Склад НЕ указан'"));
	
КонецПроцедуры

Выполнение тестов.

Для запуска на выполнение тестов используется обработка Обозреватель тестов. Данная обработка находится в разделе Модульное тестирование (добавляется при подключении расширения библиотеки).

В данной форме все реализованные тесты выведены в виде дерева и сгруппированы по объектам метаданных.

Есть возможность запуска как всех тестов сразу, так и в разных вариациях:

  • выполнить выбранный тест (или группу тестов);
  • повторить запуск тестов, которые выполнялись в прошлый раз;
  • выполнить только не пройденные, пройденные или те тесты, которые ещё ни разу не выполнялись (новые тесты).

Результаты выполнения тестов сохраняются в лог-файл формата JSON, что, при необходимости, позволяет загружать эти результаты для анализа в другие системы.

В форме обозревателя тестов предусмотрены настройки для автоматического запуска тестов, что вместе с использованием лог-файла позволяет выполнять запуск тестов и проверку результатов их выполнения полностью в автоматическом режиме.

Тестирование HTTP-сервисов.

В библиотеке так же реализован функционал для облегчения тестирования 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='Возвращен неверный документ'");
	КонецЕсли;

КонецПроцедуры

Тестирование расширений.

Реализация библиотеки в виде расширения, помимо множества плюсов имеет один большой недостаток: с её помощью нельзя так же просто создать тесты для процедур и функций, реализованных в другом расширении.

Один из возможных вариантов тестирования является объединение тестируемого расширения с расширением библиотеки и добавление тестов в это общее расширение. Т.е. к разрабатываемому расширению добавляется функционал тестирования.

Для объединения расширений необходимо выполнить следующие действия:

  1. В конфигураторе открыть список расширений через пункт меню Кофигурация / Расширения конфигурации.
  2. В списке расширений выбрать нужное расширение и выполнить команду Конфигурация / Сравнить, объединить с конфигурацией из файла в командной панели формы списка расширений.
  3. Выбрать на диске файл расширения с библиотекой тестирования.
  4. В окне сравнения, объединения снять флаг с корневого элемента дерева, выбрать в меню команду Действия / Отметить по подсистемам файла" и выбрать две подсистемы: мт_МодульноеТестирование и мт_ТестируемыеОбъекты.
  5. Нажать кнопку Выполнить для завершения объединения.

Данный способ имеет очевидный минус: тестовый код будет находиться вместе с рабочим кодом. Частично проблему можно уменьшить, поместив процедуры тестирования в отдельную область, например "АвтоматизированноеТестирование". Или поместить тестовые методы в отдельный(-ые) общий(-ие) модуль(-и). Но в таком случает пропадает возможность тестирования не экспортных процедур и функции.

About

Библиотека для облегчения создания модульных тестов для конфигураций на платформе 1С:Предприятие версии 8.3. Библиотека реализована в виде расширения.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published