Описанное решение может оказаться полезным в случаях, когда на этапе автоматического тестирования (процесса CI) нет необходимости в покрытии дымовыми тестами всей функциональности системы. Достаточно проверить на безошибочное выполнение основных операций и интерактивных действий измененных в процессе доработки объектов. При этом отбор объектов для тестирования нужно выполнить также в автоматическом режиме.
Настройки/профили запуска обработки тестирования в консольном режиме подробно описаны в документации к библиотеке Vanessa-ADD. Предметом нашего внимания является специальный файл настройки xUnitParams.json
, используемый совместно с ключом "--xddConfig":
vrunner xunit $addRoot/tests/smoke --settings tools\vrunner.json --xddConfig ./tools/JSON/xUnitParams.json
Для подготовки специального файла настройки в ручном режиме можно воспользоваться обработкой УправлениеДымовымиТестами.epf из состава библиотеки Vanessa-ADD:
Чтобы сформировать такой файл настройки в автоматическом режиме, для начала нужно получить информацию из git по измененным объектам конфигурации. Для этого мы используем файл-выборку sonar_files, подготовленный в рамках CI для системы статического анализа кода SonarQube:
src/Documents/АвансовыйОтчет/ManagerModule.bsl
src/Documents/ПеремещениеТоваров/ManagerModule.bsl
Чтобы провести выборочные дымовые тесты только для доработанных в конфигурации объектов (к примеру - открытие формы списка, формы нового и формы существующего документа) необходимо удалить два наших документа из состава исключаемых для тестирования объектов в файле xUnitParams.json
. Это нужно сделать в списках веток интересующих нас операций открытия форм ("Списки", "Новые" и "Существующие").
Файл настройки xUnitParams.json
без доработанных объектов должен выглядеть примерно так:
Для автоматического формирования файла настройки xUnitParams.json
была написана обработка, которая используется при пакетном запуске 1С и применима для любой конфигурации. Обработка получает параметром полный путь к исходному файлу (sonar_files) в формате:
1cv8.exe /execute "<путь к обработке>\icl_СозданиеФайлаНастроекДымовыхТестов(безBOM)"/C"<путь к файлу>\sonar_files" .
Обработка содержит в себе форму, которая открывается при запуске 1С, текстовый макет, в котором находится содержимое файла xUnitParams, и строки, которые автоматически заменяются на названия коллекций метаданных:
При открытии форма получает макет xUnitParams, собирает метаданные и заменяет строки, обозначенные символом &, на собранные коллекции метаданных.
Содержимое макета xUnitParams:
{
"smoke": {
"Справочники": {
"Списки": [
&СправочникиИсключения
],
"Новые": [
&СправочникиИсключения
],
"Существующие": [
&СправочникиИсключения
]
},
"Обработки": [
&ОбработкиИсключения
],
"ОткрываемФормыНаКлиентеТестирования": true,
"Документы": {
"Списки": [
&ДокументыИсключения
],
"Новые": [
&ДокументыИсключения
],
"Существующие": [
&ДокументыИсключения
]
},
"Используется": true,
"Отчеты": [
&ОтчетыИсключения
],
"БизнесПроцессы": [
&БизнесПроцессыИсключения
]
},
"МодальныеОкна": {
"ШаблонПомощника": {
"Поля": [
"*Закрыть *?"
],
"Заголовки": [
"* Шаблон *"
],
"Кнопка": 0
}
},
"МакетыСКД": {
"Используется": false,
"ИсключенияОбщихМакетов": [],
"ИсключенияПоИмениМетаданных": []
},
"CommandInterface": {
"Используется": false,
"Документы": [],
"Разделы": [],
"СтрогийПорядокВыполнения": true,
"Обработки": [],
"Справочники": [],
"Отчеты": [],
"ОбщиеКоманды": [
"Удалить*",
"ЗагрузитьДанныеИзФайла",
"СверткаИнформационнойБазы",
"УдалениеПомеченныхОбъектов"
],
"БизнесПроцессы": []
},
"ФормированиеПечатныхФорм": {
"Используется": false,
"ИсключенияПоОбъекту": [],
"КоличествоДокументов": 2,
"ИсключенияПоИдентификатору": [
"Комплект*"
]
},
"ПроведениеДокументов": {
"Используется": true,
"КоличествоДокументов": 2,
"Исключения": [
&ДокументыИсключенияПроведения
]
}
}
Код модуля формы содержит методы:
При открытии окна считываем файл sonar_files (ЧтениеТекста), далее готовим данные считыванием макета, собираем метаданные для списков исключений, записываем результирующие данные в файл json:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Не ЗначениеЗаполнено(ПараметрЗапуска) Тогда
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
Файл = Новый Файл(ПараметрЗапуска);
Если Не Файл.Существует() Тогда
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
ПутьКФайлу = Файл.Путь;
// чтение шаблона
ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, КодировкаТекста.UTF8);
Настройки = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
// путь к файлу настроек
ИмяФайла = Файл.Путь + "xUnitParams.json";
// чтение файла шаблона
ВременнаяПапка = Файл.Путь + Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss");
СоздатьКаталог(ВременнаяПапка);
ИмяФайлаТмп = ВременнаяПапка + "\xUnitParams.json.tmp";
// получаем данные файла настроек
Данные = ПолучитьДанные(Настройки);
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаТмп, КодировкаТекста.UTF8, , Ложь);
ЗаписьТекста.Записать(Данные);
ЗаписьТекста.Закрыть();
// преобразование кодировки
МассивФайлов = Новый Массив;
УбитьBOM(ИмяФайлаТмп, ИмяФайла, ВременнаяПапка, МассивФайлов);
УдалитьФайлы(ВременнаяПапка);
// безусловное завершение работы системы, т.к. запуск обработки происходит из командной строки 1С
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Код функции ПолучитьДанные:
&НаСервере
Функция ПолучитьДанные(Настройки)
ТекстМакета = РеквизитФормыВЗначение("Объект").ПолучитьМакет("xUnitParams").ПолучитьТекст();
СправочникиИсключения = ПолучитьСправочникиИсключения(Настройки);
ДокументыИсключения = ПолучитьДокументыИсключения(Настройки);
ОбработкиИсключения = ПолучитьОбработкиИсключения(Настройки);
ОтчетыИсключения = ПолучитьОтчетыИсключения(Настройки);
БизнесПроцессыИсключения = ПолучитьБизнесПроцессыИсключения(Настройки);
ДокументыИсключенияПроведения = ДокументыИсключения;
ТекстМакета = СтрЗаменить(ТекстМакета, "&ДокументыИсключенияПроведения", ДокументыИсключенияПроведения);
ТекстМакета = СтрЗаменить(ТекстМакета, "&СправочникиИсключения", СправочникиИсключения);
ТекстМакета = СтрЗаменить(ТекстМакета, "&ДокументыИсключения", ДокументыИсключения);
ТекстМакета = СтрЗаменить(ТекстМакета, "&ОбработкиИсключения", ОбработкиИсключения);
ТекстМакета = СтрЗаменить(ТекстМакета, "&ОтчетыИсключения", ОтчетыИсключения);
ТекстМакета = СтрЗаменить(ТекстМакета, "&БизнесПроцессыИсключения", БизнесПроцессыИсключения);
Возврат ТекстМакета;
КонецФункции
Функции получения списков объектов для исключений будут идентичны:
- список справочников:
&НаСервереБезКонтекста
Функция ПолучитьСправочникиИсключения(Настройки)
Результат = "";
Для Каждого Описание Из Метаданные.Справочники Цикл
СтрокаПоиска = "Catalogs/" + Описание.Имя + "/";
Если СтрНайти(Настройки, СтрокаПоиска) > 0 Тогда
Продолжить;
КонецЕсли;
Результат = Результат + ?(ПустаяСтрока(Результат), "", "," + Символы.ПС) + """" + Описание.Имя + """";
КонецЦикла;
Возврат Результат;
КонецФункции
- список документов:
&НаСервереБезКонтекста
Функция ПолучитьДокументыИсключения(Настройки)
Результат = "";
Для Каждого Описание Из Метаданные.Документы Цикл
СтрокаПоиска = "Documents/" + Описание.Имя + "/";
Если СтрНайти(Настройки, СтрокаПоиска) > 0 Тогда
Продолжить;
КонецЕсли;
Результат = Результат + ?(ПустаяСтрока(Результат), "", "," + Символы.ПС) + """" + Описание.Имя + """";
КонецЦикла;
Возврат Результат;
КонецФункции
- список обработок:
&НаСервереБезКонтекста
Функция ПолучитьОбработкиИсключения(Настройки)
Результат = "";
Для Каждого Описание Из Метаданные.Обработки Цикл
СтрокаПоиска = "DataProcessors/" + Описание.Имя + "/";
Если СтрНайти(Настройки, СтрокаПоиска) > 0 Тогда
Продолжить;
КонецЕсли;
Результат = Результат + ?(ПустаяСтрока(Результат), "", "," + Символы.ПС) + """" + Описание.Имя + """";
КонецЦикла;
Возврат Результат;
КонецФункции
- список отчетов:
&НаСервереБезКонтекста
Функция ПолучитьОтчетыИсключения(Настройки)
Результат = "";
Для Каждого Описание Из Метаданные.Отчеты Цикл
СтрокаПоиска = "Reports/" + Описание.Имя + "/";
Если СтрНайти(Настройки, СтрокаПоиска) > 0 Тогда
Продолжить;
КонецЕсли;
Результат = Результат + ?(ПустаяСтрока(Результат), "", "," + Символы.ПС) + """" + Описание.Имя + """";
КонецЦикла;
Возврат Результат;
КонецФункции
- список бизнес-процессов:
&НаСервереБезКонтекста
Функция ПолучитьБизнесПроцессыИсключения(Настройки)
Результат = "";
Для Каждого Описание Из Метаданные.БизнесПроцессы Цикл
СтрокаПоиска = "BusinessProcesses/" + Описание.Имя + "/";
Если СтрНайти(Настройки, СтрокаПоиска) > 0 Тогда
Продолжить;
КонецЕсли;
Результат = Результат + ?(ПустаяСтрока(Результат), "", "," + Символы.ПС) + """" + Описание.Имя + """";
КонецЦикла;
Возврат Результат;
КонецФункции
На процедуре УбитьBOM остановимся подробнее. Чтобы файл настройки xUnitParams.json
был корректно обработан Jenkins и Vanessa-Runner, его потребовалось сформировать в кодировке UTF-8 без лидирующих меток порядка байтов (BOM-символы из стандарта Юникод). Для этого была использована доработанная обработка из статьи Андрея Чибидина :
// //infostart.ru/1c/articles/137454/
&НаКлиенте
Процедура УбитьBOM(Знач ИсходныйФайл, РезультирующийФайл, ВременнаяПапка, МассивФайлов = Неопределено)
Если МассивФайлов = Неопределено Тогда
МассивФайлов = Новый Массив;
КонецЕсли;
Бин = Новый ДвоичныеДанные(ИсходныйФайл);
Размер = Бин.Размер();
НовыйРазмер = Макс(Окр(Размер/2,0),3);
Массив = РазделитьФайл(ИсходныйФайл,НовыйРазмер);
Если Массив.Количество() = 2 Тогда
МассивФайлов.Вставить(0,Массив[1]);
КонецЕсли;
Если НовыйРазмер = 3 Тогда
ОбъединитьФайлы(МассивФайлов, РезультирующийФайл);
УдалитьФайлы(ВременнаяПапка);
Иначе
УбитьBOM(Массив[0], РезультирующийФайл, ВременнаяПапка, МассивФайлов);
КонецЕсли;
КонецПроцедуры
Далее помещаем полученный файл настройки в каталог инструмента vanessa-runner, при последующем запуске в Jenkins сценария дымового тестирования будут отработаны выбранные нами операции только для измененных в git-репозитории объектов.