diff --git a/docs/readme.md b/docs/readme.md index 726ad8e..5aca724 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -70,7 +70,7 @@ - Если переданная строка используется не как путь, тогда ищется полное соответствие строки и ключа контекста - Например, если есть переменная контекста `СпециальнаяПеременная` - - тогда строка `СпециальнаяПеременная` будет подменена на значение из контекста, + - тогда строка `СпециальнаяПеременная` будет подменена на значение из контекста, - а строка `Текст СпециальнаяПеременная` уже не будет заменена. Программное API описано в [API подстановки переменных из контекста в строках и путях к файлам](#api-подстановки-переменных-из-контекста-в-строках-и-путях-к-файлам) @@ -185,13 +185,24 @@ - `Тогда Файл "СпециальныйКаталог/ФайлСТекстом.txt" содержит "178"` - `Когда Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" с текстом` +- `Тогда я показываю текст файла "СпециальныйКаталог/ФайлСТекстом.txt"` +- `И я показываю 2 строки файла "СпециальныйКаталог/ФайлСТекстом.txt"` +- `Тогда Файл "folder0/file01.txt" содержит "Текст файла"` +- `И Файл "folder0/file01.txt" не содержит "Не существующий текст"` + +- `Тогда Файл "folder0/file01.txt" в рабочем каталоге содержит "Текст файла"` +- `И Файл "folder0/file01.txt" в рабочем каталоге не содержит "Не существующий текст"` + +Пример шагов: ```gherkin Когда Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" с текстом """ строка 1 строка 2 """ + Тогда я показываю текст файла "СпециальныйКаталог/ФайлСТекстом.txt" + И я показываю 2 строки файла "СпециальныйКаталог/ФайлСТекстом.txt" Тогда Файл "СпециальныйКаталог/ФайлСТекстом.txt" содержит """ строка 1 @@ -199,12 +210,6 @@ """ ``` -- `Тогда Файл "folder0/file01.txt" содержит "Текст файла"` -- `И Файл "folder0/file01.txt" не содержит "Не существующий текст"` - -- `Тогда Файл "folder0/file01.txt" в рабочем каталоге содержит "Текст файла"` -- `И Файл "folder0/file01.txt" в рабочем каталоге не содержит "Не существующий текст"` - #### Копирование файлов и каталогов @@ -225,7 +230,7 @@ - `Тогда Каталог "СпециальныйКаталог/folder0" существует` - или `Тогда Каталог "СпециальныйКаталог/folder0/folder01" существует` - + - `И Каталог "СпециальныйКаталог/folder0/folder01-unknown" не существует` - `Тогда Файл "СпециальныйКаталог/file01.txt" существует` @@ -292,7 +297,7 @@ ### Подготовка рабочего каталога и тестовой ИБ - `я подготовил репозиторий и рабочий каталог проекта` - + фактически выполняются следующие шаги - `Дано я выключаю отладку лога с именем "oscript.app.vanessa-runner"` - `И Я очищаю параметры команды "oscript" в контексте` @@ -303,14 +308,14 @@ - `И Я сохраняю каталог проекта в контекст` - `я подготовил рабочую базу проекта "./build/ib" по умолчанию` - + фактически выполняются следующие шаги - `я подготовил репозиторий и рабочий каталог проекта` - шаг расшифрован выше - `И Я копирую каталог "cf" из каталога "tests/fixtures" проекта в рабочий каталог` - `Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os init-dev --src ./cf --nocacheuse --ibconnection /F%1"` - где `%1` заменяется на путь к ИБ, указанный в параметре шага "./build/ib" - `Я очищаю параметры команды "oscript" в контексте` - + - `я инициализирую репозиторий git в рабочем каталоге` ### Сборка пакета @@ -404,7 +409,7 @@ // Важно: проверяется только полное совпадение строки и имени переменной контекста, частичное вхождение не проверяется! // // Параметры: -// Значение - Любой тип - +// Значение - Любой тип - // // Возвращаемое значение: // Любой тип - результат выполнения @@ -425,7 +430,7 @@ // Если переменной контекста нет или задан обычный путь файла, возвращается переданное значение без изменения // // Важно: подменяется только первый элемент пути, в середине и конце пути подмены не делается -// +// // Финальные разделители строк устанавливаются в зависимости от ОС // // Параметры: diff --git a/features/core/junit-xml.feature b/features/core/junit-xml.feature index 25667d5..24115ed 100644 --- a/features/core/junit-xml.feature +++ b/features/core/junit-xml.feature @@ -13,13 +13,13 @@ Тогда проверка поведения фичи "БезПараметров" с передачей параметра "-junit-out ./test-report.xml" закончилась с кодом возврата 0 И файл "./test-report.xml" существует - И файл "./test-report.xml" содержит xml + И файл "./test-report.xml" содержит """ - - - + + + """ @@ -28,33 +28,33 @@ Тогда проверка поведения фичи "ПадающийШаг" с передачей параметра "-junit-out ./test-report.xml" закончилась с кодом возврата 2 И файл "./test-report.xml" существует - И файл "./test-report.xml" содержит xml + И файл "./test-report.xml" содержит """ - + + ; ВызватьИсключение СтрШаблон("ЯЗапускаюПадающийШагСПараметром-%1", ПарамСтрока); "/> """ Сценарий: Получение отчета в формате JUnit-xml для нереализованного теста Тогда проверка поведения фичи "НеРеализованныйШаг" с передачей параметра "-junit-out ./test-report.xml" закончилась с кодом возврата 1 И файл "./test-report.xml" существует - И файл "./test-report.xml" содержит xml + И файл "./test-report.xml" содержит """ - - + + """ diff --git "a/features/core/\320\237\320\276\320\272\320\260\320\267\320\236\321\210\320\270\320\261\320\276\321\207\320\275\321\213\321\205\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\265\320\262\320\237\320\276\321\201\320\273\320\265\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\244\320\270\321\207.feature" "b/features/core/\320\237\320\276\320\272\320\260\320\267\320\236\321\210\320\270\320\261\320\276\321\207\320\275\321\213\321\205\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\265\320\262\320\237\320\276\321\201\320\273\320\265\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\244\320\270\321\207.feature" new file mode 100644 index 0000000..8390b95 --- /dev/null +++ "b/features/core/\320\237\320\276\320\272\320\260\320\267\320\236\321\210\320\270\320\261\320\276\321\207\320\275\321\213\321\205\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\265\320\262\320\237\320\276\321\201\320\273\320\265\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\244\320\270\321\207.feature" @@ -0,0 +1,27 @@ +# language: ru + +Функционал: Выполнение фич + Как Разработчик + Я Хочу видеть ошибочные сценарии в конце лога выполнения + +Сценарий: Показ имени сценария, в котором есть нереализованный шаг + Когда я подготовил тестовый каталог для фич + И установил тестовый каталог как текущий + И я создал файл фичи "НесуществующийШаг" с текстом + """ + # language: ru + Функционал: Просто функционал + Сценарий: Просто сценарий + Тогда выполняется несуществующий шаг + """ + + Тогда проверка поведения фичи "НесуществующийШаг" закончилась с кодом возврата 1 + И в лог-файле запуска продукта есть строка + """ + Проблемные сценарии: + Функциональность Просто функционал + Сценарий Просто сценарий + Шаг выполняется несуществующий шаг - Не реализован + """ + И в лог-файле запуска продукта есть строка "1 Сценарий ( 0 Пройден, 1 Не реализован, 0 Сломался, 0 Не выполнялся )" + И в лог-файле запуска продукта есть строка "1 Шаг ( 0 Пройден, 1 Не реализован, 0 Сломался, 0 Не выполнялся )" diff --git a/features/lib/step_definitions/opm-build.os b/features/lib/step_definitions/opm-build.os index 72e13fc..0ed227d 100644 --- a/features/lib/step_definitions/opm-build.os +++ b/features/lib/step_definitions/opm-build.os @@ -70,9 +70,10 @@ ВерсияСобранногоПакета = СокрЛП(ВерсияСобранногоПакета); - СообщениеОшибки = СтрШаблон("Ожидали, что установленная версия <%1> равна версии из исходников проекта"); - Если УстановленнаяВерсияПакета <> ВерсияСобранногоПакета И - Найти(УстановленнаяВерсияПакета, ВерсияСобранногоПакета) = Неопределено Тогда + СообщениеОшибки = СтрШаблон("Ожидали, что установленная версия <%1> равна версии из исходников проекта", + УстановленнаяВерсияПакета); + Если УстановленнаяВерсияПакета <> ВерсияСобранногоПакета + И Найти(УстановленнаяВерсияПакета, ВерсияСобранногоПакета) = Неопределено Тогда ВызватьИсключение СообщениеОшибки; diff --git "a/features/lib/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264.os" "b/features/lib/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264.os" index 9fe09e7..8f56c2d 100644 --- "a/features/lib/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264.os" +++ "b/features/lib/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264.os" @@ -446,23 +446,24 @@ КонецПроцедуры Функция ЭтоКомандаОСкрипт(Знач Команда) + Результат = Ложь; + СТРОКА_OSCRIPT = "oscript"; ПутьПриложения = СокрЛП(Команда.ПолучитьКоманду()); - ЗапускаемСкриптОСкрипт = Ложь; Если НРег(ПутьПриложения) = СТРОКА_OSCRIPT Тогда - ЗапускаемСкриптОСкрипт = Истина; + Результат = Истина; Иначе Если Найти(НРег(ПутьПриложения), СТРОКА_OSCRIPT) = 1 Тогда - ЗапускаемСкриптОСкрипт = Истина; + Результат = Истина; Иначе ФайлПриложения = Новый Файл(ПутьПриложения); Если НРег(ФайлПриложения.ИмяБезРасширения) = СТРОКА_OSCRIPT Тогда - ЗапускаемСкриптОСкрипт = Истина; + Результат = Истина; КонецЕсли; КонецЕсли; КонецЕсли; - Возврат ЗапускаемСкриптОСкрипт; -КонецФункции // ЭтоКомандаОСкрипт() + Возврат Результат; +КонецФункции Функция ЗаданПараметрСтатистикиДляКомандыОСкрипт(Знач Команда, Знач КомандаСтатистики) КомандаСтатистики = НРег(КомандаСтатистики); @@ -473,7 +474,7 @@ КонецЕсли; КонецЦикла; Возврат Ложь; -КонецФункции // ЗаданПараметрСтатистикиДляКомандыОСкрипт() +КонецФункции Процедура ПроверитьРавенство(Знач Значение1, Знач Значение2, Знач ПроверятьРавенство, Знач СообщениеОшибки) Значение1 = БДД.ЗначениеСУчетомПеременныхКонтекста(Значение1); diff --git "a/features/lib/step_definitions/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/features/lib/step_definitions/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.os" index 24e2c41..ac9e46b 100644 --- "a/features/lib/step_definitions/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.os" +++ "b/features/lib/step_definitions/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -52,9 +52,10 @@ ВсеШаги.Добавить("ФайлВРабочемКаталогеСодержит"); ВсеШаги.Добавить("ФайлВРабочемКаталогеНеСодержит"); ВсеШаги.Добавить("ФайлСодержит"); - ВсеШаги.Добавить("ФайлСодержитXml"); ВсеШаги.Добавить("ФайлНеСодержит"); ВсеШаги.Добавить("ЯСоздаюФайлСТекстом"); + ВсеШаги.Добавить("ЯПоказываюТекстФайла"); + ВсеШаги.Добавить("ЯПоказываюСтрокиФайла"); Возврат ВсеШаги; КонецФункции @@ -141,7 +142,7 @@ Процедура ЯСоздаюФайлВнутриКаталога(Знач ПутьФайла, Знач ПутьКаталога) Экспорт ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); ПутьКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьКаталога); - + НовыйПуть = ОбъединитьПути(ПутьКаталога, ПутьФайла); СоздатьФайлПример(НовыйПуть); КонецПроцедуры @@ -150,20 +151,20 @@ Процедура ЯКопируюФайлИзКаталогаПроектаВРабочийКаталог(Знач ПутьФайла, Знач ПодКаталогПроекта) Экспорт ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); ПодКаталогПроекта = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПодКаталогПроекта); - + ПолныйПутьФайла = ОбъединитьПути(БДД.КаталогПроверяемогоПроекта(), ПодКаталогПроекта, ПутьФайла); Файл = Новый Файл(ПолныйПутьФайла); КопироватьФайл(ПолныйПутьФайла, ОбъединитьПути(РабочийКаталог(), Файл.Имя)); КонецПроцедуры //Я копирую файл "fixture.epf" из каталога "tests" проекта в подкаталог "folder0" рабочего каталога -Процедура ЯКопируюФайлИзКаталогаПроектаВПодкаталогРабочегоКаталога(Знач ПутьФайла, Знач ПодКаталогПроекта, +Процедура ЯКопируюФайлИзКаталогаПроектаВПодкаталогРабочегоКаталога(Знач ПутьФайла, Знач ПодКаталогПроекта, Знач ПутьПодКаталога) Экспорт ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); ПодКаталогПроекта = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПодКаталогПроекта); ПутьПодКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьПодКаталога); - + ПолныйПутьФайла = ОбъединитьПути(БДД.КаталогПроверяемогоПроекта(), ПодКаталогПроекта, ПутьФайла); Файл = Новый Файл(ПолныйПутьФайла); КопироватьФайл(ПолныйПутьФайла, ОбъединитьПути(РабочийКаталог(), ПутьПодКаталога, Файл.Имя)); @@ -182,7 +183,7 @@ КонецПроцедуры //Я копирую каталог "fixtures" из каталога "tests" проекта в подкаталог "folder0" рабочего каталога -Процедура ЯКопируюКаталогИзКаталогаПроектаВПодкаталогРабочегоКаталога(Знач ПутьНовогоКаталога, Знач ПодКаталогПроекта, +Процедура ЯКопируюКаталогИзКаталогаПроектаВПодкаталогРабочегоКаталога(Знач ПутьНовогоКаталога, Знач ПодКаталогПроекта, Знач ПутьПодКаталога) Экспорт ПутьНовогоКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьНовогоКаталога); @@ -191,7 +192,7 @@ ПолныйПутьКаталога = ОбъединитьПути(БДД.КаталогПроверяемогоПроекта(), ПодКаталогПроекта, ПутьНовогоКаталога); ОбъектКаталога = Новый Файл(ПолныйПутьКаталога); - + ПутьНовогоКаталога = ОбъединитьПути(РабочийКаталог(), ПутьПодКаталога, ОбъектКаталога.Имя); ФС.ОбеспечитьКаталог(ПутьНовогоКаталога); ФС.КопироватьСодержимоеКаталога(ПолныйПутьКаталога, ПутьНовогоКаталога); @@ -208,7 +209,7 @@ Процедура ВПодкаталогеРабочегоКаталогаСуществуетКаталог(Знач ПутьПодКаталога, Знач ПутьПроверяемогоКаталога) Экспорт ПутьПодКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьПодКаталога); ПолныйПуть = ""; - ФайлСуществует = ФайлИлиКаталогСуществует(ПутьПроверяемогоКаталога, ПолныйПуть, Истина, + ФайлСуществует = ФайлИлиКаталогСуществует(ПутьПроверяемогоКаталога, ПолныйПуть, Истина, ОбъединитьПути(РабочийКаталог(), ПутьПодКаталога)); Ожидаем.Что(ФайлСуществует, СтрШаблон("Ожидаем, что каталог <%1> существует, а его нет!", ПолныйПуть)).ЭтоИстина(); КонецПроцедуры @@ -224,7 +225,7 @@ Процедура ВПодкаталогеРабочегоКаталогаСуществуетФайл(Знач ПутьПодКаталога, Знач ПутьФайла) Экспорт ПутьПодКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьПодКаталога); ПолныйПуть = ""; - ФайлСуществует = ФайлИлиКаталогСуществует(ПутьФайла, ПолныйПуть, Ложь, + ФайлСуществует = ФайлИлиКаталогСуществует(ПутьФайла, ПолныйПуть, Ложь, ОбъединитьПути(РабочийКаталог(), ПутьПодКаталога)); Ожидаем.Что(ФайлСуществует, СтрШаблон("Ожидаем, что файл <%1> существует, а его нет!", ПолныйПуть)).ЭтоИстина(); КонецПроцедуры @@ -261,7 +262,7 @@ Процедура КаталогВнутриКаталогаСуществует(Знач ПутьПроверяемогоКаталога, Знач ПутьПодКаталога) Экспорт ПутьПодКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьПодКаталога); ПолныйПуть = ""; - ФайлСуществует = ФайлИлиКаталогСуществует(ПутьПроверяемогоКаталога, ПолныйПуть, Истина, + ФайлСуществует = ФайлИлиКаталогСуществует(ПутьПроверяемогоКаталога, ПолныйПуть, Истина, ОбъединитьПути(РабочийКаталог(), ПутьПодКаталога)); Ожидаем.Что(ФайлСуществует, СтрШаблон("Ожидаем, что каталог <%1> существует, а его нет!", ПолныйПуть)).ЭтоИстина(); КонецПроцедуры @@ -270,7 +271,7 @@ Процедура КаталогВнутриКаталогаНеСуществует(Знач ПутьПроверяемогоКаталога, Знач ПутьПодКаталога) Экспорт ПутьПодКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьПодКаталога); ПолныйПуть = ""; - ФайлСуществует = ФайлИлиКаталогСуществует(ПутьПроверяемогоКаталога, ПолныйПуть, Истина, + ФайлСуществует = ФайлИлиКаталогСуществует(ПутьПроверяемогоКаталога, ПолныйПуть, Истина, ОбъединитьПути(РабочийКаталог(), ПутьПодКаталога)); Ожидаем.Что(ФайлСуществует, СтрШаблон("Ожидаем, что каталога <%1> нет, а он существует!", ПолныйПуть)).ЭтоЛожь(); КонецПроцедуры @@ -279,7 +280,7 @@ Процедура ФайлВнутриКаталогаСуществует(Знач ПутьФайла, Знач ПутьКаталога) Экспорт ПутьКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьКаталога); ПолныйПуть = ""; - ФайлСуществует = ФайлИлиКаталогСуществует(ПутьФайла, ПолныйПуть, Ложь, + ФайлСуществует = ФайлИлиКаталогСуществует(ПутьФайла, ПолныйПуть, Ложь, ОбъединитьПути(РабочийКаталог(), ПутьКаталога)); Ожидаем.Что(ФайлСуществует, СтрШаблон("Ожидаем, что файл <%1> существует, а его нет!", ПолныйПуть)).ЭтоИстина(); КонецПроцедуры @@ -288,7 +289,7 @@ Процедура ФайлВнутриКаталогаНеСуществует(Знач ПутьФайла, Знач ПутьКаталога) Экспорт ПутьКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьКаталога); ПолныйПуть = ""; - ФайлСуществует = ФайлИлиКаталогСуществует(ПутьФайла, ПолныйПуть, Ложь, + ФайлСуществует = ФайлИлиКаталогСуществует(ПутьФайла, ПолныйПуть, Ложь, ОбъединитьПути(РабочийКаталог(), ПутьКаталога)); Ожидаем.Что(ФайлСуществует, СтрШаблон("Ожидаем, что файла <%1> нет, а он существует!", ПолныйПуть)).ЭтоЛожь(); КонецПроцедуры @@ -304,7 +305,7 @@ ИсходныйКаталог = ТекущийКаталог(); КонецЕсли; Лог.Отладка("Установили ИсходныйКаталог %1", ИсходныйКаталог); - + ПутьФайла = ЗаменитьШаблоныВПараметрахКоманды(ПутьФайла); ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); @@ -312,7 +313,7 @@ РегулярноеВыражение = Новый РегулярноеВыражение("[\*,\?]"); ПутьБезРегулярок = Не РегулярноеВыражение.Совпадает(ПутьФайла); - + Лог.Отладка("ПутьБезРегулярок %1", ПутьБезРегулярок); Рез = Ложь; @@ -328,7 +329,7 @@ Лог.Отладка("новый Рез %1 | ЭтоКаталог И Объект.ЭтоКаталог() Или Не ЭтоКаталог И Не Объект.ЭтоКаталог()", Рез); КонецЕсли; - Иначе + Иначе Попытка МассивФайлов = НайтиФайлы(ИсходныйКаталог, ПутьФайла); Рез = МассивФайлов.Количество() > 0; @@ -362,7 +363,7 @@ Процедура ЯУстановилПодкаталогРабочегоКаталогаКакТекущийКаталог(Знач ПутьКаталога) Экспорт ПутьКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьКаталога); ПолныйПутьКаталога = ОбъединитьПути(РабочийКаталог(), ПутьКаталога); - + СтекТекущихКаталогов = ПолучитьСтекТекущихКаталогов(); СтекТекущихКаталогов.Вставить(0, ТекущийКаталог()); @@ -375,7 +376,7 @@ Если Не ЗначениеЗаполнено(СтекТекущихКаталогов) Тогда ВызватьИсключение "Невозможно восстановить каталог, т.к. стек текущих каталогов пуст"; КонецЕсли; - + УстановитьТекущийКаталог(СтекТекущихКаталогов[0]); СтекТекущихКаталогов.Удалить(0); КонецПроцедуры @@ -407,7 +408,7 @@ ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); ПутьФайла = ЗаменитьШаблоныВПараметрахКоманды(ПутьФайла); - Файл = Новый Файл(ОбъединитьПути(РабочийКаталог(), ПутьФайла)); + Файл = Новый Файл(ОбъединитьПути(РабочийКаталог(), ПутьФайла)); ПроверитьСодержимоеФайла(Файл, ЧтоИщем); КонецПроцедуры @@ -416,7 +417,7 @@ ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); ПутьФайла = ЗаменитьШаблоныВПараметрахКоманды(ПутьФайла); - Файл = Новый Файл(ОбъединитьПути(РабочийКаталог(), ПутьФайла)); + Файл = Новый Файл(ОбъединитьПути(РабочийКаталог(), ПутьФайла)); ПроверитьОтсутствиеВФайле(Файл, ЧтоИщем); КонецПроцедуры @@ -425,7 +426,7 @@ ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); ПутьФайла = ЗаменитьШаблоныВПараметрахКоманды(ПутьФайла); - Файл = Новый Файл(ОбъединитьПути(ТекущийКаталог(), ПутьФайла)); + Файл = Новый Файл(ОбъединитьПути(ТекущийКаталог(), ПутьФайла)); ПроверитьСодержимоеФайла(Файл, ЧтоИщем); КонецПроцедуры @@ -434,7 +435,7 @@ ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); ПутьФайла = ЗаменитьШаблоныВПараметрахКоманды(ПутьФайла); - Файл = Новый Файл(ОбъединитьПути(ТекущийКаталог(), ПутьФайла)); + Файл = Новый Файл(ОбъединитьПути(ТекущийКаталог(), ПутьФайла)); ПроверитьСодержимоеФайлаXml(Файл, ЧтоИщем); КонецПроцедуры @@ -443,7 +444,7 @@ ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); ПутьФайла = ЗаменитьШаблоныВПараметрахКоманды(ПутьФайла); - Файл = Новый Файл(ОбъединитьПути(ТекущийКаталог(), ПутьФайла)); + Файл = Новый Файл(ОбъединитьПути(ТекущийКаталог(), ПутьФайла)); ПроверитьОтсутствиеВФайле(Файл, ЧтоИщем); КонецПроцедуры @@ -465,6 +466,31 @@ ЗаписьТекста.Закрыть(); КонецПроцедуры +//я показываю текст файла "СпециальныйКаталог/ФайлСТекстом.txt" +Процедура ЯПоказываюТекстФайла(Знач ПутьФайла) Экспорт + + Файл = ФайлПоПути(ПутьФайла); + + ТекстФайла = ПрочитатьТекстФайла(Файл); + //ТекстФайла = ЗаменитьШаблоныВПараметрахКоманды(ТекстФайла); + Сообщить(ТекстФайла); + +КонецПроцедуры + +//я показываю 2 строки файла "СпециальныйКаталог/ФайлСТекстом.txt" +Процедура ЯПоказываюСтрокиФайла(Знач КоличествоСтрок, Знач ПутьФайла) Экспорт + + Файл = ФайлПоПути(ПутьФайла); + ТекстФайла = ПрочитатьТекстФайла(Файл); + //ТекстФайла = ЗаменитьШаблоныВПараметрахКоманды(ТекстФайла); + ВыводимыйТекст = ""; + Для Сч = 1 По КоличествоСтрок Цикл + ВыводимыйТекст = ВыводимыйТекст + Символы.ПС + СтрПолучитьСтроку(ТекстФайла, Сч); + КонецЦикла; + Сообщить(ВыводимыйТекст); + +КонецПроцедуры + //{ Служебные методы Функция РабочийКаталог() Возврат БДД.ПолучитьИзКонтекста("РабочийКаталог"); @@ -493,7 +519,7 @@ Строка = ЧтениеТекста.Прочитать(); ЧтениеТекста.Закрыть(); Возврат Строка; -КонецФункции // ПрочитатьТекстФайла() +КонецФункции Процедура ПроверитьСодержимоеФайла(Знач Файл, Знач ЧтоИщем) ТекстФайла = ПрочитатьТекстФайла(Файл); @@ -524,6 +550,13 @@ Ожидаем.Что(ТекстФайла, ОписаниеОшибки).Не_().Содержит(ЧтоИщем); КонецПроцедуры +Функция ФайлПоПути(Знач ПутьФайла) + ПутьФайла = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ПутьФайла); + ПутьФайла = ЗаменитьШаблоныВПараметрахКоманды(ПутьФайла); + + Возврат Новый Файл(ОбъединитьПути(РабочийКаталог(), ПутьФайла)); +КонецФункции + Процедура УдалитьФайлИлиКаталог(Знач Путь) Экспорт Путь = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(Путь); Путь = ЗаменитьШаблоныВПараметрахКоманды(Путь); @@ -533,7 +566,7 @@ КонецЕсли; КонецПроцедуры -// TODO исключить дублирование ЗаменитьШаблоныВПараметрахКоманды из 1bdd +// TODO исключить дублирование ЗаменитьШаблоныВПараметрахКоманды из 1bdd Функция ЗаменитьШаблоныВПараметрахКоманды(Знач ПараметрыКоманды) КаталогПроекта = БДД.КаталогПроверяемогоПроекта(); РабочийКаталог = РабочийКаталог(); @@ -543,7 +576,7 @@ Рез = СтрЗаменить(Рез, "<КаталогПроектаДвойныеСлеши>", ЗаменитьСлешиНаДвойныеСлеши(КаталогПроекта)); Рез = СтрЗаменить(Рез, "<РабочийКаталогДвойныеСлеши>", ЗаменитьСлешиНаДвойныеСлеши(РабочийКаталог)); - + Рез = СтрЗаменить(Рез, "<КаталогПроектаПрямыеСлеши>", ЗаменитьСлешиНаПрямыеСлеши(КаталогПроекта)); Рез = СтрЗаменить(Рез, "<РабочийКаталогПрямыеСлеши>", ЗаменитьСлешиНаПрямыеСлеши(РабочийКаталог)); Возврат Рез; @@ -551,12 +584,12 @@ Функция ЗаменитьСлешиНаДвойныеСлеши(Знач Строка) Рез = СтрЗаменить(Строка, "\", "\\"); - Возврат Рез; + Возврат Рез; КонецФункции Функция ЗаменитьСлешиНаПрямыеСлеши(Знач Строка) Рез = СтрЗаменить(Строка, "\", "/"); - Возврат Рез; + Возврат Рез; КонецФункции //} diff --git "a/features/lib/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.feature" "b/features/lib/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.feature" index be75f6a..2c62ec1 100644 --- "a/features/lib/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.feature" +++ "b/features/lib/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.feature" @@ -6,7 +6,7 @@ Чтобы я мог проще протестировать и автоматизировать больше действий на OneScript # Инициализация рабочего каталога и создание каталогов -Контекст: +Контекст: # Дано я включаю отладку лога с именем "bdd.tests" Допустим Я создаю временный каталог и сохраняю его в контекст И Я устанавливаю временный каталог как рабочий каталог @@ -53,10 +53,10 @@ Когда Я создаю файл "СпециальныйКаталог/file01.txt" Тогда Файл "СпециальныйКаталог/file01.txt" существует И Файл "folder01/file01-unknown.txt" не существует - + Когда Я создаю файл "folder1/file11.txt" внутри каталога "СпециальныйКаталог" Тогда Файл "СпециальныйКаталог/folder1/file11.txt" существует - + И Файл "file01.txt" внутри каталога "СпециальныйКаталог" существует И Файл "folder1/file11.txt" внутри каталога "СпециальныйКаталог" существует И Файл "folder1/file01-unknown.txt" внутри каталога "СпециальныйКаталог" не существует @@ -71,7 +71,7 @@ Сценарий: Копирование каталогов Когда Я копирую каталог "fixtures/step_definitions" из каталога "tests/fixtures" проекта в рабочий каталог И Я копирую каталог "fixtures/step_definitions" из каталога "tests" проекта в подкаталог "folder0/folder01" рабочего каталога - + Тогда В рабочем каталоге существует каталог "step_definitions" И В подкаталоге "folder0/folder01" рабочего каталога существует каталог "step_definitions" @@ -112,7 +112,7 @@ Сценарий: Анализ текста файлов в рабочем каталоге Тогда Файл "folder0/file01.txt" в рабочем каталоге содержит "Текст файла" И Файл "folder0/file01.txt" в рабочем каталоге не содержит "Не существующий текст" - + Сценарий: Анализ текста файлов в текущем каталоге Когда Я установил рабочий каталог как текущий каталог Тогда Файл "folder0/file01.txt" содержит "Текст файла" @@ -124,11 +124,13 @@ Когда Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" с текстом "текст178" Тогда Файл "СпециальныйКаталог/ФайлСТекстом.txt" содержит "178" - Когда Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" с текстом + Когда Я создаю файл "СпециальныйКаталог/ФайлСТекстом.txt" с текстом """ строка 1 строка 2 """ + Тогда я показываю текст файла "СпециальныйКаталог/ФайлСТекстом.txt" + И я показываю 2 строки файла "СпециальныйКаталог/ФайлСТекстом.txt" Тогда Файл "СпециальныйКаталог/ФайлСТекстом.txt" содержит """ строка 1 diff --git a/packagedef b/packagedef index 341a0d2..8715664 100644 --- a/packagedef +++ b/packagedef @@ -3,7 +3,8 @@ Описание.Имя("1bdd") .Версия(Константы_1bdd.ВерсияПродукта) - .ВерсияСреды("1.1.0") + .ВерсияСреды("1.7.0") + .ЗависитОт("logos", "1.3.0") .ЗависитОт("cmdline", "1.0.0") .ЗависитОт("tempfiles", "1.0.0") @@ -11,9 +12,11 @@ .ЗависитОт("1commands", "1.5.0") .ЗависитОт("fs", "1.1.0") .ЗависитОт("strings", "0.4.1") + .РазработкаЗависитОт("1testrunner") .РазработкаЗависитОт("asserts") .РазработкаЗависитОт("coverage") + .ВключитьФайл("src") .ВключитьФайл("tests") .ВключитьФайл("features") @@ -22,4 +25,5 @@ .ВключитьФайл("LICENSE") .ВключитьФайл("Jenkinsfile") .ВключитьФайл("lib.config") - .ИсполняемыйФайл("src/bdd.os", "1bdd"); \ No newline at end of file + + .ИсполняемыйФайл("src/bdd.os", "1bdd"); diff --git a/src/bdd-exec.os b/src/bdd-exec.os index aee9e0a..9896ad6 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -75,7 +75,7 @@ // Если переменной контекста нет или задан обычный путь файла, возвращается переданное значение без изменения // // Важно: подменяется только первый элемент пути, в середине и конце пути подмены не делается -// +// // Финальные разделители строк устанавливаются в зависимости от ОС // // Параметры: @@ -117,7 +117,7 @@ // Важно: проверяется только полное совпадение строки и имени переменной контекста, частичное вхождение не проверяется! // // Параметры: -// Значение - Любой тип - +// Значение - Любой тип - // // Возвращаемое значение: // Любой тип - результат выполнения @@ -135,7 +135,7 @@ Рез = Значение; КонецЕсли; Лог.Отладка("ЗначениеСУчетомПеременныхКонтекста: итоговое значение %1", Рез); - Возврат Рез; + Возврат Рез; КонецФункции // } @@ -146,11 +146,11 @@ // Используется в библиотечном шаге "Я сохраняю каталог проекта в контекст". // // Возвращаемое значение: -// Строка - +// Строка - // либо каталог, в который входит каталог features, если в полном пути текущего каталога есть features, // либо текущий каталог, если нет // -// Например, если файл фичи находится по пути `c:\projects\myproject\features\core\my.feature`, +// Например, если файл фичи находится по пути `c:\projects\myproject\features\core\my.feature`, // вернется значение `c:\projects\myproject\` // Функция КаталогПроверяемогоПроекта() Экспорт @@ -170,7 +170,7 @@ ТекстФичи = СтрШаблон("# language: ru%1%2", Символы.ПС, НаименованиеШагаСценария); РезультатыРазбора = ЧитательГеркин.ПрочитатьТекстФичи(ТекстФичи); РезультатыВыполнения = ВыполнитьДеревоФич(РезультатыРазбора, НаборБиблиотечныхШагов, Неопределено); - + СтатусВыполнения = ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); Если СтатусВыполнения <> ВозможныеСтатусыВыполнения().Пройден Тогда ВызватьИсключение СтрШаблон("Неверно выполнен шаг <%1>", НаименованиеШагаСценария); @@ -189,7 +189,7 @@ // // Параметры: // ПарамФайлФичи - Файл - Файл фичи -// ФайлБиблиотек - Файл - Файл/каталог библиотечных шагов +// ФайлБиблиотек - Файл - Файл/каталог библиотечных шагов // ИскатьВПодкаталогах - <Тип.Вид> - <описание параметра> // ПарамИспользоватьБыстрыйОстановНаОшибке - <Тип.Вид> - <описание параметра> // ПарамИмяЭлементаСценария - <Тип.Вид> - <описание параметра> @@ -197,23 +197,23 @@ // Возвращаемое значение: // ДеревоЗначений - Результаты выполнения фичи в виде дерева фичи // -Функция ВыполнитьФичу(Знач ПарамФайлФичи, Знач ФайлБиблиотек = Неопределено, Знач ИскатьВПодкаталогах = Истина, +Функция ВыполнитьФичу(Знач ПарамФайлФичи, Знач ФайлБиблиотек = Неопределено, Знач ИскатьВПодкаталогах = Истина, Знач ПарамИспользоватьБыстрыйОстановНаОшибке = Ложь, Знач ПарамИмяЭлементаСценария = "") Экспорт - СохранитьТекущийКаталог(); + СохранитьТекущийКаталог(); ФайлФичи = ПарамФайлФичи; ИспользоватьБыстрыйОстановНаОшибке = ПарамИспользоватьБыстрыйОстановНаОшибке; - ИмяЭлементаСценария = ПарамИмяЭлементаСценария; + ИмяЭлементаСценария = ПарамИмяЭлементаСценария; НаборБиблиотечныхШагов = ПолучитьНаборБиблиотечныхШагов(ФайлБиблиотек); - Лог.Отладка("Найдено библиотечных шагов: %1 шт.", + Лог.Отладка("Найдено библиотечных шагов: %1 шт.", ?(ЗначениеЗаполнено(НаборБиблиотечныхШагов), НаборБиблиотечныхШагов.Количество(), "0")); - + Если ФайлФичи.ЭтоКаталог() Тогда Лог.Отладка("Подготовка к выполнению сценариев в каталоге %1", ФайлФичи.ПолноеИмя); МассивФайлов = НайтиФайлы(ФайлФичи.ПолноеИмя, "*.feature", ИскатьВПодкаталогах); - + НаборРезультатовВыполнения = Новый Массив; Для каждого НовыйФайлФичи Из МассивФайлов Цикл Если НовыйФайлФичи.ЭтоКаталог() Тогда @@ -221,29 +221,29 @@ КонецЕсли; РезультатВыполнения = ВыполнитьФичуСУчетомБиблиотечныхШагов(НовыйФайлФичи); НаборРезультатовВыполнения.Добавить(РезультатВыполнения); - Если ИспользоватьБыстрыйОстановНаОшибке + Если ИспользоватьБыстрыйОстановНаОшибке И ПолучитьИтоговыйСтатусВыполнения(РезультатВыполнения) <> ВозможныеСтатусыВыполнения().Пройден Тогда - Прервать; + Прервать; КонецЕсли; КонецЦикла; РезультатыВыполнения = СобратьЕдиноеДеревоИзНабораРезультатовВыполнения(НаборРезультатовВыполнения); - + Иначе - + РезультатыВыполнения = ВыполнитьФичуСУчетомБиблиотечныхШагов(ФайлФичи); - + КонецЕсли; - + Возврат РезультатыВыполнения; КонецФункции Функция ПолучитьИтоговыйСтатусВыполнения(Знач РезультатыВыполнения) Экспорт ИтоговыйСтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; Для каждого РезультатВыполненияФичи Из РезультатыВыполнения.Строки Цикл - ИтоговыйСтатусВыполнения = ЗапомнитьСамоеХудшееСостояние(РезультатВыполненияФичи.СтатусВыполнения, + ИтоговыйСтатусВыполнения = ЗапомнитьСамоеХудшееСостояние(РезультатВыполненияФичи.СтатусВыполнения, ИтоговыйСтатусВыполнения); КонецЦикла; - + Возврат ИтоговыйСтатусВыполнения; КонецФункции @@ -255,19 +255,19 @@ МассивИтогов.Добавить(ВозможныеТипыШагов.Сценарий); МассивИтогов.Добавить(ВозможныеТипыШагов.Шаг); КонецЕсли; - + СтруктураИтогов = Новый Соответствие; Для каждого Элем Из МассивИтогов Цикл СтруктураИтогов.Вставить(Элем, СтатусыВыполненияДляПодсчета()); КонецЦикла; - + РекурсивноПосчитатьИтогиВыполнения(РезультатыВыполнения, СтруктураИтогов); - + ИмяПоляИтога = "Итог"; Для каждого Итоги Из СтруктураИтогов Цикл ДобавитьОбщееКоличествоКИтогам(Итоги.Ключ, Итоги.Значение, ИмяПоляИтога); КонецЦикла; - + Возврат СтруктураИтогов; КонецФункции @@ -279,14 +279,14 @@ // ПоказыватьИтогиФич - Булево - Истина = показывать итоги по фичам; Ложь - не показывать // Процедура ВывестиИтоговыеРезультатыВыполнения(Знач РезультатыВыполнения, Знач ПоказыватьИтогиФич = Истина) Экспорт - + ТекущийУровень = 0; Лог.Информация(""); МассивИтогов = Неопределено; СтруктураИтогов = ПолучитьИтоговыеРезультатыВыполнения(РезультатыВыполнения, МассивИтогов); СтатусВыполнения = ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); - + ИмяПоляИтога = "Итог"; Для каждого Элем Из МассивИтогов Цикл Итог = СтруктураИтогов[Элем]; @@ -298,7 +298,23 @@ ВывестиПредставлениеИтога(Итог, Элем, ИмяПоляИтога, СтатусВыполнения); КонецЕсли; КонецЦикла; - + +КонецПроцедуры + +// Показать проблемные сценарии - файлы, функциональность, сценарии, проблемный шаг. Как упавшие, так и не нереализованные. +// +// Параметры: +// РезультатыВыполнения - ДеревоЗначений - дерево результатов +// +Процедура ПоказатьПроблемныеСценарии(Знач РезультатыВыполнения) Экспорт + + ПроблемныеСтроки = Новый Массив; + РекурсивноСобратьОписаниеПроблемныхУзлов(РезультатыВыполнения, ПроблемныеСтроки); + + Если ЗначениеЗаполнено(ПроблемныеСтроки) Тогда + Лог.Ошибка("%1Проблемные сценарии:%1%2", Символы.ПС, СтрСоединить(ПроблемныеСтроки, Символы.ПС)); + КонецЕсли; + КонецПроцедуры // Статусы выполнения тестов - ВАЖЕН порядок значение (0,1...), используется в ЗапомнитьСамоеХудшееСостояние @@ -340,7 +356,7 @@ // // Возвращаемое значение: // Неопределено, если не найдено, или соответствие, где ключ - имя шага, значение - Структура. -// В структуре есть поля +// В структуре есть поля // "Исполнитель" - объект-исполнитель шага (os-скрипт) // "Файл" - объект-файл с информацией о файле-исполнителе шага // @@ -348,7 +364,7 @@ Если Не ЗначениеЗаполнено(ФайлБиблиотек) Тогда Возврат Неопределено; КонецЕсли; - + МассивФайловБиблиотек = Новый Массив; Если ПодключатьСтандартныеБиблиотеки Тогда ПутьСтандартнойБиблиотекиШагов = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "features", "lib"); @@ -356,9 +372,9 @@ МассивФайловБиблиотек.Добавить(ФайлСтандартнойБиблиотекиШагов); КонецЕсли; МассивФайловБиблиотек.Добавить(ФайлБиблиотек); - + КоллекцияШагов = Новый Структура; - + Лог.Отладка("Получение всех шагов из библиотеки %1", ФайлБиблиотек.ПолноеИмя); МассивОписанийИсполнителяШагов = ПолучитЬМассивОписанийИсполнителяШагов(МассивФайловБиблиотек); @@ -367,7 +383,7 @@ МассивОписанийШагов = ПолучитьМассивОписанийШагов(Исполнитель); Для каждого ИмяШага Из МассивОписанийШагов Цикл АдресШага = ЧитательГеркин.НормализоватьАдресШага(ИмяШага); - ДобавитьАдресШагаВКоллекциюШагов(КоллекцияШагов, АдресШага, ИмяШага, ОписаниеИсполнителяШагов, Ложь); + ДобавитьАдресШагаВКоллекциюШагов(КоллекцияШагов, АдресШага, ИмяШага, ОписаниеИсполнителяШагов); КонецЦикла; КонецЦикла; Возврат КоллекцияШагов; @@ -388,20 +404,20 @@ Функция ВыполнитьФичуСУчетомБиблиотечныхШагов(Знач ФайлФичи) Лог.Отладка("Подготовка к выполнению сценария %1", ФайлФичи.ПолноеИмя); - + Лог.Отладка("Читаю фичу"); - - Лог.Отладка("Найдено библиотечных шагов: %1 шт.", + + Лог.Отладка("Найдено библиотечных шагов: %1 шт.", ?(ЗначениеЗаполнено(НаборБиблиотечныхШагов), НаборБиблиотечныхШагов.Количество(), "0")); - + РезультатыРазбора = ЧитательГеркин.ПрочитатьФайлСценария(ФайлФичи); - + ОписаниеИсполнителяШагов = Неопределено; - НовыйНаборБиблиотечныхШагов = ДополнитьНаборШаговИзИсполнителяШаговФичи(ФайлФичи, + НовыйНаборБиблиотечныхШагов = ДополнитьНаборШаговИзИсполнителяШаговФичи(ФайлФичи, НаборБиблиотечныхШагов, ОписаниеИсполнителяШагов); - + РезультатыВыполнения = ВыполнитьДеревоФич(РезультатыРазбора, НовыйНаборБиблиотечныхШагов, ОписаниеИсполнителяШагов); - + ВосстановитьТекущийКаталог(); Возврат РезультатыВыполнения; @@ -414,7 +430,7 @@ // // Возвращаемое значение: // Массив структур - <описание возвращаемого значения> -// В структуре есть поля +// В структуре есть поля // "Исполнитель" - объект-исполнитель шага (os-скрипт) // "Файл" - объект-файл с информацией о файле-исполнителе шага // @@ -423,11 +439,11 @@ МассивФайловФич = ВыделитьПростыеФайлыФичИзМассиваБиблиотек(МассивФайловБиблиотек); ДобавитьИсполнителейШаговДляФайловФич(МассивФайловФич, МассивОписанийИсполнителяШагов); - + МассивКаталоговФич = МассивФайловБиблиотек; МассивИсполнителей = ПолучитьМассивФайловИсполнителейПоМассивуКаталоговФич(МассивКаталоговФич); ДобавитьИсполнителейШаговИзМассиваФайловШагов(МассивИсполнителей, МассивОписанийИсполнителяШагов); - + Возврат МассивОписанийИсполнителяШагов; КонецФункции // ПолучитЬМассивОписанийИсполнителяШагов @@ -472,7 +488,7 @@ Если ФайлИсполнителя.ЭтоКаталог() Тогда ВызватьИсключение "Нашли каталог вместо файла-шага " + ФайлИсполнителя.ПолноеИмя; КонецЕсли; - + ПоказыватьОшибкиИсполнителей = ФайлНаходитсяВСпециальномКаталогеРеализацииШагов(ФайлИсполнителя); ОписаниеИсполнителяШагов = ПолучитьИсполнителяШагов(ФайлИсполнителя, ПоказыватьОшибкиИсполнителей); Если ЗначениеЗаполнено(ОписаниеИсполнителяШагов) Тогда @@ -506,33 +522,33 @@ КонецФункции // ПолучитьМассивФайловИсполнителейПоМассивуКаталоговФич() Функция ВыполнитьДеревоФич(РезультатыРазбора, Знач НаборБиблиотечныхШагов, Знач ОписаниеИсполнителяШагов) - + ДеревоФич = РезультатыРазбора.ДеревоФич; Ожидаем.Что(ДеревоФич, "Ожидали, что дерево фич будет передано как дерево значений, а это не так") .ИмеетТип("ДеревоЗначений"); - + РезультатыВыполнения = ДеревоФич.Скопировать(); РекурсивноУстановитьСтатусДляВсехУзлов(РезультатыВыполнения.Строки[0], ВозможныеСтатусыВыполнения.НеВыполнялся); - - РезультатыВыполнения.Строки[0].СтатусВыполнения = РекурсивноВыполнитьШаги(ОписаниеИсполнителяШагов, + + РезультатыВыполнения.Строки[0].СтатусВыполнения = РекурсивноВыполнитьШаги(ОписаниеИсполнителяШагов, НаборБиблиотечныхШагов, РезультатыВыполнения.Строки[0]); - + Возврат РезультатыВыполнения; КонецФункции -Функция ДополнитьНаборШаговИзИсполнителяШаговФичи(Знач ФайлСценария, Знач НаборБиблиотечныхШагов, +Функция ДополнитьНаборШаговИзИсполнителяШаговФичи(Знач ФайлСценария, Знач НаборБиблиотечныхШагов, ОписаниеИсполнителяШагов) ОписаниеИсполнителяШагов = НайтиИсполнителяШагов(ФайлСценария); Если ОписаниеИсполнителяШагов <> Неопределено Тогда - + НаборШаговИсполнителя = ПолучитьНаборБиблиотечныхШагов(ФайлСценария, Ложь); Если ЗначениеЗаполнено(НаборШаговИсполнителя) Тогда Лог.Отладка("найдено шагов исполнителя %1", НаборШаговИсполнителя.Количество()); КонецЕсли; Если ЗначениеЗаполнено(НаборБиблиотечныхШагов) Тогда Для каждого КлючЗначение Из НаборШаговИсполнителя Цикл - ДобавитьАдресШагаВКоллекциюШагов(НаборБиблиотечныхШагов, КлючЗначение.Ключ, КлючЗначение.Ключ, - КлючЗначение.Значение, Истина); + ДобавитьАдресШагаВКоллекциюШагов(НаборБиблиотечныхШагов, КлючЗначение.Ключ, КлючЗначение.Ключ, + КлючЗначение.Значение); КонецЦикла; Иначе НаборБиблиотечныхШагов = НаборШаговИсполнителя; @@ -544,24 +560,27 @@ Возврат НаборБиблиотечныхШагов; КонецФункции -Процедура ДобавитьАдресШагаВКоллекциюШагов(КоллекцияШагов, Знач АдресШага, Знач ИмяШага, - Знач ОписаниеИсполнителяШагов, Знач ВставлятьДублиШагов) +Процедура ДобавитьАдресШагаВКоллекциюШагов(КоллекцияШагов, Знач АдресШага, Знач ИмяШага, + Знач ОписаниеИсполнителяШагов) ОписаниеИсполнителяШаговДляСравнения = Неопределено; КоллекцияШагов.Свойство(АдресШага, ОписаниеИсполнителяШаговДляСравнения); ВставлятьШаг = Истина; - Если ОписаниеИсполнителяШаговДляСравнения <> Неопределено - И Не СравнитьПутиФайлов(ОписаниеИсполнителяШаговДляСравнения.Файл, ОписаниеИсполнителяШагов.Файл) Тогда + Если ОписаниеИсполнителяШаговДляСравнения <> Неопределено + И Не СравнитьПутиФайлов(ОписаниеИсполнителяШаговДляСравнения.Файл, ОписаниеИсполнителяШагов.Файл) + // если дублирование в пределах одного каталога фич + И ОписаниеИсполнителяШаговДляСравнения.Файл.Путь = ОписаниеИсполнителяШагов.Файл.Путь + Тогда - Лог.Предупреждение(СтрШаблон("Обнаружено дублирование шага <%1> в 2-х разных файлах шагов <%2> и <%3>", ИмяШага, + Лог.Ошибка(СтрШаблон("Обнаружено дублирование шага <%1> в 2-х разных файлах шагов <%2> и <%3>", ИмяШага, ОписаниеИсполнителяШаговДляСравнения.Файл.ПолноеИмя, ОписаниеИсполнителяШагов.Файл.ПолноеИмя)); - ВставлятьШаг = ВставлятьДублиШагов; + ВставлятьШаг = Ложь; КонецЕсли; Если ВставлятьШаг Тогда КоллекцияШагов.Вставить(АдресШага, ОписаниеИсполнителяШагов); Лог.Отладка("Найдено имя шага <%1>, источник %2", ИмяШага, ОписаниеИсполнителяШагов.Файл.Имя); - КонецЕсли; + КонецЕсли; КонецПроцедуры Функция ПолучитьМассивОписанийШагов(Знач ИсполнительШагов) @@ -580,23 +599,23 @@ Если Рефлектор.МетодСуществует(ИсполнительШагов, АдресШага) Тогда РезМассивОписанийШагов.Добавить(АдресШага); Иначе - Лог.Предупреждение("Пропускаю использование метода шага %1, - |т.к. в модуле шага нет реализации этого метода, хотя в методе ""%2"" шаг %1 указан.", + Лог.Предупреждение("Пропускаю использование метода шага %1, + |т.к. в модуле шага нет реализации этого метода, хотя в методе ""%2"" шаг %1 указан.", АдресШага, ИмяМетода); КонецЕсли; КонецЦикла; Возврат РезМассивОписанийШагов; - + Исключение //пропускаю ошибки КонецПопытки; - КонецЕсли; + КонецЕсли; Возврат Новый Массив; - + КонецФункции // ПолучитьМассивОписанийШагов() // возвращает Неопределено или структуру. -// В структуре есть поля +// В структуре есть поля // "Исполнитель" - объект-исполнитель шага (os-скрипт) // "Файл" - объект-файл с информацией о файле-исполнителе шага Функция НайтиИсполнителяШагов(Знач ФайлФичи) @@ -604,14 +623,14 @@ Лог.Отладка("Ищу исполнителя шагов в каталоге %1", ПутьФичи); ПутьКИсполнителю = ОбъединитьПути(ПутьФичи, "step_definitions"); ПутьКИсполнителю = ОбъединитьПути(ПутьКИсполнителю, ФайлФичи.ИмяБезРасширения+ ".os"); - + ФайлИсполнителя = Новый Файл(ПутьКИсполнителю); ОписаниеИсполнителя = ПолучитьИсполнителяШагов(ФайлИсполнителя, Истина); Возврат ОписаниеИсполнителя; КонецФункции // возвращает Неопределено или структуру. -// В структуре есть поля +// В структуре есть поля // "Исполнитель" - объект-исполнитель шага (os-скрипт) // "Файл" - объект-файл с информацией о файле-исполнителе шага Функция ПолучитьИсполнителяШагов(Знач ФайлИсполнителя, Знач ПоказыватьОшибкиИсполнителей = Ложь) @@ -623,7 +642,7 @@ КонецЕсли; ОписаниеИсполнителя = КешИсполнителейШагов.Получить(ПутьИсполнителя); Если ОписаниеИсполнителя = Неопределено Тогда - + Если ФайлИсполнителя.Существует() Тогда Попытка ИсполнительШагов = ЗагрузитьСценарий(ПутьИсполнителя); @@ -632,18 +651,18 @@ Исключение Инфо = ИнформацияОбОшибке(); Если ПоказыватьОшибкиИсполнителей Тогда - Лог.Предупреждение("Ошибка при загрузке файла %1 %2%3", + Лог.Предупреждение("Ошибка при загрузке файла %1 %2%3", ПутьИсполнителя, Символы.ПС, ПодробноеПредставлениеОшибки(Инфо)); КонецЕсли; - + ОписаниеИсполнителя = Неопределено; КонецПопытки; - + Иначе ОписаниеИсполнителя = Неопределено; КонецЕсли; КонецЕсли; - + Возврат ОписаниеИсполнителя; КонецФункции // ПолучитьИсполнителяШагов() @@ -655,12 +674,12 @@ Функция РекурсивноВыполнитьШаги(Знач ОписаниеИсполнителяШагов, Знач НаборБиблиотечныхШагов, Знач Узел) ТекущийУровень = Узел.Уровень(); ПредставлениеЛексемы = ?(Узел.ТипШага <> ВозможныеТипыШагов.Описание, Узел.Лексема + " ", ""); - + СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; Если Узел.ТипШага = ВозможныеТипыШагов.Сценарий И Не ИмяСценарияПодходитПодФильтр(Узел.Тело, ИмяЭлементаСценария) Тогда - Возврат СтатусВыполнения; + Возврат СтатусВыполнения; КонецЕсли; - + Если Узел.ТипШага = ВозможныеТипыШагов.Сценарий Тогда ПропуститьСценарий = Ложь; КонецЕсли; @@ -668,22 +687,22 @@ Если Узел.ТипШага <> ВозможныеТипыШагов.Шаг Тогда Лог.Информация(ПредставлениеЛексемы + Узел.Тело); КонецЕсли; - + Лог.Отладка("Выполняю узел <%1>, адрес <%2>, тело <%3>", Узел.ТипШага, Узел.АдресШага, Узел.Тело); - - ХукВыполненУспешно = ВыполнитьХукУзла(ЧитательГеркин.ВозможныеХуки().ПередЗапускомСценария, + + ХукВыполненУспешно = ВыполнитьХукУзла(ЧитательГеркин.ВозможныеХуки().ПередЗапускомСценария, ОписаниеИсполнителяШагов, Узел); Если Не ХукВыполненУспешно Тогда СтатусВыполнения = ВозможныеСтатусыВыполнения.Сломался; Иначе - + СтатусВыполнения = ВыполнитьДействиеУзла(НаборБиблиотечныхШагов, Узел); - + Если СтатусВыполнения <> ВозможныеСтатусыВыполнения.Сломался Тогда Для Каждого СтрокаДерева Из Узел.Строки Цикл НовыйСтатус = РекурсивноВыполнитьШаги(ОписаниеИсполнителяШагов, НаборБиблиотечныхШагов, СтрокаДерева); СтатусВыполнения = ЗапомнитьСамоеХудшееСостояние(СтатусВыполнения, НовыйСтатус); - ВыходитьПриНеудачномВыполнении = ИспользоватьБыстрыйОстановНаОшибке + ВыходитьПриНеудачномВыполнении = ИспользоватьБыстрыйОстановНаОшибке Или СтрокаДерева.ТипШага = ВозможныеТипыШагов.Шаг; Если СтатусВыполнения <> ВозможныеСтатусыВыполнения.Пройден И ВыходитьПриНеудачномВыполнении Тогда Прервать; @@ -691,19 +710,19 @@ КонецЦикла; КонецЕсли; КонецЕсли; - - ХукВыполненУспешно = ВыполнитьХукУзла(ЧитательГеркин.ВозможныеХуки().ПослеЗапускаСценария, + + ХукВыполненУспешно = ВыполнитьХукУзла(ЧитательГеркин.ВозможныеХуки().ПослеЗапускаСценария, ОписаниеИсполнителяШагов, Узел); Если Не ХукВыполненУспешно Тогда СтатусВыполнения = ВозможныеСтатусыВыполнения.Сломался; КонецЕсли; - + Узел.СтатусВыполнения = СтатусВыполнения; - + Если Узел.ТипШага <> ВозможныеТипыШагов.Шаг И Узел.ТипШага <> ВозможныеТипыШагов.Описание Тогда Лог.Информация(""); КонецЕсли; - + Возврат СтатусВыполнения; КонецФункции @@ -726,45 +745,45 @@ Если Узел.ТипШага = ОписаниеХука.ТипШага Тогда АдресХука = ОписаниеХука.АдресШага; Рефлектор = Новый Рефлектор; - Если ОписаниеИсполнителяШагов <> Неопределено + Если ОписаниеИсполнителяШагов <> Неопределено И Рефлектор.МетодСуществует(ОписаниеИсполнителяШагов.Исполнитель, АдресХука) Тогда - + СтрокаПараметров = "Узел"; МассивПараметров = Новый Массив; - МассивПараметров.Добавить(Узел); + МассивПараметров.Добавить(Узел); ИмяФайлаШагов = ОписаниеИсполнителяШагов.Файл.Имя; - Лог.Отладка(" Выполняю шаг <%1>, параметры <%2>, источник %3", + Лог.Отладка(" Выполняю шаг <%1>, параметры <%2>, источник %3", АдресХука, СтрокаПараметров, ИмяФайлаШагов); Попытка Рефлектор.ВызватьМетод(ОписаниеИсполнителяШагов.Исполнитель, АдресХука, МассивПараметров); - + Исключение - + Инфо = ИнформацияОбОшибке(); ТекстОшибки = ПодробноеПредставлениеОшибки(Инфо); - + Рез = Ложь; ПредставлениеШага = СтрШаблон("Не удалось выполнить хук <%1> для шага <%2> |%3 |%4", АдресХука, ИмяФайлаШагов, ПредставлениеШага, ТекстОшибки); ВывестиСообщение(ПредставлениеШага, ВозможныеСтатусыВыполнения.Сломался); - + Узел.ОписаниеОшибкиВыполнения = ПредставлениеШага; - + КонецПопытки; КонецЕсли; КонецЕсли; - + Возврат Рез; КонецФункции // ВыполнитьХукУзла_ПередВыполнением(Узел) Функция ВыполнитьДействиеУзла(Знач НаборБиблиотечныхШагов, Знач Узел) - + СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; Если Узел.ТипШага = ВозможныеТипыШагов.Шаг Тогда - СтатусВыполнения = ВыполнитьШагСценария(Узел.АдресШага, Узел.Параметры, + СтатусВыполнения = ВыполнитьШагСценария(Узел.АдресШага, Узел.Параметры, НаборБиблиотечныхШагов, Узел.Тело, Узел.ОписаниеОшибкиВыполнения); Если СтатусВыполнения <> ВозможныеСтатусыВыполнения.Пройден Тогда @@ -775,11 +794,11 @@ СтатусВыполнения = ВозможныеСтатусыВыполнения.Пройден; КонецЕсли; Узел.СтатусВыполнения = СтатусВыполнения; - + Возврат СтатусВыполнения; КонецФункции -Функция ВыполнитьШагСценария(Знач АдресШага, Знач ПараметрыШага, Знач НаборБиблиотечныхШагов, +Функция ВыполнитьШагСценария(Знач АдресШага, Знач ПараметрыШага, Знач НаборБиблиотечныхШагов, Знач ПредставлениеШага, ОписаниеОшибкиВыполнения) СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; @@ -787,29 +806,29 @@ Возврат СтатусВыполнения; КонецЕсли; ОписаниеОшибкиВыполнения = ""; - + Лог.Отладка("Перед выполнением шага сценария %1 |нормализованный адрес шага %2", АдресШага, ЧитательГеркин.НормализоватьАдресШага(АдресШага)); ОписаниеИсполнителяШагов = Неопределено; - ШагРеализован = НаборБиблиотечныхШагов.Свойство(ЧитательГеркин.НормализоватьАдресШага(АдресШага), + ШагРеализован = НаборБиблиотечныхШагов.Свойство(ЧитательГеркин.НормализоватьАдресШага(АдресШага), ОписаниеИсполнителяШагов); Если Не ШагРеализован ИЛИ ОписаниеИсполнителяШагов = Неопределено Тогда СтатусВыполнения = ВозможныеСтатусыВыполнения.НеРеализован; Иначе Рефлектор = Новый Рефлектор; - + Если Не Рефлектор.МетодСуществует(ОписаниеИсполнителяШагов.Исполнитель, АдресШага) Тогда //вдруг сняли Экспорт с метода или метода вообще нет СтатусВыполнения = ВозможныеСтатусыВыполнения.НеРеализован; Иначе - + СтрокаПараметров = ""; МассивПараметров = Новый Массив; ПолучитьМассивПараметров(МассивПараметров, ПараметрыШага, СтрокаПараметров); - + СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); - Лог.Отладка(" Выполняю шаг <%1>, параметры <%2>, источник %3", + Лог.Отладка(" Выполняю шаг <%1>, параметры <%2>, источник %3", АдресШага, СтрокаПараметров, ОписаниеИсполнителяШагов.Файл.Имя); Попытка @@ -819,34 +838,34 @@ Лог.Отладка("Шаг %1 - пропускаем сценарий", АдресШага); СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; КонецЕсли; - + Исключение - + Инфо = ИнформацияОбОшибке(); ТекстОшибки = ПодробноеПредставлениеОшибки(Инфо); - + ОписаниеОшибкиВыполнения = СтрШаблон("У шага <%1>", ПредставлениеШага); Если Инфо.Параметры = ЧитательГеркин.ПараметрИсключенияДляЕщеНеРеализованногоШага() Тогда СтатусВыполнения = ВозможныеСтатусыВыполнения.НеРеализован; ИначеЕсли Инфо.Описание = "Слишком много фактических параметров" Тогда //в случае неверного разбора можем получить неверный адрес или неверные параметры СтатусВыполнения = ВозможныеСтатусыВыполнения.Сломался; ОписаниеОшибкиВыполнения = ОписаниеОшибкиВыполнения + Символы.ПС + ТекстОшибки + Символы.ПС + - СтрШаблон("Дополнительно: Для шага <%1> передано или неверное количество параметров %2 + СтрШаблон("Дополнительно: Для шага <%1> передано или неверное количество параметров %2 |или неверные параметры <%3>", АдресШага, МассивПараметров.Количество(), СтрокаПараметров); Иначе СтатусВыполнения = ВозможныеСтатусыВыполнения.Сломался; ОписаниеОшибкиВыполнения = ОписаниеОшибкиВыполнения + Символы.ПС + ТекстОшибки; КонецЕсли; - + Если СтатусВыполнения = ВозможныеСтатусыВыполнения.Сломался Тогда - Лог.Ошибка(ОписаниеОшибкиВыполнения); + Лог.Ошибка(ОписаниеОшибкиВыполнения); КонецЕсли; КонецПопытки; КонецЕсли; КонецЕсли; - + ВывестиСообщение(ПредставлениеШага, СтатусВыполнения); - + Возврат СтатусВыполнения; КонецФункции // ВыполнитьШагСценария() @@ -857,18 +876,18 @@ РезСтрокаПараметров = РезСтрокаПараметров + КлючЗначение.Значение + ","; КонецЦикла; КонецЕсли; - + КонецПроцедуры Функция СобратьЕдиноеДеревоИзНабораРезультатовВыполнения(НаборРезультатовВыполнения) РезультатВыполнения = ЧитательГеркин.СоздатьДеревоФич(); СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; - + Для каждого РезультатВыполненияФичи Из НаборРезультатовВыполнения Цикл Подстрока = РезультатВыполнения.Строки.Добавить(); ЧитательГеркин.СкопироватьДерево(Подстрока, РезультатВыполненияФичи.Строки[0]); КонецЦикла; - + Возврат РезультатВыполнения; КонецФункции // СобратьЕдиноеДеревоИзНабораРезультатовВыполнения(НаборРезультатовВыполнения) @@ -878,10 +897,10 @@ Если НужныйИтог = Неопределено Тогда Возврат; КонецЕсли; - + НужныйИтог[Узел.СтатусВыполнения] = НужныйИтог[Узел.СтатусВыполнения] + 1; КонецЕсли; - + Для Каждого СтрокаДерева Из Узел.Строки Цикл РекурсивноПосчитатьИтогиВыполнения(СтрокаДерева, СтруктураИтогов); КонецЦикла; @@ -908,12 +927,38 @@ Процедура РекурсивноУстановитьСтатусДляВсехУзлов(Узел, Знач НовыйСтатус) Узел.СтатусВыполнения = НовыйСтатус; - + Для Каждого СтрокаДерева Из Узел.Строки Цикл РекурсивноУстановитьСтатусДляВсехУзлов(СтрокаДерева, НовыйСтатус); КонецЦикла; КонецПроцедуры +Процедура РекурсивноСобратьОписаниеПроблемныхУзлов(Знач РезультатыВыполнения, ПроблемныеСтроки, Знач Отступ = "") + + СКОЛЬКО_ОТСТУПАЕМ = " "; + + //Лог.Отладка("РезультатыВыполнения: "); + Для Каждого Узел Из РезультатыВыполнения.Строки Цикл + СтатусВыполнения = Узел.СтатусВыполнения; + //Лог.Отладка("%1%2 %3 %4", СКОЛЬКО_ОТСТУПАЕМ, СтатусВыполнения, Узел.ТипШага, Узел.Тело); + + Если СтатусВыполнения = ВозможныеСтатусыВыполнения().Пройден + Или СтатусВыполнения = ВозможныеСтатусыВыполнения().НеВыполнялся Тогда + Продолжить; + КонецЕсли; + + //Лог.Ошибка("%1%2 %3", Отступ, Узел.ТипШага, Узел.Тело); + Строка = СтрШаблон("%1%2 %3", Отступ, Узел.ТипШага, Узел.Тело); + Если Узел.ТипШага = ВозможныеТипыШагов.Шаг Тогда + Строка = СтрШаблон("%1 - %2", Строка, ПредставленияСтатусовВыполнения[СтатусВыполнения]); + КонецЕсли; + ПроблемныеСтроки.Добавить(Строка); + + РекурсивноСобратьОписаниеПроблемныхУзлов(Узел, ПроблемныеСтроки, Отступ + СКОЛЬКО_ОТСТУПАЕМ); + КонецЦикла; + +КонецПроцедуры + // Устанавливает новое текущее состояние выполнения тестов // в соответствии с приоритетами состояний: // Красное - заменяет все другие состояния @@ -922,38 +967,37 @@ Функция ЗапомнитьСамоеХудшееСостояние(Знач ТекущееСостояние, Знач НовоеСостояние) ТекущееСостояние = Макс(ТекущееСостояние, НовоеСостояние); Возврат ТекущееСостояние; - + КонецФункции // реализация интерфейса раскладки для логов Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт Отступ = ПолучитьОтступ(ТекущийУровень); НаименованиеУровня = ""; - + Если Уровень = УровниЛога.Информация Тогда НаименованиеУровня = ?(Лог.Уровень() <> Уровень, УровниЛога.НаименованиеУровня(Уровень) + Символы.Таб + "- ", ""); Сообщение = СтроковыеФункции.ДополнитьСлеваМногострочнуюСтроку(Сообщение, Отступ); Возврат СтрШаблон("%1%2", НаименованиеУровня, Сообщение); КонецЕсли; - + НаименованиеУровня = УровниЛога.НаименованиеУровня(Уровень); - + Сообщение = СтроковыеФункции.ДополнитьСлеваМногострочнуюСтроку(Сообщение, СтрШаблон("- %1", Отступ)); Возврат СтрШаблон("%1 %2 %3", НаименованиеУровня, Символы.Таб, Сообщение); - + КонецФункции // здесь нужно использовать различные виды форматирования Процедура ВывестиСообщение(Знач Сообщение, Знач СтатусВыполнения) - Консоль = Новый Консоль(); ПредыдущийЦветТекстаКонсоли = Консоль.ЦветТекста; - + НовыйЦветТекста = ВозможныеЦветаСтатусовВыполнения[СтатусВыполнения]; Если НовыйЦветТекста = Неопределено Тогда НовыйЦветТекста = ПредыдущийЦветТекстаКонсоли; КонецЕсли; Консоль.ЦветТекста = НовыйЦветТекста; - + Если СтатусВыполнения = ВозможныеСтатусыВыполнения.Пройден или СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся Тогда Лог.Информация(Сообщение); @@ -966,7 +1010,7 @@ КонецПроцедуры Функция ПолучитьОтступ(Количество) - Возврат СтроковыеФункции.СформироватьСтрокуСимволов(" ", Количество* 3); + Возврат СтроковыеФункции.СформироватьСтрокуСимволов(" ", Количество * 3); КонецФункции Функция ВозможныеЦветаСтатусовВыполнения() @@ -975,7 +1019,7 @@ Рез.Вставить(ВозможныеСтатусыВыполнения.Пройден, ЦветКонсоли.Зеленый); Рез.Вставить(ВозможныеСтатусыВыполнения.НеРеализован, ЦветКонсоли.Бирюза); Рез.Вставить(ВозможныеСтатусыВыполнения.Сломался, ЦветКонсоли.Красный); - + Возврат Новый ФиксированноеСоответствие(Рез); КонецФункции @@ -996,7 +1040,7 @@ Рез.Вставить(ВозможныеСтатусыВыполнения.НеРеализован, 0); Рез.Вставить(ВозможныеСтатусыВыполнения.Сломался, 0); Возврат Рез; -КонецФункции // СтатусыВыполнения() +КонецФункции Процедура СохранитьТекущийКаталог() Лог.Отладка("Сохранил текущий каталог %1", СохраненныйТекущийКаталог); @@ -1014,7 +1058,7 @@ Если ТипЗнч(ПолноеИмяФайлаИлиФайл ) = Тип("Файл") Тогда ПолноеИмяФайла = ПолноеИмяФайлаИлиФайл.ПолноеИмя; КонецЕсли; - + УниверсальноеПолноеИмя = ПолноеИмяФайла; Если Лев(УниверсальноеПолноеИмя, 2) <> "\\" Тогда УниверсальноеПолноеИмя = СтрЗаменить(УниверсальноеПолноеИмя, "\", "/"); @@ -1022,40 +1066,40 @@ Если ВНРегистр Тогда УниверсальноеПолноеИмя = НРег(УниверсальноеПолноеИмя); КонецЕсли; - + Возврат УниверсальноеПолноеИмя; КонецФункции // &НаКлиентеНаСервереБезКонтекста Функция СравнитьПутиФайлов(Знач Путь1, Знач Путь2) - + Возврат УниверсальноеПолноеИмяФайла(Путь1, Истина) = УниверсальноеПолноеИмяФайла(Путь2, Истина); - - + + КонецФункции // &НаКлиентеНаСервереБезКонтекста Функция СравнитьОбычныйПутьФайлаСУниверсальнымПутемДругогоФайла(Знач Путь1, Знач УниверсальныйПуть2) - + Возврат УниверсальноеПолноеИмяФайла(Путь1, Истина) = УниверсальныйПуть2; - - + + КонецФункции Процедура Инициализация() Лог = Логирование.ПолучитьЛог(ИмяЛога()); Лог.УстановитьРаскладку(ЭтотОбъект); - + ВозможныеСтатусыВыполнения = ВозможныеСтатусыВыполнения(); ПредставленияСтатусовВыполнения = ЗаполнитьПредставленияСтатусовВыполнения(); ВозможныеЦветаСтатусовВыполнения = ВозможныеЦветаСтатусовВыполнения(); ТекущийУровень = 0; - + ЧитательГеркин = Новый ЧитательГеркин; - + ВозможныеТипыШагов = ЧитательГеркин.ВозможныеТипыШагов(); ВозможныеКлючиПараметров = ЧитательГеркин.ВозможныеКлючиПараметров(); - + Контекст = Новый Соответствие(); ПервичныйТекущийКаталог = ТекущийКаталог(); КонецПроцедуры diff --git a/src/bdd.os b/src/bdd.os index 722ca56..e8b98da 100644 --- a/src/bdd.os +++ b/src/bdd.os @@ -78,19 +78,19 @@ | bdd exec [ключи] |"); - Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ПутьФичи", + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ПутьФичи", "или - путь к файлам *.feature. | Можно указывать как каталог, так и конкретный файл."); Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-name", " | -name <ЧастьИмениСценария> - Выполнение сценариев, в имени которого есть указанная часть"); - Парсер.ДобавитьПараметрФлагКоманды(Команда, "-fail-fast", + Парсер.ДобавитьПараметрФлагКоманды(Команда, "-fail-fast", "Немедленное завершение выполнения на первом же не пройденном сценарии"); - Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-junit-out", + Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-junit-out", " -junit-out <путь-файла-отчета> - выводить отчет тестирования в формате JUnit.xml |");// перевод строки нужен для визуального отделения общих ключей в подсказке - + ДобавитьОбщиеПараметрыКоманд(Парсер, Команда); Парсер.ДобавитьКоманду(Команда); @@ -102,10 +102,10 @@ | bdd gen [ключи] |"); - Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ПутьФичи", + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ПутьФичи", "или - путь к файлам *.feature. | Можно указывать как каталог, так и конкретный файл."); - + ДобавитьОбщиеПараметрыКоманд(Парсер, Команда); Парсер.ДобавитьКоманду(Команда); @@ -114,15 +114,15 @@ Процедура ДобавитьОбщиеПараметрыКоманд(Парсер, Команда) Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-require", " - | -require <путь каталога или путь файла> - путь к каталогу фича-файлов или к фича-файлу, + | -require <путь каталога или путь файла> - путь к каталогу фича-файлов или к фича-файлу, | содержащим библиотечные шаги. | Если эта опция не задана, загружаются все os-файлы шагов из каталога исходной фичи и его подкаталогов. - | Если опция задана, загружаются только os-файлы шагов из каталога фича-файлов или к фича-файла, + | Если опция задана, загружаются только os-файлы шагов из каталога фича-файлов или к фича-файла, | содержащих библиотечные шаги. |" ); Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-out", "<путь лог-файла>"); - Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-debug", + Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-debug", "-debug - включает режим отладки (полный лог + остаются временные файлы)"); Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-verbose", "-verbose - включается полный лог"); КонецПроцедуры @@ -174,7 +174,7 @@ КодВозврата = 0; Если Команда = "exec" Тогда - КодВозврата = ВыполнитьФичу(ПутьФичи, Параметры["-require"], Параметры["-fail-fast"], Параметры["-name"], + КодВозврата = ВыполнитьФичу(ПутьФичи, Параметры["-require"], Параметры["-fail-fast"], Параметры["-name"], Параметры["-junit-out"]); ИначеЕсли Команда = "gen" Тогда СгенерироватьФайлыШагов(ПутьФичи, Параметры["-require"]); @@ -187,7 +187,7 @@ Возврат КодВозврата; КонецФункции -Функция ВыполнитьФичу(Знач ПутьФичи, Знач ПутьКБиблиотекам, Знач ИспользоватьБыстрыйОстановНаОшибке, +Функция ВыполнитьФичу(Знач ПутьФичи, Знач ПутьКБиблиотекам, Знач ИспользоватьБыстрыйОстановНаОшибке, Знач ИмяЭлементаСценария, Знач ПутьОтчетаJUnit) Лог.Отладка("ПутьФичи %1", ПутьФичи); @@ -200,18 +200,21 @@ ДопЛог.УстановитьУровень(Лог.Уровень()); ФайлФичи = ПолучитьФайлПоПути(ПутьФичи); - + ФайлБиблиотек = ПолучитьФайлБиблиотек(ФайлФичи, ПутьКБиблиотекам); СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся; ИскатьВПодкаталогах = Истина; - РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(ФайлФичи, ФайлБиблиотек, ИскатьВПодкаталогах, + РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(ФайлФичи, ФайлБиблиотек, ИскатьВПодкаталогах, ИспользоватьБыстрыйОстановНаОшибке, ИмяЭлементаСценария); + Лог.Отладка("РезультатыВыполнения.Строки.Количество() %1", РезультатыВыполнения.Строки.Количество()); + Если РезультатыВыполнения.Строки.Количество() > 0 Тогда СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + ИсполнительБДД.ПоказатьПроблемныеСценарии(РезультатыВыполнения); ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, ФайлФичи.ЭтоКаталог()); КонецЕсли; @@ -255,7 +258,7 @@ Функция ПолучитьФайлПоПути(Знач Путь) РезФайл = Новый Файл(Путь); - Если Не ЗначениеЗаполнено(РезФайл.Путь) Тогда + Если Не ЗначениеЗаполнено(РезФайл.Путь) Тогда РезФайл = Новый Файл(ОбъединитьПути(ТекущийКаталог(), Путь)); КонецЕсли; Возврат РезФайл; diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213_1bdd.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213_1bdd.os" index ad3a282..1c18756 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213_1bdd.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213_1bdd.os" @@ -2,4 +2,4 @@ /////////////////////////////////////////////////////////////// -ВерсияПродукта = "1.13.0"; +ВерсияПродукта = "1.14.0"; diff --git a/tasks/test.os b/tasks/test.os index 094e1dd..c6496e2 100644 --- a/tasks/test.os +++ b/tasks/test.os @@ -40,6 +40,7 @@ Если РезультатыВыполнения.Строки.Количество() > 0 Тогда СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + ИсполнительБДД.ПоказатьПроблемныеСценарии(РезультатыВыполнения); ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, Файл_КаталогФич.ЭтоКаталог()); КонецЕсли;