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 Тогда
СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения);
+ ИсполнительБДД.ПоказатьПроблемныеСценарии(РезультатыВыполнения);
ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, Файл_КаталогФич.ЭтоКаталог());
КонецЕсли;