Skip to content

Commit

Permalink
Начальная реалиация вывод сообщений о прохождении тестов xunit в лог-…
Browse files Browse the repository at this point in the history
…файл для возможности передачи в консоль, не дожидаясь завершения сеанса 1С vanessa-opensource/add#75

Добавлен параметр --additional для запуска с ключом xunit fix #214
  • Loading branch information
artbear committed Apr 1, 2018
1 parent 027cb6d commit 28186fa
Showing 1 changed file with 234 additions and 9 deletions.
243 changes: 234 additions & 9 deletions src/Классы/КомандаТестирование_xUnitFor1C.os
Expand Up @@ -43,6 +43,11 @@
| Метаданные.Подсистемы.Тестовая.Подсистемы.Подсистема1
| Метаданные.Обработки.Тест");

Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--workspace",
"
|[env RUNNER_WORKSPACE] путь к папке, относительно которой будут определятся макросы $workspace.
| по умолчанию текущий.");

Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--config-tests",
"[env RUNNER_CONFIG_TESTS] загружать тесты, встроенные в конфигурации в указанную подсистему");

Expand Down Expand Up @@ -74,6 +79,9 @@
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"--reportxunit", "путь к каталогу с отчетом jUnit (устарел)");

Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--additional",
"Дополнительные параметры для запуска предприятия.");

Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--no-wait",
"Не ожидать завершения запущенной команды/действия");

Expand Down Expand Up @@ -115,11 +123,14 @@

Попытка
ЗапуститьТестироватьЮнит(
ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["testsPath"]), ПараметрыОтчетовXUnit,
ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["testsPath"]),
ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--workspace"]),
ПараметрыОтчетовXUnit,
ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--xddExitCodePath"]),
ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--pathxunit"]), ЗапускатьТолстыйКлиент,
ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--xddConfig"]),
ОжидатьЗавершения,
ПараметрыКоманды["--additional"],
ПараметрыКоманды["--config-tests"],
ПараметрыКоманды["--testclient"]
);
Expand All @@ -138,18 +149,23 @@
// Параметры:
// ПутьВходящихДанных - <Строка> - Может принимать путь к каталогу, так и к файлу для тестирования,
// или пути к встроенным тестам
// ВыходнойКаталогОтчета - <Строка> - Путь к каталогу с отчетом, по умолчанию пустой
// РабочийКаталогПроекта - <Строка> - Путь к каталогу с проектом, по умолчанию каталог ./
// ФормируемыеОтчеты - <Структура> - Коллекция описания формирования отчетов тестирования
// ПутьФайлаСтатусаТестирования - <Строка> - путь к файлу статуса тестирования
// ПутьКИнструментам - <Строка> - путь к инструментам, по умолчанию ./tools/xUnitFor1C/xddTestRunner.epf
// ТолстыйКлиент - <Булево> - признак запуска толстого клиента
// ДопПараметры - <Строка> - дополнительные параметры для передачи в параметры запуска 1с, например /DebugURLtcp://localhost
// ЗагружатьВстроенныеТесты - <Булево> - Загружать тесты, встроенные в конфигурацию
// ТестКлиент - <Строка> - Параметры подключения к тест-клиенту
//
Процедура ЗапуститьТестироватьЮнит(Знач ПутьВходящихДанных, Знач ФормируемыеОтчеты,
Процедура ЗапуститьТестироватьЮнит(Знач ПутьВходящихДанных,
Знач РабочийКаталогПроекта,
Знач ФормируемыеОтчеты,
Знач ПутьФайлаСтатусаТестирования,
Знач ПутьКИнструментам = "", Знач ТолстыйКлиент = Ложь,
Знач ПутьККонфигурационномуФайлу,
Знач ОжидатьЗавершения = Истина,
Знач ДопПараметры="",
Знач ЗагружатьВстроенныеТесты = Истина,
Знач ТестКлиент = "")

Expand All @@ -163,6 +179,11 @@
КонецЕсли;

Конфигуратор.УстановитьПризнакОжиданияВыполненияПрограммы(ОжидатьЗавершения);

Если Не ЗначениеЗаполнено(РабочийКаталогПроекта) Тогда
РабочийКаталогПроекта = "./";
КонецЕсли;
РабочийКаталогПроекта = ОбщиеМетоды.ПолныйПуть(РабочийКаталогПроекта);

Если ПустаяСтрока(ПутьКИнструментам) Тогда
ПутьКИнструментам = add.ПутьИнструментаТДД();
Expand Down Expand Up @@ -201,14 +222,70 @@
СтрШаблон(" xddExitCodePath ГенерацияКодаВозврата """"%1"""" ; ", ПутьФайлаСтатусаТестирования);
КонецЕсли;

КлючЗапуска = КлючЗапуска + "xddShutdown;""";

Настройки = ПрочитатьНастройки(ПутьККонфигурационномуФайлу);

ПутьЛогаВыполненияСценариев = ПолучитьНастройку(Настройки, "ИмяФайлаЛогВыполненияСценариев",
"./build/xddonline.txt", РабочийКаталогПроекта, "путь к лог-файлу выполнения");

ОбщиеМетоды.УдалитьФайлЕслиОнСуществует(ПутьФайлаСтатусаТестирования);
ОбщиеМетоды.УдалитьФайлЕслиОнСуществует(ПутьЛогаВыполненияСценариев);

КлючЗапуска = КлючЗапуска + " ; debug ";
КлючЗапуска = КлючЗапуска + " ; workspaceRoot " + РабочийКаталогПроекта;

КлючЗапуска = КлючЗапуска + " ; xddShutdown;""";

Лог.Отладка(КлючЗапуска);

ДополнительныеКлючи = " /Execute""" + ПутьКИнструментам + """ /TESTMANAGER ";

Попытка
Конфигуратор.ЗапуститьВРежимеПредприятия(КлючЗапуска, Не ТолстыйКлиент, ДополнительныеКлючи);
Текст = Конфигуратор.ВыводКоманды();
// Конфигуратор.ЗапуститьВРежимеПредприятия(КлючЗапуска, Не ТолстыйКлиент, ДополнительныеКлючи);
// Текст = Конфигуратор.ВыводКоманды();

ПараметрыСвязиСБазой = Конфигуратор.ПолучитьПараметрыЗапуска();
ПараметрыСвязиСБазой[0] = "ENTERPRISE";
ПараметрыСвязиСБазой.Удалить(2);
ПараметрыСвязиСБазой.Добавить("/C" + КлючЗапуска);

Если ТолстыйКлиент Тогда
ПараметрыСвязиСБазой.Добавить("/RunModeOrdinaryApplication ");
КонецЕсли;

ПутьДамп = ПолучитьИмяВременногоФайла("txt");
ПараметрыСвязиСБазой.Добавить("/out""" + ПутьДамп + """");

Если ДополнительныеКлючи <> Неопределено Тогда
ПараметрыСвязиСБазой.Добавить(ДополнительныеКлючи);
КонецЕсли;

СтрокаЗапуска = ""; СтрокаДляЛога = "";
Для Каждого Параметр Из ПараметрыСвязиСБазой Цикл
СтрокаЗапуска = СтрокаЗапуска + " " + Параметр;
Если Лев(Параметр, 2) <> "/P" И Лев(Параметр, 25) <> "/ConfigurationRepositoryP" Тогда
СтрокаДляЛога = СтрокаДляЛога + " " + Параметр;
КонецЕсли;
КонецЦикла;
СтрокаЗапуска = СтрокаЗапуска + ДопПараметры;

Приложение = Конфигуратор.ПутьКТонкомуКлиенту1С();
Если ТолстыйКлиент Тогда
Приложение = Конфигуратор.ПутьКПлатформе1С();
КонецЕсли;

Если Найти(Приложение, " ") > 0 Тогда
Приложение = ОбщиеМетоды.ОбернутьПутьВКавычки(Приложение);
КонецЕсли;
Приложение = Приложение + " " + СтрокаЗапуска;
Лог.Отладка(Приложение);

Попытка
ЗапуститьПроцессВанессы(Приложение, ОжидатьЗавершения, ПутьЛогаВыполненияСценариев );
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;

Текст = ОбщиеМетоды.ПрочитатьФайлИнформации(ПутьДамп);
Если Не ПустаяСтрока(Текст) Тогда
Лог.Информация(Текст);
КонецЕсли;
Expand All @@ -226,7 +303,6 @@
ВызватьИсключение "ЗапуститьТестироватьЮнит";
КонецПопытки;


Лог.Информация("Выполнение тестов завершено");

КонецПроцедуры // ЗапуститьТестироватьЮнит()
Expand Down Expand Up @@ -273,4 +349,153 @@
Если ЕстьОшибка Тогда
ВызватьИсключение СообщениеОшибки;
КонецЕсли;
КонецПроцедуры
КонецПроцедуры

// TODO Устранить дублирование с КомандаТестированиеПоведения
Процедура ЗапуститьПроцессВанессы(Знач СтрокаЗапуска, Знач ОжидатьЗавершения, Знач ПутьКФайлуЛога)

ПериодОпросаВМиллисекундах = 1000;

НадоЧитатьЛог = Истина;
КолСтрокЛогаПрочитано = 0;

Процесс = СоздатьПроцесс(СтрокаЗапуска);
Процесс.Запустить();

Если ОжидатьЗавершения Тогда

Приостановить(500);
// Приостановить(10000);

Пока НЕ Процесс.Завершен Цикл
Если ПериодОпросаВМиллисекундах <> 0 Тогда
Приостановить(ПериодОпросаВМиллисекундах);
КонецЕсли;

ОчереднаяСтрокаВывода = "";
ОчереднаяСтрокаОшибок = "";

Если Не ПустаяСтрока(ОчереднаяСтрокаВывода) Тогда
ОчереднаяСтрокаВывода = СтрЗаменить(ОчереднаяСтрокаВывода, Символы.ВК, "");
Если ОчереднаяСтрокаВывода <> "" Тогда
Лог.Информация("%2%1", ОчереднаяСтрокаВывода, Символы.ПС);
КонецЕсли;
КонецЕсли;

Если Не ПустаяСтрока(ОчереднаяСтрокаОшибок) Тогда
ОчереднаяСтрокаОшибок = СтрЗаменить(ОчереднаяСтрокаОшибок, Символы.ВК, "");
Если ОчереднаяСтрокаОшибок <> "" Тогда
Лог.Ошибка("%2%1", ОчереднаяСтрокаОшибок, Символы.ПС);
КонецЕсли;
КонецЕсли;

Если НадоЧитатьЛог Тогда
ВывестиНовыеСообщения(ПутьКФайлуЛога, КолСтрокЛогаПрочитано);
КонецЕсли;

КонецЦикла;
КонецЕсли;

КонецПроцедуры //ЗапуститьПроцессВанессы

// TODO Устранить дублирование с КомандаТестированиеПоведения
Процедура ВывестиНовыеСообщения(ИмяФайлаЛога, КолСтрокЛогаПрочитано)
Попытка
МассивСтрок = ПолучитьНовыеСтрокиЛога(ИмяФайлаЛога, КолСтрокЛогаПрочитано);
Для Каждого Стр Из МассивСтрок Цикл
Если СокрЛП(Стр) = "" Тогда
Продолжить;
КонецЕсли;
Лог.Информация(СокрЛП(Стр));
КонецЦикла;
Исключение
Лог.Ошибка(ОписаниеОшибки());
КонецПопытки;

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

// TODO Устранить дублирование с КомандаТестированиеПоведения
Функция ПолучитьНовыеСтрокиЛога(Знач ИмяФайла, КолСтрокЛогаПрочитано)
Файл = Новый Файл(ИмяФайла);
Если Не Файл.Существует() Тогда
Возврат Новый Массив;
КонецЕсли;

Текст = Новый ЧтениеТекста;
Текст.Открыть(ИмяФайла, "UTF-8");

ВесьТекст = Текст.Прочитать();

Текст.Закрыть();

Массив = Новый Массив();

МассивСтрок = СтрРазделить(ВесьТекст, Символы.ПС, Истина);
Если МассивСтрок[МассивСтрок.Количество() - 1] = "" Тогда
МассивСтрок.Удалить(МассивСтрок.Количество() - 1);
КонецЕсли;

Для Ккк = (КолСтрокЛогаПрочитано + 1) По МассивСтрок.Количество() Цикл
Массив.Добавить(МассивСтрок[Ккк-1]);
КонецЦикла;

КолСтрокЛогаПрочитано = МассивСтрок.Количество();

Возврат Массив;
КонецФункции //ПолучитьНовыеСтрокиЛога

Функция ПрочитатьНастройки(Знач ПутьКНастройкам)
Рез = Неопределено;

Если Не ПустаяСтрока(ПутьКНастройкам) Тогда
Лог.Отладка("Читаю настройки из файла %1", ПутьКНастройкам);

ФайлНастроек = Новый Файл(ОбщиеМетоды.ПолныйПуть(ПутьКНастройкам));
СообщениеОшибки = СтрШаблон("Ожидали, что файл настроек %1 существует, а его нет.");
Ожидаем.Что(ФайлНастроек.Существует(), СообщениеОшибки).ЭтоИстина();

ЧтениеТекста = Новый ЧтениеТекста(ФайлНастроек.ПолноеИмя, КодировкаТекста.UTF8);

СтрокаJSON = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();

ПарсерJSON = Новый ПарсерJSON();
Рез = ПарсерJSON.ПрочитатьJSON(СтрокаJSON);

Лог.Отладка("Успешно прочитали настройки");
Лог.Отладка("Настройки из файла:");
Для каждого КлючЗначение Из Рез Цикл
Лог.Отладка(" %1 = %2", КлючЗначение.Ключ, КлючЗначение.Значение);
КонецЦикла;
Иначе
Лог.Отладка("Файл настроек не передан. Использую значение по умолчанию.");
КонецЕсли;
Возврат Рез;
КонецФункции

Функция ПолучитьНастройку(Знач Настройки, Знач ИмяНастройки, Знач ЗначениеПоУмолчанию,
Знач РабочийКаталогПроекта, Знач ОписаниеНастройки, Знач ПолучатьПолныйПуть = Истина)

Рез = ЗначениеПоУмолчанию;
Если Настройки <> Неопределено Тогда
Рез_Врем = Настройки.Получить(ИмяНастройки);
Если Рез_Врем <> Неопределено Тогда
Лог.Отладка(" Ключ %1, Значение %2", ИмяНастройки, Рез_Врем);

Рез = Заменить_workspaceRoot_на_РабочийКаталогПроекта(Рез_Врем, РабочийКаталогПроекта);

Лог.Отладка("В настройках нашли %1 %2", ОписаниеНастройки, Рез);
КонецЕсли;
КонецЕсли;
Лог.Отладка("Использую %1 %2", ОписаниеНастройки, Рез);

Если ПолучатьПолныйПуть Тогда
Рез = ОбщиеМетоды.ПолныйПуть(Рез);
Лог.Отладка("Использую %1 (полный путь) %2", ОписаниеНастройки, Рез);
КонецЕсли;
Возврат Рез;
КонецФункции

Функция Заменить_workspaceRoot_на_РабочийКаталогПроекта(Знач ИсходнаяСтрока, Знач РабочийКаталогПроекта)
Возврат СтрЗаменить(ИсходнаяСтрока, "$workspaceRoot", РабочийКаталогПроекта);
КонецФункции

0 comments on commit 28186fa

Please sign in to comment.