From e95e0c547e3e8dd1341a88e6b5385d4dd88d8f21 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Thu, 14 Jul 2016 21:09:15 +0300 Subject: [PATCH 01/56] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=B3-?= =?UTF-8?q?=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gherkin-read.os | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/gherkin-read.os b/src/gherkin-read.os index 963bf43..81642f4 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -786,14 +786,14 @@ Процедура ВставитьУзлыКонтекстовВУзлыСценариевПодчиненныхКонтексту(СтрокиДерева, Знач СчетчикСтрокиВДереве = 0, Знач УзелКонтекста = Неопределено) Для Счетчик = СчетчикСтрокиВДереве По СтрокиДерева.Количество() -1 Цикл -Лог.Ошибка("Счетчик в цикле %1, кол-во строк %2", Счетчик, СтрокиДерева.Количество() -1); +// Лог.Ошибка("Счетчик в цикле %1, кол-во строк %2", Счетчик, СтрокиДерева.Количество() -1); СтрокаДерева = СтрокиДерева[Счетчик]; - Лог.Ошибка(" Лексема <%1>, Тело <%2>, уровень <%3>, уровень() %4", СтрокаДерева.Лексема, СтрокаДерева.Тело, СтрокаДерева.УровеньЛексемы, СтрокаДерева.Уровень()); + Лог.Отладка(" Лексема <%1>, Тело <%2>, уровень <%3>, уровень() %4", СтрокаДерева.Лексема, СтрокаДерева.Тело, СтрокаДерева.УровеньЛексемы, СтрокаДерева.Уровень()); //Если ТипЗнч(СтрокаДерева.Владелец()) <> Тип("ДеревоЗначений") Тогда // Лог.Ошибка(" Лексема <%1>, Тело <%2>, уровень <%3>", СтрокаДерева.Владелец().Лексема, СтрокаДерева.Владелец().Тело, СтрокаДерева.Владелец().УровеньЛексемы); //КонецЕсли; Если СтрокаДерева.Уровень() > 1 Тогда - Лог.Ошибка(" Пропускаю строку "); + // Лог.Ошибка(" Пропускаю строку "); Прервать; КонецЕсли; Если СтрокаДерева.ТипШага = ВозможныеТипыШагов.Контекст Тогда @@ -881,7 +881,8 @@ Процедура ВставитьУзелКонтекста(Знач МассивСтрокДляВставкиКонтекста, Знач УзелКонтекста) Для каждого СтрокаСценария Из МассивСтрокДляВставкиКонтекста Цикл -Лог.Ошибка(СтрШаблон("Вставляю контекст для строки <%1>, контекст <%2>", СтрокаСценария.Тело, УзелКонтекста.Тело)); + Лог.Отладка(СтрШаблон("Вставляю контекст для строки <%1>, контекст <%2>", СтрокаСценария.Тело, УзелКонтекста.Тело)); + НоваяСтрока = СтрокаСценария.Строки.Вставить(0); СкопироватьДерево(НоваяСтрока, УзелКонтекста); ПоказатьДеревоВРежимеОтладки(СтрокаСценария, " "); From 1b902d061d6f73cce630a072aef5ab1eac401270 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 15 Jul 2016 21:00:12 +0300 Subject: [PATCH 02/56] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20=D1=84=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=20=D1=81=D0=BE=20=D0=B7=D0=BD=D0=B0=D0=BA=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8-=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8F=D0=BC=D0=B8=20#60?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\320\260\321\206\320\270\320\270.feature" | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git "a/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" "b/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" index e03b217..182a12a 100644 --- "a/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" +++ "b/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" @@ -4,12 +4,13 @@ Как Разработчик Я Хочу, чтобы у меня была возможность генерировать шаги в os-файлах для feature-файлов -Сценарий: Первичная генерация шагов - +Контекст: Тестовый каталог Когда я подготовил тестовый каталог для фич И установил тестовый каталог как текущий - # И я подготовил специальную тестовую фичу "ПередачаПараметров" - И я создал файл фичи "ФичаБезШагов" с текстом + +Сценарий: Первичная генерация шагов + + Когда я создал файл фичи "ФичаБезШагов" с текстом """ # language: ru Функционал: Библиотечные шаги @@ -21,10 +22,21 @@ Тогда я получил сгенерированный os-файл "ФичаБезШагов" в ожидаемом каталоге И проверка поведения фичи "ФичаБезШагов" закончилась с кодом возврата 1 +Сценарий: Генерация шагов, если в представлении шагов есть сторонние символы-разделители + + Когда я создал файл фичи "Символы-Разделители" с текстом + """ + # language: ru + Функционал: Библиотечные шаги + Сценарий: Использование шагов из другой фичи + Когда я передаю символы-разделители .,;() + """ + И я запустил генерацию шагов фичи "Символы-Разделители" + Тогда я получил сгенерированный os-файл "Символы-Разделители" в ожидаемом каталоге + И проверка поведения фичи "Символы-Разделители" закончилась с кодом возврата 1 + Сценарий: Перегенерация шагов в случае существования файла шагов - Когда я подготовил тестовый каталог для фич - И установил тестовый каталог как текущий Когда я подготовил специальную тестовую фичу "ПередачаПараметров" И я подставил файл шагов с уже реализованными шагами для фичи "ПередачаПараметров" И я запустил генерацию шагов фичи "ПередачаПараметров" From eff85f05239c0d266b3abb15f07b4aff37f4db5b Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 15 Jul 2016 21:01:07 +0300 Subject: [PATCH 03/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=8B?= =?UTF-8?q?=20=D1=88=D0=B0=D0=B3=D0=B0,=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=20=D0=B8=D0=B4=D0=B5=D1=82=20=D0=BD=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B0=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D1=81=D0=B0=20=D0=B8=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20"=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D1=85=20=D1=81?= =?UTF-8?q?=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D0=BE=D0=B2"=20#60?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bdd-generate.os | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/bdd-generate.os b/src/bdd-generate.os index 144d6e6..8e753bc 100644 --- a/src/bdd-generate.os +++ b/src/bdd-generate.os @@ -380,8 +380,10 @@ ЭтоПервичнаяГенерация = ОписаниеЗаписываемогоФайла.ЭтоПервичнаяГенерация; НаборМетодовМодуляШагов = ОписаниеЗаписываемогоФайла.НаборМетодовМодуляШагов; + АдресШага = ЧитательГеркин.НормализоватьАдресШага(ИмяМетода); + Если Не ЭтоПервичнаяГенерация Тогда - ОписаниеМетода = НаборМетодовМодуляШагов.Найти(ЧитательГеркин.НормализоватьАдресШага(ИмяМетода), "НормализованноеИмяМетода"); + ОписаниеМетода = НаборМетодовМодуляШагов.Найти(АдресШага, "НормализованноеИмяМетода"); Если ОписаниеМетода <> Неопределено Тогда Возврат; КонецЕсли; @@ -398,7 +400,7 @@ КонецЦикла; ШаблонЗаписи = "%1 %2(%3) %4"; - СтрокаДляЗаписи = СтрШаблон(ШаблонЗаписи, "Процедура", ИмяМетода, СтрокаПараметров, "Экспорт"); + СтрокаДляЗаписи = СтрШаблон(ШаблонЗаписи, "Процедура", АдресШага, СтрокаПараметров, "Экспорт"); Лог.Отладка("СтрокаДляЗаписи <"+СтрокаДляЗаписи+">"); Буфер.Добавить(СтрокаДляЗаписи); From c5ade662a27c01184539bc1fb26cd54fdf1b0f5a Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 15 Jul 2016 21:21:16 +0300 Subject: [PATCH 04/56] =?UTF-8?q?=D0=BB=D0=BE=D0=B3-=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D1=8B=20=D0=B8=D0=B3=D0=BD=D0=BE=D1=80=D0=B8=D1=80=D1=83?= =?UTF-8?q?=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 72ef697..61c10e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ exec-log.txt +exec.log +gen.log From f5c05e4bcff4c7eb7a975b3a3dd84cdd9eef3356 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 15 Jul 2016 23:33:58 +0300 Subject: [PATCH 05/56] =?UTF-8?q?=D0=9F=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=8E=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BB=D0=BE=D0=B3,=20=D0=B5=D1=81=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=20=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20=D0=B8=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20?= =?UTF-8?q?=D1=84=D0=B8=D1=87=20#60?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\275\320\265\321\200\320\260\321\206\320\270\320\270.os" | 4 ++-- ...5\320\265\321\200\320\260\321\206\320\270\320\270.feature" | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" index b43ce40..85d9fbd 100644 --- "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" +++ "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -78,7 +78,7 @@ КодВозврата = Неопределено; ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог(), Истина, КодВозврата); - Если КодВозврата <> 0 Тогда + Если КодВозврата <> 0 ИЛИ СтрНайти(ПараметрыКоманднойСтроки, "-verbose on") <> 0 Тогда ВывестиТекстФайла(ИмяЛогаКоманды); Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата равен 0, а это не так").Равно(0); КонецЕсли; @@ -152,7 +152,7 @@ КодВозврата = Неопределено; ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог(), Истина, КодВозврата); - Если КодВозврата <> ОжидаемыйКодВозврата Тогда + Если КодВозврата <> ОжидаемыйКодВозврата ИЛИ СтрНайти(ПараметрыКоманднойСтроки, "-verbose on") <> 0 Тогда ВывестиТекстФайла(ИмяЛогаКоманды); Ожидаем.Что(КодВозврата, "ПроверитьПоведениеФичиИлиКаталога").Равно(ОжидаемыйКодВозврата); КонецЕсли; diff --git "a/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" "b/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" index 182a12a..08ce3f9 100644 --- "a/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" +++ "b/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" @@ -31,7 +31,7 @@ Сценарий: Использование шагов из другой фичи Когда я передаю символы-разделители .,;() """ - И я запустил генерацию шагов фичи "Символы-Разделители" + И я запустил генерацию шагов фичи "Символы-Разделители" с передачей параметра "-verbose off" Тогда я получил сгенерированный os-файл "Символы-Разделители" в ожидаемом каталоге И проверка поведения фичи "Символы-Разделители" закончилась с кодом возврата 1 From a93633f55b50b29cec9cc45832c01cb2f8aebfc0 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 15 Jul 2016 23:35:19 +0300 Subject: [PATCH 06/56] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BB=D0=B0=D0=B4=D0=BE=D1=87=D0=BD=D1=8B=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/gherkin-read-tests.os | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/gherkin-read-tests.os b/tests/gherkin-read-tests.os index 8660ff5..461439b 100644 --- a/tests/gherkin-read-tests.os +++ b/tests/gherkin-read-tests.os @@ -45,7 +45,7 @@ Процедура Тест_ДолженПрочитатьПростойФайлФичи() Экспорт - ВключитьОтладкуЧитателя(УровниЛога.Отладка); + // ВключитьОтладкуЧитателя(УровниЛога.Отладка); ФайлФичи = ПолучитьФайлФичи("БезПараметров"); From ffae8daa169cc4313bc7d0654bebfe902793f523 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 15 Jul 2016 23:46:23 +0300 Subject: [PATCH 07/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=8B?= =?UTF-8?q?=20=D1=88=D0=B0=D0=B3=D0=B0,=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=20=D0=B8=D0=B4=D0=B5=D1=82=20=D0=BD=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B0=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D1=81=D0=B0=20=D0=B8=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20"=D0=BB=D0=B8=D1=88?= =?UTF-8?q?=D0=BD=D0=B8=D1=85=20=D1=81=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2"=20#60?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gherkin-read.os | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/gherkin-read.os b/src/gherkin-read.os index 81642f4..de1b674 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -882,7 +882,7 @@ Процедура ВставитьУзелКонтекста(Знач МассивСтрокДляВставкиКонтекста, Знач УзелКонтекста) Для каждого СтрокаСценария Из МассивСтрокДляВставкиКонтекста Цикл Лог.Отладка(СтрШаблон("Вставляю контекст для строки <%1>, контекст <%2>", СтрокаСценария.Тело, УзелКонтекста.Тело)); - + НоваяСтрока = СтрокаСценария.Строки.Вставить(0); СкопироватьДерево(НоваяСтрока, УзелКонтекста); ПоказатьДеревоВРежимеОтладки(СтрокаСценария, " "); @@ -1080,11 +1080,34 @@ Функция СоздатьНаборЗаменДляНормализацииАдресаШага() Соответствие = Новый Соответствие; Соответствие.Вставить(" ","_"); - Соответствие.Вставить(",",""); - Соответствие.Вставить("(",""); - Соответствие.Вставить(")",""); - Соответствие.Вставить(";",""); - Соответствие.Вставить(".",""); + Соответствие.Вставить(",","_"); + Соответствие.Вставить("(","_"); + Соответствие.Вставить(")","_"); + Соответствие.Вставить(";","_"); + Соответствие.Вставить(".","_"); + + Соответствие.Вставить("`","_"); + Соответствие.Вставить("~","_"); + Соответствие.Вставить("!","_"); + Соответствие.Вставить("@","_"); + Соответствие.Вставить("#","_"); + Соответствие.Вставить("$","_"); + Соответствие.Вставить("%","_"); + Соответствие.Вставить("^","_"); + Соответствие.Вставить("&","_"); + Соответствие.Вставить("*","_"); + Соответствие.Вставить("'","_"); + Соответствие.Вставить("/","_"); + Соответствие.Вставить("\","_"); + Соответствие.Вставить(":","_"); + Соответствие.Вставить("-","_"); + Соответствие.Вставить("+","_"); + Соответствие.Вставить("=","_"); + Соответствие.Вставить("№","_"); + Соответствие.Вставить("?","_"); + Соответствие.Вставить("<","_"); + Соответствие.Вставить(">","_"); + Возврат Соответствие; КонецФункции // СоздатьНаборЗаменДляНормализацииАдресаШага() // } From c02052a091ef78b1901c6625976f9677f870ec30 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 16 Jul 2016 13:34:34 +0300 Subject: [PATCH 08/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B5=D0=B2=D0=B5=D1=80=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=8B=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=88=D0=B0=D0=B3=D0=B0=20#60?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bdd-generate.os | 5 +++-- src/gherkin-read.os | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/bdd-generate.os b/src/bdd-generate.os index 8e753bc..6127f24 100644 --- a/src/bdd-generate.os +++ b/src/bdd-generate.os @@ -381,13 +381,14 @@ НаборМетодовМодуляШагов = ОписаниеЗаписываемогоФайла.НаборМетодовМодуляШагов; АдресШага = ЧитательГеркин.НормализоватьАдресШага(ИмяМетода); - + Если Не ЭтоПервичнаяГенерация Тогда ОписаниеМетода = НаборМетодовМодуляШагов.Найти(АдресШага, "НормализованноеИмяМетода"); Если ОписаниеМетода <> Неопределено Тогда Возврат; КонецЕсли; КонецЕсли; + Лог.Отладка("Адрес шага <"+АдресШага+">"); СтрокаПараметров = ПолучитьСтрокуПараметров(Узел.Параметры); @@ -400,7 +401,7 @@ КонецЦикла; ШаблонЗаписи = "%1 %2(%3) %4"; - СтрокаДляЗаписи = СтрШаблон(ШаблонЗаписи, "Процедура", АдресШага, СтрокаПараметров, "Экспорт"); + СтрокаДляЗаписи = СтрШаблон(ШаблонЗаписи, "Процедура", ИмяМетода, СтрокаПараметров, "Экспорт"); Лог.Отладка("СтрокаДляЗаписи <"+СтрокаДляЗаписи+">"); Буфер.Добавить(СтрокаДляЗаписи); diff --git a/src/gherkin-read.os b/src/gherkin-read.os index de1b674..335922c 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -104,9 +104,6 @@ КонецФункции Функция НормализоватьАдресШага(Знач АдресШага) Экспорт - Для каждого КлючЗначение Из НаборЗаменДляНормализацииАдресаШага Цикл - АдресШага = СтрЗаменить(АдресШага, КлючЗначение.Ключ, КлючЗначение.Значение); - КонецЦикла; Возврат ВРег(АдресШага); КонецФункции // НормализоватьАдресШага() @@ -615,10 +612,14 @@ Лог.Отладка("Пропускаю Элемент "+Элемент); Продолжить; КонецЕсли; - Элемент = СтрЗаменить(Элемент, "-", "_"); + // Элемент = СтрЗаменить(Элемент, "-", "_"); АдресШага = АдресШага + ТРег(Элемент); КонецЦикла; + Для каждого КлючЗначение Из НаборЗаменДляНормализацииАдресаШага Цикл + АдресШага = СтрЗаменить(АдресШага, КлючЗначение.Ключ, КлючЗначение.Значение); + КонецЦикла; + Возврат АдресШага; КонецФункции From 2c1b6e05336894c3b91842b1ef8990c414b27eac Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 16 Jul 2016 13:35:01 +0300 Subject: [PATCH 09/56] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=84=D0=B8=D1=87=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=85=D1=83=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/core/Hooks.feature | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 features/core/Hooks.feature diff --git a/features/core/Hooks.feature b/features/core/Hooks.feature new file mode 100644 index 0000000..4648345 --- /dev/null +++ b/features/core/Hooks.feature @@ -0,0 +1,25 @@ +# language: ru + +Функционал: Проверка хуков в файле шагов + Как Разработчик + Я Хочу, чтобы у меня была возможность использовать хуки ПередЗапускомСценария/ПослеЗапускаСценария в файлах шагов + +Контекст: Подготовка файла фичи "ПроверкаХуков" + Когда я подготовил тестовый каталог для фич + И установил тестовый каталог как текущий + И я создал файл фичи "ПроверкаХуков" с текстом + """ + # language: ru + Функционал: Проверка хуков + Сценарий: Хуки + Тогда я записываю "ШагСценария" в файл журнала + """ + И я запустил генерацию шагов фичи "ПроверкаХуков" + И я получил сгенерированный os-файл "ПроверкаХуков" в ожидаемом каталоге + +Сценарий: Проверка выполнения хуков + + Тогда проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 1 + И я подставил файл шагов фичи "ПроверкаХуков" из каталога "tests\fixtures" + И проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 0 + И текст файла-журнала равен "ПередЗапускомСценария;ШагСценария" \ No newline at end of file From 561300dcad54f7e8ce78b7aaeb62554c2f0d5201 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 16 Jul 2016 14:10:37 +0300 Subject: [PATCH 10/56] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D1=88=D0=B0=D0=B3=D0=B8=20?= =?UTF-8?q?=D1=84=D0=B8=D1=87=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D1=85=D1=83=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=20#7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/core/Hooks.feature | 2 +- features/core/step_definitions/Hooks.os | 63 +++++++++++++++++++ ...20\245\321\203\320\272\320\276\320\262.os" | 50 +++++++++++++++ 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 features/core/step_definitions/Hooks.os create mode 100644 "tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" diff --git a/features/core/Hooks.feature b/features/core/Hooks.feature index 4648345..54e8b06 100644 --- a/features/core/Hooks.feature +++ b/features/core/Hooks.feature @@ -22,4 +22,4 @@ Тогда проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 1 И я подставил файл шагов фичи "ПроверкаХуков" из каталога "tests\fixtures" И проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 0 - И текст файла-журнала равен "ПередЗапускомСценария;ШагСценария" \ No newline at end of file + И текст файла-журнала равен ";ПередЗапускомСценария;ШагСценария" \ No newline at end of file diff --git a/features/core/step_definitions/Hooks.os b/features/core/step_definitions/Hooks.os new file mode 100644 index 0000000..08691f6 --- /dev/null +++ b/features/core/step_definitions/Hooks.os @@ -0,0 +1,63 @@ +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd + +#Использовать asserts + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("ЯПодставилФайлШаговФичиИзКаталога"); + ВсеШаги.Добавить("ТекстФайла_ЖурналаРавен"); + + Возврат ВсеШаги; +КонецФункции + +// Реализация шагов + +//я подставил файл шагов фичи "ПроверкаХуков" из каталога "tests\fixtures" +Процедура ЯПодставилФайлШаговФичиИзКаталога(ИмяФичи, КаталогФичи) Экспорт + ИмяИсполнителяШагов = ИмяФичи + ".os"; + ИсходныйФайлИсполнителяШагов = Новый Файл(ОбъединитьПути(КаталогПроекта(), КаталогФичи, "step_definitions", ИмяИсполнителяШагов )); + ФайлИсполнителяШагов = Новый Файл(ОбъединитьПути("step_definitions", ИмяИсполнителяШагов )); + + Если ФайлИсполнителяШагов.Существует() Тогда + УдалитьФайлы(ФайлИсполнителяШагов.ПолноеИмя); + КонецЕсли; + КопироватьФайл(ИсходныйФайлИсполнителяШагов.ПолноеИмя, ФайлИсполнителяШагов.ПолноеИмя); +КонецПроцедуры + +//текст файла-журнала равен "ПередЗапускомСценария;ШагСценария" +Процедура ТекстФайла_ЖурналаРавен(ТекстЖурнала) Экспорт + СтрокаИзЖурнала = ПрочитатьЖурнал(); + Ожидаем.Что(СтрокаИзЖурнала).Равно(ТекстЖурнала); +КонецПроцедуры + +//TODO дубль с ПроверкаХуков.os +Функция ПрочитатьЖурнал() + ФайлЖурнала = Новый Файл(ПутьФайлаЖурнала()); + Если ФайлЖурнала.Существует() Тогда + + ЧтениеТекста = Новый ЧтениеТекста; + ЧтениеТекста.Открыть(ПутьФайлаЖурнала(),"UTF-8"); + + СтрокаИзЖурнала = ЧтениеТекста.ПрочитатьСтроку(); + ЧтениеТекста.Закрыть(); + Иначе + СтрокаИзЖурнала = ""; + КонецЕсли; + Возврат СтрокаИзЖурнала; +КонецФункции + +//TODO дубль с ПроверкаХуков.os +Функция ПутьФайлаЖурнала() + Возврат "ФайлЖурнала.log"; +КонецФункции // ПутьФайлаЖурнала() + +Функция КаталогПроекта() Экспорт + КаталогПроекта = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "..", ".."); + Возврат КаталогПроекта; +КонецФункции // ПолучитьКаталогИсходников() diff --git "a/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" "b/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" new file mode 100644 index 0000000..3061995 --- /dev/null +++ "b/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" @@ -0,0 +1,50 @@ +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("ЯЗаписываюВФайлЖурнала"); + + Возврат ВсеШаги; +КонецФункции + +Процедура ПередЗапускомСценария() Экспорт + ЯЗаписываюВФайлЖурнала("ПередЗапускомСценария"); +КонецПроцедуры + +// Реализация шагов + +//я записываю "ШагСценария" в файл журнала +Процедура ЯЗаписываюВФайлЖурнала(СтрокаДляЖурнала) Экспорт + СтрокаИзЖурнала = ПрочитатьЖурнал(); + + ЗаписьФайла = Новый ЗаписьТекста(ПутьФайлаЖурнала(), "utf-8"); + + ЗаписьФайла.ЗаписатьСтроку(СтрШаблон("%1;%2", СтрокаИзЖурнала, СтрокаДляЖурнала)); + + ЗаписьФайла.Закрыть(); +КонецПроцедуры + +Функция ПрочитатьЖурнал() + ФайлЖурнала = Новый Файл(ПутьФайлаЖурнала()); + Если ФайлЖурнала.Существует() Тогда + + ЧтениеТекста = Новый ЧтениеТекста; + ЧтениеТекста.Открыть(ПутьФайлаЖурнала(),"UTF-8"); + + СтрокаИзЖурнала = ЧтениеТекста.ПрочитатьСтроку(); + ЧтениеТекста.Закрыть(); + Иначе + СтрокаИзЖурнала = ""; + КонецЕсли; + Возврат СтрокаИзЖурнала; +КонецФункции + +Функция ПутьФайлаЖурнала() + Возврат "ФайлЖурнала.log"; +КонецФункции // ПутьФайлаЖурнала() From 5d370660ada4f4ed9fb1c32ce676118f1a07b814 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 16 Jul 2016 15:44:34 +0300 Subject: [PATCH 11/56] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=85=D1=83=D0=BA=D0=B0=20=D0=9F?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=D0=97=D0=B0=D0=BF=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=A1=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D1=8F=20?= =?UTF-8?q?#7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/core/Hooks.feature | 4 +- src/bdd-exec.os | 71 ++++++++++++++++--- ...20\245\321\203\320\272\320\276\320\262.os" | 4 +- 3 files changed, 64 insertions(+), 15 deletions(-) diff --git a/features/core/Hooks.feature b/features/core/Hooks.feature index 54e8b06..14690fd 100644 --- a/features/core/Hooks.feature +++ b/features/core/Hooks.feature @@ -11,7 +11,7 @@ """ # language: ru Функционал: Проверка хуков - Сценарий: Хуки + Сценарий: Запись в файл журнала Тогда я записываю "ШагСценария" в файл журнала """ И я запустил генерацию шагов фичи "ПроверкаХуков" @@ -22,4 +22,4 @@ Тогда проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 1 И я подставил файл шагов фичи "ПроверкаХуков" из каталога "tests\fixtures" И проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 0 - И текст файла-журнала равен ";ПередЗапускомСценария;ШагСценария" \ No newline at end of file + И текст файла-журнала равен ";ПередЗапускомСценария-Запись в файл журнала;ШагСценария" \ No newline at end of file diff --git a/src/bdd-exec.os b/src/bdd-exec.os index cfa2401..b58cf15 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -162,7 +162,7 @@ // В структуре есть поля // "Исполнитель" - объект-исполнитель шага (os-скрипт) // "Файл" - объект-файл с информацией о файле-исполнителе шага -Функция ПолучитЬМассивОписанийИсполнителяШагов(Знач ФайлБиблиотек) +Функция ПолучитьМассивОписанийИсполнителяШагов(Знач ФайлБиблиотек) МассивОписанийИсполнителяШагов = Новый Массив; Если Не ФайлБиблиотек.ЭтоКаталог() Тогда ОписаниеИсполнителяШагов = НайтиИсполнителяШагов(ФайлБиблиотек); @@ -199,7 +199,7 @@ НаборБиблиотечныхШагов = ДополнитьНаборШаговИзИсполнителяШаговФичи(ФайлСценария, НаборБиблиотечныхШагов); - РезультатыВыполнения.Строки[0].СтатусВыполнения = РекурсивноВыполнитьШаги(НаборБиблиотечныхШагов, РезультатыВыполнения.Строки[0]); + РезультатыВыполнения.Строки[0].СтатусВыполнения = РекурсивноВыполнитьШаги(ФайлСценария, НаборБиблиотечныхШагов, РезультатыВыполнения.Строки[0]); Возврат РезультатыВыполнения; КонецФункции @@ -266,7 +266,7 @@ Возврат ОписаниеИсполнителя; КонецФункции // ПолучитьИсполнителяШагов() -Функция РекурсивноВыполнитьШаги(Знач НаборБиблиотечныхШагов, Знач Узел) +Функция РекурсивноВыполнитьШаги(Знач ФайлСценария, Знач НаборБиблиотечныхШагов, Знач Узел) ТекущийУровень = Узел.Уровень(); ПредставлениеЛексемы = ?(Узел.ТипШага <> ВозможныеТипыШагов.Описание, Узел.Лексема +" ", ""); Если Узел.ТипШага <> ВозможныеТипыШагов.Шаг Тогда @@ -276,15 +276,22 @@ Лог.Отладка(СтрШаблон("Выполняю узел <%1>, адрес <%2>, тело <%3>", Узел.ТипШага, Узел.АдресШага, Узел.Тело)); СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; - СтатусВыполнения = ВыполнитьДействиеУзла(НаборБиблиотечныхШагов, Узел); + ХукВыполненУспешно = ВыполнитьХукУзла_ПередВыполнением(ФайлСценария, Узел); + Если Не ХукВыполненУспешно Тогда + СтатусВыполнения = ВозможныеСтатусыВыполнения.Сломался; + Иначе + + СтатусВыполнения = ВыполнитьДействиеУзла(НаборБиблиотечныхШагов, Узел); + + Для Каждого СтрокаДерева Из Узел.Строки Цикл + НовыйСтатус = РекурсивноВыполнитьШаги(ФайлСценария, НаборБиблиотечныхШагов, СтрокаДерева); + СтатусВыполнения = ЗапомнитьСамоеХудшееСостояние(СтатусВыполнения, НовыйСтатус); + Если СтатусВыполнения <> ВозможныеСтатусыВыполнения.Пройден и СтрокаДерева.ТипШага = ВозможныеТипыШагов.Шаг Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; - Для Каждого СтрокаДерева Из Узел.Строки Цикл - НовыйСтатус = РекурсивноВыполнитьШаги(НаборБиблиотечныхШагов, СтрокаДерева); - СтатусВыполнения = ЗапомнитьСамоеХудшееСостояние(СтатусВыполнения, НовыйСтатус); - Если СтатусВыполнения <> ВозможныеСтатусыВыполнения.Пройден и СтрокаДерева.ТипШага = ВозможныеТипыШагов.Шаг Тогда - Прервать; - КонецЕсли; - КонецЦикла; Узел.СтатусВыполнения = СтатусВыполнения; Если Узел.ТипШага <> ВозможныеТипыШагов.Шаг И Узел.ТипШага <> ВозможныеТипыШагов.Описание Тогда @@ -294,6 +301,48 @@ Возврат СтатусВыполнения; КонецФункции +Функция ВыполнитьХукУзла_ПередВыполнением(Знач ФайлСценария, Знач Узел, Знач ПредставлениеШага = "") + Рез = Истина; + Если Узел.ТипШага = ВозможныеТипыШагов.Сценарий Тогда + ОписаниеИсполнителяШагов = НайтиИсполнителяШагов(ФайлСценария); + Если ОписаниеИсполнителяШагов <> Неопределено Тогда + Рефлектор = Новый Рефлектор; + + АдресХука = "ПередЗапускомСценария"; + + СтрокаПараметров = "Узел"; + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Узел); + // ПолучитьМассивПараметров(МассивПараметров, ПараметрыШага, СтрокаПараметров); + + ИмяФайлаШагов = ОписаниеИсполнителяШагов.Файл.Имя; + // СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров)-1); + Лог.Отладка(СтрШаблон(" Выполняю шаг <%1>, параметры <%2>, источник %3", + АдресХука, СтрокаПараметров, ИмяФайлаШагов)); + + Попытка + Рефлектор.ВызватьМетод(ОписаниеИсполнителяШагов.Исполнитель, АдресХука, МассивПараметров); + + Исключение + + Инфо = ИнформацияОбОшибке(); + текстОшибки = ПодробноеПредставлениеОшибки(Инфо); //ОписаниеОшибки(); + + Если Инфо.Описание <> СтрШаблон("Метод объекта не обнаружен (%1)", АдресХука) Тогда + Рез = Ложь; + ПредставлениеШага = СтрШаблон("Не удалось выполнить хук <%1> для шага <%2> + |%3 + |%4", АдресХука, ИмяФайлаШагов, ПредставлениеШага, текстОшибки); + ВывестиСообщение(ПредставлениеШага, ВозможныеСтатусыВыполнения.Сломался); + КонецЕсли; + + КонецПопытки; + КонецЕсли; + КонецЕсли; + + Возврат Рез; +КонецФункции // ВыполнитьХукУзла_ПередВыполнением(Узел) + Функция ВыполнитьДействиеУзла(Знач НаборБиблиотечныхШагов, Знач Узел) СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; diff --git "a/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" "b/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" index 3061995..0818f78 100644 --- "a/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" +++ "b/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" @@ -13,8 +13,8 @@ Возврат ВсеШаги; КонецФункции -Процедура ПередЗапускомСценария() Экспорт - ЯЗаписываюВФайлЖурнала("ПередЗапускомСценария"); +Процедура ПередЗапускомСценария(Знач УзелОписанияСценария) Экспорт + ЯЗаписываюВФайлЖурнала(СтрШаблон("ПередЗапускомСценария-%1", УзелОписанияСценария.Тело)); КонецПроцедуры // Реализация шагов From 26760906eb8b212cc8e245b4684dcfcc4f2c83fa Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 17 Jul 2016 14:04:49 +0300 Subject: [PATCH 12/56] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=85=D1=83=D0=BA=D0=B0=20=D0=9F?= =?UTF-8?q?=D0=BE=D1=81=D0=BB=D0=B5=D0=97=D0=B0=D0=BF=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=D0=A1=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D1=8F=20#7=20?= =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=B2=D1=8B=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=85=D1=83=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/core/Hooks.feature | 2 +- src/bdd-exec.os | 27 +++++++++++++------ ...20\245\321\203\320\272\320\276\320\262.os" | 4 +++ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/features/core/Hooks.feature b/features/core/Hooks.feature index 14690fd..4a3ed3e 100644 --- a/features/core/Hooks.feature +++ b/features/core/Hooks.feature @@ -22,4 +22,4 @@ Тогда проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 1 И я подставил файл шагов фичи "ПроверкаХуков" из каталога "tests\fixtures" И проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 0 - И текст файла-журнала равен ";ПередЗапускомСценария-Запись в файл журнала;ШагСценария" \ No newline at end of file + И текст файла-журнала равен ";ПередЗапускомСценария-Запись в файл журнала;ШагСценария;ПослеЗапускаСценария-Запись в файл журнала" \ No newline at end of file diff --git a/src/bdd-exec.os b/src/bdd-exec.os index b58cf15..336ff73 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -23,6 +23,7 @@ Перем ВозможныеТипыШагов; Перем ВозможныеКлючиПараметров; Перем ВозможныеЦветаСтатусовВыполнения; +Перем ВозможныеХуки; Перем ТекущийУровень; @@ -276,7 +277,7 @@ Лог.Отладка(СтрШаблон("Выполняю узел <%1>, адрес <%2>, тело <%3>", Узел.ТипШага, Узел.АдресШага, Узел.Тело)); СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; - ХукВыполненУспешно = ВыполнитьХукУзла_ПередВыполнением(ФайлСценария, Узел); + ХукВыполненУспешно = ВыполнитьХукУзла(ВозможныеХуки.ПередЗапускомСценария, ФайлСценария, Узел); Если Не ХукВыполненУспешно Тогда СтатусВыполнения = ВозможныеСтатусыВыполнения.Сломался; Иначе @@ -291,6 +292,11 @@ КонецЕсли; КонецЦикла; КонецЕсли; + + ХукВыполненУспешно = ВыполнитьХукУзла(ВозможныеХуки.ПослеЗапускаСценария, ФайлСценария, Узел); + Если Не ХукВыполненУспешно Тогда + СтатусВыполнения = ВозможныеСтатусыВыполнения.Сломался; + КонецЕсли; Узел.СтатусВыполнения = СтатусВыполнения; @@ -301,22 +307,19 @@ Возврат СтатусВыполнения; КонецФункции -Функция ВыполнитьХукУзла_ПередВыполнением(Знач ФайлСценария, Знач Узел, Знач ПредставлениеШага = "") +Функция ВыполнитьХукУзла(Знач ОписаниеХука, Знач ФайлСценария, Знач Узел, Знач ПредставлениеШага = "") Рез = Истина; - Если Узел.ТипШага = ВозможныеТипыШагов.Сценарий Тогда + Если Узел.ТипШага = ОписаниеХука.ТипШага Тогда + АдресХука = ОписаниеХука.АдресШага; ОписаниеИсполнителяШагов = НайтиИсполнителяШагов(ФайлСценария); Если ОписаниеИсполнителяШагов <> Неопределено Тогда Рефлектор = Новый Рефлектор; - АдресХука = "ПередЗапускомСценария"; - СтрокаПараметров = "Узел"; МассивПараметров = Новый Массив; МассивПараметров.Добавить(Узел); - // ПолучитьМассивПараметров(МассивПараметров, ПараметрыШага, СтрокаПараметров); ИмяФайлаШагов = ОписаниеИсполнителяШагов.Файл.Имя; - // СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров)-1); Лог.Отладка(СтрШаблон(" Выполняю шаг <%1>, параметры <%2>, источник %3", АдресХука, СтрокаПараметров, ИмяФайлаШагов)); @@ -326,7 +329,7 @@ Исключение Инфо = ИнформацияОбОшибке(); - текстОшибки = ПодробноеПредставлениеОшибки(Инфо); //ОписаниеОшибки(); + текстОшибки = ПодробноеПредставлениеОшибки(Инфо); Если Инфо.Описание <> СтрШаблон("Метод объекта не обнаружен (%1)", АдресХука) Тогда Рез = Ложь; @@ -548,6 +551,13 @@ Возврат Рез; КонецФункции // СтатусыВыполнения() +Функция СоздатьВозможныеХуки() + Рез = Новый Структура; + Рез.Вставить("ПередЗапускомСценария", Новый Структура("АдресШага,ТипШага", "ПередЗапускомСценария", ВозможныеТипыШагов.Сценарий)); + Рез.Вставить("ПослеЗапускаСценария", Новый Структура("АдресШага,ТипШага", "ПослеЗапускаСценария", ВозможныеТипыШагов.Сценарий)); + Возврат Новый ФиксированнаяСтруктура(Рез); +КонецФункции // СоздатьВозможныеХуки() + Функция Инициализация() Лог = Логирование.ПолучитьЛог(ИмяЛога()); Лог.УстановитьРаскладку(ЭтотОбъект); @@ -561,6 +571,7 @@ ВозможныеТипыШагов = ЧитательГеркин.ВозможныеТипыШагов(); ВозможныеКлючиПараметров = ЧитательГеркин.ВозможныеКлючиПараметров(); + ВозможныеХуки = СоздатьВозможныеХуки(); КонецФункции // } diff --git "a/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" "b/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" index 0818f78..e594df4 100644 --- "a/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" +++ "b/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" @@ -17,6 +17,10 @@ ЯЗаписываюВФайлЖурнала(СтрШаблон("ПередЗапускомСценария-%1", УзелОписанияСценария.Тело)); КонецПроцедуры +Процедура ПослеЗапускаСценария(Знач УзелОписанияСценария) Экспорт + ЯЗаписываюВФайлЖурнала(СтрШаблон("ПослеЗапускаСценария-%1", УзелОписанияСценария.Тело)); +КонецПроцедуры + // Реализация шагов //я записываю "ШагСценария" в файл журнала From 4a9bafecb4f0ea2178435ed931f03bafbd3bf7c1 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 17 Jul 2016 17:10:50 +0300 Subject: [PATCH 13/56] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B3=D0=BB=D1=83=D1=88?= =?UTF-8?q?=D0=B5=D0=BA=20=D1=85=D1=83=D0=BA=D0=BE=D0=B2=20=D0=9F=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=97=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=A1=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D1=8F=20=D0=B8?= =?UTF-8?q?=20=D0=9F=D0=BE=D1=81=D0=BB=D0=B5=D0=97=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D0=A1=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20=D1=84=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=20#7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\320\260\321\206\320\270\320\270.feature" | 2 +- src/bdd-exec.os | 13 ++----- src/bdd-generate.os | 36 ++++++++++++++++--- src/gherkin-read.os | 16 +++++++++ 4 files changed, 51 insertions(+), 16 deletions(-) diff --git "a/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" "b/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" index 08ce3f9..5d58b71 100644 --- "a/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" +++ "b/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" @@ -39,6 +39,6 @@ Когда я подготовил специальную тестовую фичу "ПередачаПараметров" И я подставил файл шагов с уже реализованными шагами для фичи "ПередачаПараметров" - И я запустил генерацию шагов фичи "ПередачаПараметров" + И я запустил генерацию шагов фичи "ПередачаПараметров" с передачей параметра "-verbose off" Тогда я получил сгенерированный os-файл "ПередачаПараметров" в ожидаемом каталоге И проверка поведения фичи "ПередачаПараметров" закончилась с кодом возврата 0 diff --git a/src/bdd-exec.os b/src/bdd-exec.os index 336ff73..fbe5718 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -23,7 +23,6 @@ Перем ВозможныеТипыШагов; Перем ВозможныеКлючиПараметров; Перем ВозможныеЦветаСтатусовВыполнения; -Перем ВозможныеХуки; Перем ТекущийУровень; @@ -277,7 +276,7 @@ Лог.Отладка(СтрШаблон("Выполняю узел <%1>, адрес <%2>, тело <%3>", Узел.ТипШага, Узел.АдресШага, Узел.Тело)); СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; - ХукВыполненУспешно = ВыполнитьХукУзла(ВозможныеХуки.ПередЗапускомСценария, ФайлСценария, Узел); + ХукВыполненУспешно = ВыполнитьХукУзла(ЧитательГеркин.ВозможныеХуки().ПередЗапускомСценария, ФайлСценария, Узел); Если Не ХукВыполненУспешно Тогда СтатусВыполнения = ВозможныеСтатусыВыполнения.Сломался; Иначе @@ -293,7 +292,7 @@ КонецЦикла; КонецЕсли; - ХукВыполненУспешно = ВыполнитьХукУзла(ВозможныеХуки.ПослеЗапускаСценария, ФайлСценария, Узел); + ХукВыполненУспешно = ВыполнитьХукУзла(ЧитательГеркин.ВозможныеХуки().ПослеЗапускаСценария, ФайлСценария, Узел); Если Не ХукВыполненУспешно Тогда СтатусВыполнения = ВозможныеСтатусыВыполнения.Сломался; КонецЕсли; @@ -551,13 +550,6 @@ Возврат Рез; КонецФункции // СтатусыВыполнения() -Функция СоздатьВозможныеХуки() - Рез = Новый Структура; - Рез.Вставить("ПередЗапускомСценария", Новый Структура("АдресШага,ТипШага", "ПередЗапускомСценария", ВозможныеТипыШагов.Сценарий)); - Рез.Вставить("ПослеЗапускаСценария", Новый Структура("АдресШага,ТипШага", "ПослеЗапускаСценария", ВозможныеТипыШагов.Сценарий)); - Возврат Новый ФиксированнаяСтруктура(Рез); -КонецФункции // СоздатьВозможныеХуки() - Функция Инициализация() Лог = Логирование.ПолучитьЛог(ИмяЛога()); Лог.УстановитьРаскладку(ЭтотОбъект); @@ -571,7 +563,6 @@ ВозможныеТипыШагов = ЧитательГеркин.ВозможныеТипыШагов(); ВозможныеКлючиПараметров = ЧитательГеркин.ВозможныеКлючиПараметров(); - ВозможныеХуки = СоздатьВозможныеХуки(); КонецФункции // } diff --git a/src/bdd-generate.os b/src/bdd-generate.os index 6127f24..1dd899b 100644 --- a/src/bdd-generate.os +++ b/src/bdd-generate.os @@ -60,11 +60,11 @@ Функция СоздатьФайлРеализацииШагов(Знач ФайлФичи, Знач НаборБиблиотечныхШагов) Лог.Отладка("Подготовка к генерации шагов спецификации "+ФайлФичи.ПолноеИмя); - Ожидаем.Что(ФайлФичи, "Ожидали, что файл фичи будет передан как файл, а это не так").ИмеетТип("Файл"); + Ожидаем.Что(ФайлФичи, "Ожидали, что файл фичи будет передан как файл, а это не так").ИмеетТип("Файл"); РезультатыРазбора = ЧитательГеркин.ПрочитатьФайлСценария(ФайлФичи); ДеревоФич = РезультатыРазбора.ДеревоФич; - Ожидаем.Что(ДеревоФич, "Ожидали, что дерево фич будет передано как дерево значений, а это не так").ИмеетТип("ДеревоЗначений"); + Ожидаем.Что(ДеревоФич, "Ожидали, что дерево фич будет передано как дерево значений, а это не так").ИмеетТип("ДеревоЗначений"); ФайлШагов = ПолучитьФайлШагов(ФайлФичи); ИсключитьФайлШаговИзБиблиотечныхШагов(НаборБиблиотечныхШагов, ФайлШагов); @@ -154,6 +154,10 @@ КонецЕсли; ЗаписатьОписанияШаговВФайлШагов(ОписаниеЗаписываемогоФайла, НаборШаговФичи); + ЗаписатьОписанияХуковВФайлШагов(ЧитательГеркин.ВозможныеХуки().ПередЗапускомСценария, "Процедура выполняется перед запуском каждого сценария", + ОписаниеЗаписываемогоФайла); + ЗаписатьОписанияХуковВФайлШагов(ЧитательГеркин.ВозможныеХуки().ПослеЗапускаСценария, "Процедура выполняется после завершения каждого сценария", + ОписаниеЗаписываемогоФайла); Если Не ЭтоПервичнаяГенерация Тогда ЗаписатьМетодыВФайл(ТаблицаМодуляШагов, НаборМетодовМодуляШагов, Буфер); @@ -291,15 +295,39 @@ Буфер.Добавить(""); Буфер.Добавить(Символы.Таб + "Возврат ВсеШаги;"); Буфер.Добавить("КонецФункции"); + Буфер.Добавить(""); Если ЭтоПервичнаяГенерация Тогда - Буфер.Добавить(""); Буфер.Добавить("// Реализация шагов"); Буфер.Добавить(""); КонецЕсли; КонецПроцедуры +Процедура ЗаписатьОписанияХуковВФайлШагов(Знач ОписаниеХука, Знач КомментарийДляХука, ОписаниеЗаписываемогоФайла) //, ЗНач НаборШаговФичи) + Буфер = ОписаниеЗаписываемогоФайла.Буфер; + ЭтоПервичнаяГенерация = ОписаниеЗаписываемогоФайла.ЭтоПервичнаяГенерация; + ТаблицаМодуляШагов = ОписаниеЗаписываемогоФайла.ТаблицаМодуляШагов; + НаборМетодовМодуляШагов = ОписаниеЗаписываемогоФайла.НаборМетодовМодуляШагов; + ФайлШагов = ОписаниеЗаписываемогоФайла.ФайлШагов; + + АдресХука = ОписаниеХука.АдресШага; + + Если Не ЭтоПервичнаяГенерация Тогда + ОписаниеМетода = НаборМетодовМодуляШагов.Найти(АдресХука, "НормализованноеИмяМетода"); + Если ОписаниеМетода <> Неопределено Тогда + ВывестиВБуферСтрокиТаблицы(Буфер, ТаблицаМодуляШагов, ОписаниеМетода.НомерСтрокиБлокаДоМетода, ОписаниеМетода.НомерСтрокиНачала-1); + КонецЕсли; + КонецЕсли; + Буфер.Добавить(СтрШаблон("// %1", КомментарийДляХука)); + + Буфер.Добавить(СтрШаблон("Процедура %1(Знач Узел) Экспорт", АдресХука)); + Буфер.Добавить(Символы.Таб); + Буфер.Добавить("КонецПроцедуры"); + Буфер.Добавить(""); + +КонецПроцедуры + Процедура ВывестиВБуферСтрокиТаблицы(Буфер, ТаблицаМодуляШагов, Начало, Окончание) Для Счетчик = Начало По Окончание Цикл Строка = ТаблицаМодуляШагов[Счетчик].Строка; @@ -428,7 +456,7 @@ Номер = Номер + 1; КонецЦикла; СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров)-1); - КонецЕсли; + КонецЕсли; Возврат СтрокаПараметров; КонецФункции // ПолучитьСтрокуПараметров() diff --git a/src/gherkin-read.os b/src/gherkin-read.os index 335922c..d71d6df 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -25,6 +25,7 @@ Перем ВозможныеТипыНачалаСтроки; Перем ВозможныеКлючевыеСлова; Перем ВозможныеКлючиПараметров; +Перем ВозможныеХуки; Перем УровниЛексем; Перем ТипыШагов; @@ -89,6 +90,10 @@ Возврат Новый ФиксированнаяСтруктура(Рез); КонецФункции +Функция ВозможныеХуки() Экспорт + Возврат ВозможныеХуки; +КонецФункции // ВозможныеХуки() + Функция СоздатьДеревоФич() Экспорт Рез = Новый ДеревоЗначений; Рез.Колонки.Добавить("Лексема"); @@ -967,6 +972,7 @@ ВозможныеТипыШагов = ВозможныеТипыШагов(); ВозможныеТипыНачалаСтроки = ВозможныеТипыНачалаСтроки(); ВозможныеКлючиПараметров = ВозможныеКлючиПараметров(); + ВозможныеХуки = СоздатьВозможныеХуки(); ОписанияЛексем = ОписанияЛексем(); @@ -1111,6 +1117,16 @@ Возврат Соответствие; КонецФункции // СоздатьНаборЗаменДляНормализацииАдресаШага() + +// возвращает Структуру, в которой ключ - имя хука, а значение - Структура с ключами АдресШага и ТипШага +Функция СоздатьВозможныеХуки() + Рез = Новый Структура; + //TODO добавить возможность единого набора хуков "до выполнения" и "после выполнения" шагов различных типов + //Например, перед запуском - для сценариев, шагов + Рез.Вставить("ПередЗапускомСценария", Новый Структура("АдресШага,ТипШага", "ПередЗапускомСценария", ВозможныеТипыШагов.Сценарий)); + Рез.Вставить("ПослеЗапускаСценария", Новый Структура("АдресШага,ТипШага", "ПослеЗапускаСценария", ВозможныеТипыШагов.Сценарий)); + Возврат Новый ФиксированнаяСтруктура(Рез); +КонецФункции // СоздатьВозможныеХуки() // } /////////////////////////////////////////////////////////////////// From 5304007c05da522e8700cd35859a32db5a311c09 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 17 Jul 2016 17:18:39 +0300 Subject: [PATCH 14/56] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20-=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=85=D1=83=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=97=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D0=BC=D0=A1=D1=86=D0=B5=D0=BD=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D1=8F=20#7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/core/Hooks.feature | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/features/core/Hooks.feature b/features/core/Hooks.feature index 4a3ed3e..02a191c 100644 --- a/features/core/Hooks.feature +++ b/features/core/Hooks.feature @@ -22,4 +22,26 @@ Тогда проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 1 И я подставил файл шагов фичи "ПроверкаХуков" из каталога "tests\fixtures" И проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 0 - И текст файла-журнала равен ";ПередЗапускомСценария-Запись в файл журнала;ШагСценария;ПослеЗапускаСценария-Запись в файл журнала" \ No newline at end of file + И текст файла-журнала равен ";ПередЗапускомСценария-Запись в файл журнала;ШагСценария;ПослеЗапускаСценария-Запись в файл журнала" + +Контекст: Подготовка файла фичи "ПроверкаХуков" с наличием контекста + Когда я подготовил тестовый каталог для фич + И установил тестовый каталог как текущий + И я создал файл фичи "ПроверкаХуков" с текстом + """ + # language: ru + Функционал: Проверка хуков + Контекст: шаги контекста + Тогда я записываю "ШагКонтекста" в файл журнала + Сценарий: Запись в файл журнала с контекстом + Тогда я записываю "ШагСценария" в файл журнала + """ + И я запустил генерацию шагов фичи "ПроверкаХуков" + И я получил сгенерированный os-файл "ПроверкаХуков" в ожидаемом каталоге + +Сценарий: Выполнение контекста после хука ПередЗапускомСценария + + Тогда проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 1 + И я подставил файл шагов фичи "ПроверкаХуков" из каталога "tests\fixtures" + И проверка поведения фичи "ПроверкаХуков" закончилась с кодом возврата 0 + И текст файла-журнала равен ";ПередЗапускомСценария-Запись в файл журнала с контекстом;ШагКонтекста;ШагСценария;ПослеЗапускаСценария-Запись в файл журнала с контекстом" From f2377eeb6d088e1321d7fd53759e5cef7665b425 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Mon, 18 Jul 2016 21:38:22 +0300 Subject: [PATCH 15/56] =?UTF-8?q?=D0=9F=D1=80=D0=B8=20=D0=B2=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20=D1=84=D0=B8=D1=87?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D1=81=D0=B2=D0=BE=D0=B4=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=20=D0=BF=D0=BE=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8E=20fix=20#40?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bdd-exec.os | 20 +++++++++++--------- src/bdd.os | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/bdd-exec.os b/src/bdd-exec.os index fbe5718..bd9f746 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -56,7 +56,7 @@ Возврат РезультатыВыполнения; КонецФункции -Процедура ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения) Экспорт +Процедура ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, Знач ПоказыватьИтогиФич) Экспорт МассивИтогов = Новый Массив; МассивИтогов.Добавить(ВозможныеТипыШагов.Функциональность); МассивИтогов.Добавить(ВозможныеТипыШагов.Сценарий); @@ -67,7 +67,7 @@ СтруктураИтогов.Вставить(Элем, СтатусыВыполненияДляПодсчета()); КонецЦикла; - РекурсивноПосчитатьИтогиВыполнения(РезультатыВыполнения.Строки[0], СтруктураИтогов); + РекурсивноПосчитатьИтогиВыполнения(РезультатыВыполнения, СтруктураИтогов); ИмяПоляИтога = "Итог"; Для каждого Итоги Из СтруктураИтогов Цикл @@ -80,7 +80,7 @@ Для каждого Элем Из МассивИтогов Цикл Итог = СтруктураИтогов[Элем]; ВыводимИтог = Истина; - Если Элем = ВозможныеТипыШагов.Функциональность И Итог[ИмяПоляИтога] = 1 Тогда + Если НЕ ПоказыватьИтогиФич И Элем = ВозможныеТипыШагов.Функциональность И Итог[ИмяПоляИтога] = 1 Тогда ВыводимИтог = Ложь; КонецЕсли; Если ВыводимИтог Тогда @@ -428,13 +428,15 @@ КонецФункции // СобратьЕдиноеДеревоИзНабораРезультатовВыполнения(НаборРезультатовВыполнения) Процедура РекурсивноПосчитатьИтогиВыполнения(Узел, СтруктураИтогов) - НужныйИтог = Неопределено; - ЕстьИтог = СтруктураИтогов.Свойство(Узел.ТипШага, НужныйИтог); - Если НЕ ЕстьИтог Тогда - Возврат; - КонецЕсли; + Если ТипЗнч(Узел) <> Тип("ДеревоЗначений") Тогда + НужныйИтог = Неопределено; + ЕстьИтог = СтруктураИтогов.Свойство(Узел.ТипШага, НужныйИтог); + Если НЕ ЕстьИтог Тогда + Возврат; + КонецЕсли; - НужныйИтог[Узел.СтатусВыполнения] = НужныйИтог[Узел.СтатусВыполнения] + 1; + НужныйИтог[Узел.СтатусВыполнения] = НужныйИтог[Узел.СтатусВыполнения] + 1; + КонецЕсли; Для Каждого СтрокаДерева Из Узел.Строки Цикл РекурсивноПосчитатьИтогиВыполнения(СтрокаДерева, СтруктураИтогов); diff --git a/src/bdd.os b/src/bdd.os index e5f54c3..06b7e7d 100644 --- a/src/bdd.os +++ b/src/bdd.os @@ -169,7 +169,7 @@ КодВозврата = ИсполнительБДД.ВозможныеКодыВозвратовПроцесса()[РезультатыВыполнения.Строки[0].СтатусВыполнения]; - ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения); + ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, ФайлФичи.ЭтоКаталог()); Возврат КодВозврата; КонецФункции From c5d831869382af9ce62d6c772174354181f15c63 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Mon, 18 Jul 2016 23:57:48 +0300 Subject: [PATCH 16/56] =?UTF-8?q?=D0=94=D0=B5=D0=BC=D0=BE=D0=BD=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B1=D0=B0=D0=B3=D0=B0?= =?UTF-8?q?=20#61?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\320\265\321\200\320\260\321\206\320\270\320\270.feature" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" "b/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" index 5d58b71..af78e49 100644 --- "a/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" +++ "b/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" @@ -42,3 +42,7 @@ И я запустил генерацию шагов фичи "ПередачаПараметров" с передачей параметра "-verbose off" Тогда я получил сгенерированный os-файл "ПередачаПараметров" в ожидаемом каталоге И проверка поведения фичи "ПередачаПараметров" закончилась с кодом возврата 0 + #повторная перегенерация для проверки ошибок + И я запустил генерацию шагов фичи "ПередачаПараметров" с передачей параметра "-verbose off" + И я получил сгенерированный os-файл "ПередачаПараметров" в ожидаемом каталоге + И проверка поведения фичи "ПередачаПараметров" закончилась с кодом возврата 0 From fbe355f1f9c41a472e1bb846c0f73b6ac7191e99 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Tue, 19 Jul 2016 20:03:25 +0300 Subject: [PATCH 17/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=85=D1=83=D0=BA=D0=BE=D0=B2=20fix=20#61?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bdd-generate.os | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bdd-generate.os b/src/bdd-generate.os index 1dd899b..5236a9d 100644 --- a/src/bdd-generate.os +++ b/src/bdd-generate.os @@ -317,6 +317,8 @@ ОписаниеМетода = НаборМетодовМодуляШагов.Найти(АдресХука, "НормализованноеИмяМетода"); Если ОписаниеМетода <> Неопределено Тогда ВывестиВБуферСтрокиТаблицы(Буфер, ТаблицаМодуляШагов, ОписаниеМетода.НомерСтрокиБлокаДоМетода, ОписаниеМетода.НомерСтрокиНачала-1); + Иначе + Возврат; КонецЕсли; КонецЕсли; Буфер.Добавить(СтрШаблон("// %1", КомментарийДляХука)); From efb28938ee60c844c585a776350d1dc8182f9d76 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Tue, 19 Jul 2016 20:47:39 +0300 Subject: [PATCH 18/56] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B3=D0=BE=D0=BD=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=D1=85=20=D1=84=D0=B8=D1=87=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D1=8F=D1=8E=20=D1=81=D0=BF=D0=B5=D1=86=D0=B8=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D1=83=20=D0=B2=D1=81=D0=B5=D1=85=20=D1=84=D0=B8=D1=87=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0?= =?UTF-8?q?=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/tasks.json | 4 +- ...20\276\320\265\320\272\321\202\320\260.os" | 75 ------------------- 2 files changed, 2 insertions(+), 77 deletions(-) delete mode 100644 "features/core/step_definitions/\320\237\321\200\320\276\320\263\320\276\320\275\320\222\321\201\320\265\321\205\320\244\320\270\321\207\320\237\321\200\320\276\320\265\320\272\321\202\320\260.os" diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 07a4a0f..754c468 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -30,10 +30,10 @@ } }, { - "taskName": "Exec main feature", + "taskName": "Exec all features", "args": [ "${workspaceRoot}/src/bdd.os", - "${workspaceRoot}/features/core/ПрогонВсехФичПроекта.feature", + "${workspaceRoot}/features/core", "-out", "${workspaceRoot}/exec.log" ], diff --git "a/features/core/step_definitions/\320\237\321\200\320\276\320\263\320\276\320\275\320\222\321\201\320\265\321\205\320\244\320\270\321\207\320\237\321\200\320\276\320\265\320\272\321\202\320\260.os" "b/features/core/step_definitions/\320\237\321\200\320\276\320\263\320\276\320\275\320\222\321\201\320\265\321\205\320\244\320\270\321\207\320\237\321\200\320\276\320\265\320\272\321\202\320\260.os" deleted file mode 100644 index 5a134cb..0000000 --- "a/features/core/step_definitions/\320\237\321\200\320\276\320\263\320\276\320\275\320\222\321\201\320\265\321\205\320\244\320\270\321\207\320\237\321\200\320\276\320\265\320\272\321\202\320\260.os" +++ /dev/null @@ -1,75 +0,0 @@ -#Использовать logos - -Перем Лог; -Перем БДД; - -Перем ПомощникТестирования; -Перем НаборФичКаталогаПроекта; - -Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт - БДД = КонтекстФреймворкаBDD; - - ВсеШаги = Новый Массив; - - ВсеШаги.Добавить("ЯВыполнилПодключениеТестовогоСкрипта"); - ВсеШаги.Добавить("ЯПолучилНаборФичИзКаталогаФичПроектаИсключаяТекущуюФичу"); - ВсеШаги.Добавить("УстановилКаталогаФичПроектаКакТекущий"); - ВсеШаги.Добавить("ПроверкаПоведенияКаждойФичиИзНабораФичЗакончиласьСКодомВозврата"); - - Возврат ВсеШаги; -КонецФункции - -//я выполнил подключение тестового скрипта "ПроверкаГенерации" -Процедура ЯВыполнилПодключениеТестовогоСкрипта(ИмяСкрипта) Экспорт - ПомощникТестирования = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, ИмяСкрипта+".os")); - - ДопЛог = Логирование.ПолучитьЛог(ПомощникТестирования.ИмяЛога()); - ДопЛог.УстановитьУровень(Лог.Уровень()); -КонецПроцедуры - -//я получил набор фич из каталога фич проекта исключая текущую фичу -Процедура ЯПолучилНаборФичИзКаталогаФичПроектаИсключаяТекущуюФичу() Экспорт - НаборФичКаталогаПроекта = НайтиФайлы(КаталогФич().ПолноеИмя, "*.feature"); - ФайлТекущегоСценария = Новый Файл(ТекущийСценарий().Источник); - Номер = -1; - Для каждого ФайлФичи Из НаборФичКаталогаПроекта Цикл - Номер = Номер + 1; - Если ФайлФичи.ИмяБезРасширения = ФайлТекущегоСценария.ИмяБезРасширения Тогда - НаборФичКаталогаПроекта.Удалить(Номер); - Прервать; - КонецЕсли; - КонецЦикла; -КонецПроцедуры - -//проверка поведения каждой фичи из набора фич закончилась с кодом возврата 0 -Процедура ПроверкаПоведенияКаждойФичиИзНабораФичЗакончиласьСКодомВозврата(ОжидаемыйКодВозврата) Экспорт - МассивОшибочныхФич = Новый Массив; - Для каждого ФайлФичи Из НаборФичКаталогаПроекта Цикл - ИмяФичи = ФайлФичи.ИмяБезРасширения; - Лог.Информация("Проверяю фичу "+ИмяФичи); - Попытка - ПомощникТестирования.ПроверкаПоведенияФичиЗакончиласьСКодомВозврата(ИмяФичи, ОжидаемыйКодВозврата); - Исключение - МассивОшибочныхФич.Добавить(ИмяФичи); - КонецПопытки; - КонецЦикла; - Если ЗначениеЗаполнено(МассивОшибочныхФич) Тогда - Лог.Информация("Ошибочные фичи:"); - Для каждого ИмяФичи Из МассивОшибочныхФич Цикл - Лог.Информация("Фича - "+ИмяФичи); - КонецЦикла; - ВызватьИсключение "Есть упавшие фичи"; - КонецЕсли; -КонецПроцедуры - -//установил каталога фич проекта как текущий -Процедура УстановилКаталогаФичПроектаКакТекущий() Экспорт - УстановитьТекущийКаталог(КаталогФич().ПолноеИмя); -КонецПроцедуры - -Функция КаталогФич() - Возврат Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "..")); -КонецФункции // КаталогФич() - -Лог = Логирование.ПолучитьЛог("bdd.ВыполнениеФич.feature"); -//Лог.УстановитьУровень(УровниЛога.Отладка); From 4d4358ec79fe323b2812ea8d61e5d1d80c1df24a Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Wed, 20 Jul 2016 13:17:40 +0300 Subject: [PATCH 19/56] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B3=D0=BE=D0=BD=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=D1=85=20=D1=84=D0=B8=D1=87=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D1=8F=D1=8E=20=D0=BA=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D0=BE=D0=B9=20=D0=BF=D1=80=D0=BE=D0=B3=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=84=D0=B8=D1=87=20=D0=B8=D0=B7=20=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0=20core=20=D0=A3=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D1=8F=D1=8E=20=D1=80=D0=B0=D0=BD=D0=B5=D0=B5=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=83=D1=8E=20=D1=81=D0=BF=D0=B5=D1=86=D0=B8=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=83=D1=8E=20=D1=83=D1=81=D1=82=D0=B0=D1=80=D0=B5?= =?UTF-8?q?=D0=B2=D1=88=D1=83=D1=8E=20=D1=84=D0=B8=D1=87=D1=83=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3=D0=BE=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=D1=85=20=D1=84=D0=B8=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\320\276\320\265\320\272\321\202\320\260.feature" | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 "features/core/\320\237\321\200\320\276\320\263\320\276\320\275\320\222\321\201\320\265\321\205\320\244\320\270\321\207\320\237\321\200\320\276\320\265\320\272\321\202\320\260.feature" diff --git "a/features/core/\320\237\321\200\320\276\320\263\320\276\320\275\320\222\321\201\320\265\321\205\320\244\320\270\321\207\320\237\321\200\320\276\320\265\320\272\321\202\320\260.feature" "b/features/core/\320\237\321\200\320\276\320\263\320\276\320\275\320\222\321\201\320\265\321\205\320\244\320\270\321\207\320\237\321\200\320\276\320\265\320\272\321\202\320\260.feature" deleted file mode 100644 index ce19c0c..0000000 --- "a/features/core/\320\237\321\200\320\276\320\263\320\276\320\275\320\222\321\201\320\265\321\205\320\244\320\270\321\207\320\237\321\200\320\276\320\265\320\272\321\202\320\260.feature" +++ /dev/null @@ -1,12 +0,0 @@ -# language: ru - -Функционал: Выполнение фич - Как Разработчик - Я Хочу, чтобы у меня была возможность протестировать все фичи из каталога проекта - -Сценарий: Выполнение всех фич из каталога фич проекта - - Когда я выполнил подключение тестового скрипта "ПроверкаГенерации" - И я получил набор фич из каталога фич проекта исключая текущую фичу - И установил каталога фич проекта как текущий - Тогда проверка поведения каждой фичи из набора фич закончилась с кодом возврата 0 From 385994577cdc1cd3d2b8522b48b4e743382de3ee Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Wed, 20 Jul 2016 20:26:26 +0300 Subject: [PATCH 20/56] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=BC=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=B1=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8?= =?UTF-8?q?=20=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20=D1=88=D0=B0=D0=B3=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8=20#23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\202\320\265\320\272\321\201\321\202.os" | 39 +++++++++++++++++++ ...2\320\265\320\272\321\201\321\202.feature" | 14 +++++++ src/bdd-exec.os | 16 ++++++++ 3 files changed, 69 insertions(+) create mode 100644 "features/core/step_definitions/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.os" create mode 100644 "features/core/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.feature" diff --git "a/features/core/step_definitions/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.os" "b/features/core/step_definitions/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.os" new file mode 100644 index 0000000..9b9fd96 --- /dev/null +++ "b/features/core/step_definitions/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.os" @@ -0,0 +1,39 @@ +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("ЯСохранилКлючИЗначениеВПрограммномКонтексте"); + ВсеШаги.Добавить("ЯПолучаюКлючИЗначениеИзПрограммногоКонтекста"); + + Возврат ВсеШаги; +КонецФункции + +// Реализация шагов + +// Процедура выполняется перед запуском каждого сценария +Процедура ПередЗапускомСценария(Знач Узел) Экспорт + +КонецПроцедуры + +// Процедура выполняется после завершения каждого сценария +Процедура ПослеЗапускаСценария(Знач Узел) Экспорт + +КонецПроцедуры + +//Я сохранил ключ "Ключ1" и значение 10 в программном контексте +Процедура ЯСохранилКлючИЗначениеВПрограммномКонтексте(Знач Ключ, Знач Значение) Экспорт + БДД.СохранитьВКонтекст(Ключ, Значение); +КонецПроцедуры + +//я получаю ключ "Ключ1" и значение 10 из программного контекста +Процедура ЯПолучаюКлючИЗначениеИзПрограммногоКонтекста(Знач Ключ, Знач ОжидаемоеЗначение) Экспорт + НовоеЗначение = БДД.ПолучитьИзКонтекста(Ключ); + Ожидаем.Что(НовоеЗначение).Равно(ОжидаемоеЗначение); +КонецПроцедуры + diff --git "a/features/core/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.feature" "b/features/core/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.feature" new file mode 100644 index 0000000..e0119cc --- /dev/null +++ "b/features/core/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.feature" @@ -0,0 +1,14 @@ +# language: ru + +Функционал: Использование программного контекста + Как Разработчик + Я Хочу чтобы шаги разных сценариев могли обмениваться данными через програмнный контекст продукта + +Сценарий: Первый сценарий + + Когда Я сохранил ключ "Ключ1" и значение 10 в программном контексте + И я получаю ключ "Ключ1" и значение 10 из программного контекста + +Сценарий: Следующий сценарий + + Тогда я получаю ключ "Ключ1" и значение 10 из программного контекста diff --git a/src/bdd-exec.os b/src/bdd-exec.os index bd9f746..914b488 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -26,9 +26,23 @@ Перем ТекущийУровень; +Перем Контекст; + //////////////////////////////////////////////////////////////////// //{ Программный интерфейс +//{ использование контекста внутри шагов сценариев + +// Параметры специально передаются без "Знач" для универсальности +Процедура СохранитьВКонтекст(Ключ, Значение) Экспорт + Контекст.Вставить(Ключ, Значение); +КонецПроцедуры + +Функция ПолучитьИзКонтекста(Знач Ключ) Экспорт + Возврат Контекст[Ключ]; +КонецФункции // ПолучитьИзКонтекста(Знач Ключ) Экспорт +// } + Функция ВыполнитьФичу(Знач ФайлФичи, Знач ФайлБиблиотек = Неопределено, Знач ИскатьВПодкаталогах = Истина) Экспорт НаборБиблиотечныхШагов = ПолучитьНаборБиблиотечныхШагов(ФайлБиблиотек); Лог.Отладка(СтрШаблон("Найдено библиотечных шагов: %1 шт.", ?(ЗначениеЗаполнено(НаборБиблиотечныхШагов), НаборБиблиотечныхШагов.Количество(), "0"))); @@ -565,6 +579,8 @@ ВозможныеТипыШагов = ЧитательГеркин.ВозможныеТипыШагов(); ВозможныеКлючиПараметров = ЧитательГеркин.ВозможныеКлючиПараметров(); + + Контекст = Новый Соответствие(); КонецФункции // } From 5a6ffd0a8e91df5d060ad6a4a7ea074cbcd0f047 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Thu, 21 Jul 2016 09:08:08 +0300 Subject: [PATCH 21/56] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D1=82=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20?= =?UTF-8?q?=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20=D0=B8=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=B1=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8=20=D0=BC?= =?UTF-8?q?=D0=B5=D0=B6=D0=B4=D1=83=20=D1=88=D0=B0=D0=B3=D0=B0=D0=BC=D0=B8?= =?UTF-8?q?=20#23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/README.md b/README.md index 9471a50..b1c1ccd 100644 --- a/README.md +++ b/README.md @@ -45,3 +45,62 @@ oscript bdd.os <команда> <параметры команды> [ключи] Для подсказки по конкретной команде наберите `bdd help <команда>`. + +# Формат файла шагов + +Это обычный os-скрипт, который располагает в подкаталоге step_definitions относительно файла фичи. + +В этом файле должна быть служебная функция `ПолучитьСписокШагов`, которая возвращает массив всех шагов, заданных в этом скрипте. + +Также внутри файла шагов могут располагаться специальные методы-обработчики (хуки) событий ПередЗапускомСценария/ПослеЗапускаСценария + +## Пример файла шагов + +``` +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("ЯСохранилКлючИЗначениеВПрограммномКонтексте"); + ВсеШаги.Добавить("ЯПолучаюКлючИЗначениеИзПрограммногоКонтекста"); + + Возврат ВсеШаги; +КонецФункции + +// Реализация шагов + +// Процедура выполняется перед запуском каждого сценария +Процедура ПередЗапускомСценария(Знач Узел) Экспорт + +КонецПроцедуры + +// Процедура выполняется после завершения каждого сценария +Процедура ПослеЗапускаСценария(Знач Узел) Экспорт + +КонецПроцедуры + +//Я сохранил ключ "Ключ1" и значение 10 в программном контексте +Процедура ЯСохранилКлючИЗначениеВПрограммномКонтексте(Знач Ключ, Знач Значение) Экспорт + БДД.СохранитьВКонтекст(Ключ, Значение); +КонецПроцедуры + +//я получаю ключ "Ключ1" и значение 10 из программного контекста +Процедура ЯПолучаюКлючИЗначениеИзПрограммногоКонтекста(Знач Ключ, Знач ОжидаемоеЗначение) Экспорт + НовоеЗначение = БДД.ПолучитьИзКонтекста(Ключ); + Ожидаем.Что(НовоеЗначение).Равно(ОжидаемоеЗначение); +КонецПроцедуры +``` + +# Программный контекст + +Для обмена информацией внутри кода реализации шагов можно использовать API контекста, предоставляемый продуктом. + +Описание: ++ `Процедура СохранитьВКонтекст(Ключ, Значение)` - сохранить значение по специальному ключу ++ `Функция ПолучитьИзКонтекста(Знач Ключ)` - возвращает значение по ключу From 683c0627e268ede145732ce469861b56c9f43698 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Thu, 21 Jul 2016 09:25:33 +0300 Subject: [PATCH 22/56] =?UTF-8?q?=D0=9F=D1=80=D0=B8=20=D0=B3=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D1=88=D0=B0=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B2=D1=81=D0=B5=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D1=8B=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D1=8E=20=D0=BF=D0=BE=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8E=20fix=20#62?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...275\320\265\321\200\320\260\321\206\320\270\320\270.feature" | 2 +- src/bdd-generate.os | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" "b/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" index af78e49..c337ee3 100644 --- "a/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" +++ "b/features/core/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.feature" @@ -18,7 +18,7 @@ Когда я передаю параметр "Минимальный" Тогда я получаю параметр "Минимальный" """ - И я запустил генерацию шагов фичи "ФичаБезШагов" + И я запустил генерацию шагов фичи "ФичаБезШагов" с передачей параметра "-verbose off" Тогда я получил сгенерированный os-файл "ФичаБезШагов" в ожидаемом каталоге И проверка поведения фичи "ФичаБезШагов" закончилась с кодом возврата 1 diff --git a/src/bdd-generate.os b/src/bdd-generate.os index 5236a9d..3a647cc 100644 --- a/src/bdd-generate.os +++ b/src/bdd-generate.os @@ -454,7 +454,7 @@ Для Каждого ОписаниеПараметра Из Параметры Цикл Лог.Отладка("ОписаниеПараметра.Тип " + ОписаниеПараметра.Тип); ПредставлениеПараметра = ПолучитьПредставлениеПараметра(ОписаниеПараметра, Номер); - СтрокаПараметров = СтрокаПараметров + ПредставлениеПараметра + ","; + СтрокаПараметров = СтрШаблон("%1Знач %2,", СтрокаПараметров, ПредставлениеПараметра); Номер = Номер + 1; КонецЦикла; СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров)-1); From 5e5cab67ea34fb9f96922fd0c422913f991a53fa Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Thu, 21 Jul 2016 10:11:56 +0300 Subject: [PATCH 23/56] =?UTF-8?q?=D0=92=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=8E=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8E=20fix?= =?UTF-8?q?=20#62?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/core/step_definitions/Hooks.os | 4 ++-- ...21\202\320\265\320\272\321\201\321\202.os" | 4 ++-- ...20\265\321\202\321\200\320\276\320\262.os" | 20 +++++++++---------- ...21\200\320\260\321\206\320\270\320\270.os" | 14 ++++++------- ...20\274\320\265\321\202\321\200\321\213.os" | 4 ++-- ...20\265\320\237\320\276\320\273\321\217.os" | 8 ++++---- ...20\275\320\260\321\200\320\270\321\217.os" | 10 +++++----- ...20\245\321\203\320\272\320\276\320\262.os" | 2 +- ...20\274\320\265\321\202\321\200\321\213.os" | 4 ++-- ...20\265\320\237\320\276\320\273\321\217.os" | 8 ++++---- 10 files changed, 39 insertions(+), 39 deletions(-) diff --git a/features/core/step_definitions/Hooks.os b/features/core/step_definitions/Hooks.os index 08691f6..a2bdd74 100644 --- a/features/core/step_definitions/Hooks.os +++ b/features/core/step_definitions/Hooks.os @@ -19,7 +19,7 @@ // Реализация шагов //я подставил файл шагов фичи "ПроверкаХуков" из каталога "tests\fixtures" -Процедура ЯПодставилФайлШаговФичиИзКаталога(ИмяФичи, КаталогФичи) Экспорт +Процедура ЯПодставилФайлШаговФичиИзКаталога(Знач ИмяФичи, Знач КаталогФичи) Экспорт ИмяИсполнителяШагов = ИмяФичи + ".os"; ИсходныйФайлИсполнителяШагов = Новый Файл(ОбъединитьПути(КаталогПроекта(), КаталогФичи, "step_definitions", ИмяИсполнителяШагов )); ФайлИсполнителяШагов = Новый Файл(ОбъединитьПути("step_definitions", ИмяИсполнителяШагов )); @@ -31,7 +31,7 @@ КонецПроцедуры //текст файла-журнала равен "ПередЗапускомСценария;ШагСценария" -Процедура ТекстФайла_ЖурналаРавен(ТекстЖурнала) Экспорт +Процедура ТекстФайла_ЖурналаРавен(Знач ТекстЖурнала) Экспорт СтрокаИзЖурнала = ПрочитатьЖурнал(); Ожидаем.Что(СтрокаИзЖурнала).Равно(ТекстЖурнала); КонецПроцедуры diff --git "a/features/core/step_definitions/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.os" "b/features/core/step_definitions/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.os" index ef1ad8f..18a019a 100644 --- "a/features/core/step_definitions/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.os" +++ "b/features/core/step_definitions/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.os" @@ -15,11 +15,11 @@ КонецФункции //Я сохранил значение 10 в исполнителе -Процедура ЯСохранилЗначениеВИсполнителе(Значение) Экспорт +Процедура ЯСохранилЗначениеВИсполнителе(Знач Значение) Экспорт СохраненноеЗначение = Значение; КонецПроцедуры //я получаю значение 10 от исполнителя -Процедура ЯПолучаюЗначениеОтИсполнителя(ЗначениеДляПроверки) Экспорт +Процедура ЯПолучаюЗначениеОтИсполнителя(Знач ЗначениеДляПроверки) Экспорт Ожидаем.Что(СохраненноеЗначение).Равно(ЗначениеДляПроверки); КонецПроцедуры diff --git "a/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" index 3001b30..bcb6e0a 100644 --- "a/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" +++ "b/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" @@ -32,19 +32,19 @@ КонецФункции //я передаю параметр 11.02.2010 -Процедура ЯПередаюПараметр(Парам) Экспорт +Процедура ЯПередаюПараметр(Знач Парам) Экспорт ДобавитьВЖурнал("ЯПередаюПараметр", Парам); ИсходныйПараметр = Парам; ТипИсходногоПараметра = ТипЗнч(Парам); КонецПроцедуры //я получаю параметр "Минимальный" -Процедура ЯПолучаюПараметр(ЗначениеПараметра) Экспорт +Процедура ЯПолучаюПараметр(Знач ЗначениеПараметра) Экспорт Ожидаем.Что(ЗначениеПараметра, "Ожидаем, что первым шагом был передан правильный параметр, а это не так").Равно(ИсходныйПараметр); КонецПроцедуры //я получаю параметр с типом "Дата" -Процедура ЯПолучаюПараметрСТипом(СтрокаТип) Экспорт +Процедура ЯПолучаюПараметрСТипом(Знач СтрокаТип) Экспорт ДобавитьВЖурнал("ЯПолучаюПараметрСТипом", СтрокаТип); Ожидаем.Что(""+СтрокаТип, СтрШаблон("Ожидаем, что был передан параметр %1 с типом %2, а это не так", ИсходныйПараметр, ТипИсходногоПараметра)).Равно(""+ТипИсходногоПараметра); @@ -56,12 +56,12 @@ КонецПроцедуры //количество строк у параметра равно 2 -Процедура КоличествоСтрокУПараметраРавно(ЧислоСтрок) Экспорт +Процедура КоличествоСтрокУПараметраРавно(Знач ЧислоСтрок) Экспорт Ожидаем.Что(СтрЧислоСтрок(ИсходныйПараметр), "СтрЧислоСтрок(ИсходныйПараметр)").Равно(ЧислоСтрок); КонецПроцедуры //1 строка у параметра равна "первая строка" -Процедура СтрокаУПараметраРавна(НомерСтроки, СтрокаПоНомеру) Экспорт +Процедура СтрокаУПараметраРавна(Знач НомерСтроки, Знач СтрокаПоНомеру) Экспорт ОжидаемаяСтрока = "первая строка"; Если НомерСтроки = 2 Тогда ОжидаемаяСтрока = "вторая строка"; @@ -70,7 +70,7 @@ КонецПроцедуры //я передаю два параметра разных типов 1 и "Строка1" -Процедура ЯПередаюДваПараметраРазныхТиповИ(Парам1, Парам2) Экспорт +Процедура ЯПередаюДваПараметраРазныхТиповИ(Знач Парам1, Знач Парам2) Экспорт ИсходныйПараметр = Парам1; ТипИсходногоПараметра = ТипЗнч(Парам1); ИсходныйПараметр2 = Парам2; @@ -78,25 +78,25 @@ КонецПроцедуры //я в первом параметре получаю значение с типом "Строка" -Процедура ЯВПервомПараметреПолучаюЗначениеСТипом(СтрокаТип) Экспорт +Процедура ЯВПервомПараметреПолучаюЗначениеСТипом(Знач СтрокаТип) Экспорт Ожидаем.Что(""+СтрокаТип, СтрШаблон("Ожидаем, что был передан параметр %1 с типом %2, а это не так", ИсходныйПараметр, ТипИсходногоПараметра)).Равно(""+ТипИсходногоПараметра); КонецПроцедуры //я в втором параметре получаю значение с типом Число" -Процедура ЯВВторомПараметреПолучаюЗначениеСТипом(СтрокаТип) Экспорт +Процедура ЯВВторомПараметреПолучаюЗначениеСТипом(Знач СтрокаТип) Экспорт Ожидаем.Что(""+СтрокаТип, СтрШаблон("Ожидаем, что был передан параметр %1 с типом %2, а это не так", ИсходныйПараметр2, ТипИсходногоПараметра2)).Равно(""+ТипИсходногоПараметра2); КонецПроцедуры //я в первом параметре получаю значение 1 -Процедура ЯВПервомПараметреПолучаюЗначение(Парам1) Экспорт +Процедура ЯВПервомПараметреПолучаюЗначение(Знач Парам1) Экспорт Ожидаем.Что(Парам1, СтрШаблон("Ожидаем, что был передан параметр %1, а это не так", ИсходныйПараметр)).Равно(ИсходныйПараметр); КонецПроцедуры //я в втором параметре получаю значение "Строка1" -Процедура ЯВВторомПараметреПолучаюЗначение(Парам1) Экспорт +Процедура ЯВВторомПараметреПолучаюЗначение(Знач Парам1) Экспорт Ожидаем.Что(Парам1, СтрШаблон("Ожидаем, что был передан параметр %1, а это не так", ИсходныйПараметр2)).Равно(ИсходныйПараметр2); КонецПроцедуры diff --git "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" index 85d9fbd..652946f 100644 --- "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" +++ "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -50,7 +50,7 @@ КонецПроцедуры //я подготовил специальную тестовую фичу "ПередачаПараметров" -Процедура ЯПодготовилСпециальнуюТестовуюФичу(ИмяФичи) Экспорт +Процедура ЯПодготовилСпециальнуюТестовуюФичу(Знач ИмяФичи) Экспорт ФайлИсходнойФичи = ПолучитьФайлИсходнойФичи(ИмяФичи); @@ -103,7 +103,7 @@ КонецПроцедуры //проверка поведения фичи "ПередачаПараметров" закончилась со статусом "НеРеализован" -Процедура ПроверкаПоведенияФичиЗакончиласьСоСтатусом(ИмяФичи, ОжидаемыйСтатусВыполненияСтрока) Экспорт +Процедура ПроверкаПоведенияФичиЗакончиласьСоСтатусом(Знач ИмяФичи, Знач ОжидаемыйСтатусВыполненияСтрока) Экспорт ИсполнительБДД = ЗагрузитьСценарий(ОбъединитьПути(ПолучитьКаталогИсходников(), "bdd-exec.os")); ОжидаемыйСтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения()[ОжидаемыйСтатусВыполненияСтрока]; @@ -169,7 +169,7 @@ КонецПроцедуры //я подставил файл шагов с уже реализованными шагами для фичи "ПередачаПараметров"() -Процедура ЯПодставилФайлШаговСУжеРеализованнымиШагамиДляФичи(ИмяФичи) Экспорт +Процедура ЯПодставилФайлШаговСУжеРеализованнымиШагамиДляФичи(Знач ИмяФичи) Экспорт ИмяИсполнителяШагов = ФайлИсходнойФичи.ИмяБезРасширения+ ".os"; ИсходныйФайлИсполнителяШагов = Новый Файл(ОбъединитьПути(ФайлИсходнойФичи.Путь, "step_definitions", ИмяИсполнителяШагов )); ФайлИсполнителяШагов = Новый Файл(ОбъединитьПути(ФайлФичи.Путь, "step_definitions", ИмяИсполнителяШагов )); @@ -186,12 +186,12 @@ КонецПроцедуры //я создал еще один каталог "lib" -Процедура ЯСоздалЕщеОдинКаталог(ИмяКаталога) Экспорт +Процедура ЯСоздалЕщеОдинКаталог(Знач ИмяКаталога) Экспорт СоздатьКаталог(ОбъединитьПути(ВременныйКаталогФичи.ПолноеИмя, ИмяКаталога)); КонецПроцедуры //установил каталог "lib" как текущий -Процедура УстановилКаталогКакТекущий(ИмяКаталога) Экспорт +Процедура УстановилКаталогКакТекущий(Знач ИмяКаталога) Экспорт УстановитьТекущийКаталог(ОбъединитьПути(ВременныйКаталогФичи.ПолноеИмя, ИмяКаталога)); КонецПроцедуры @@ -269,11 +269,11 @@ Возврат ОбъединитьПути(КаталогПроекта, "src"); КонецФункции // ПолучитьКаталогИсходников() -Функция ПолучитьФайлИсходнойФичи(ИмяФичи) +Функция ПолучитьФайлИсходнойФичи(Знач ИмяФичи) Возврат Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "..", ИмяФичи+".feature")); КонецФункции // ПолучитьФайлИсходнойФичи() -Функция ПутьВоВременномКаталоге(ИмяФайла) +Функция ПутьВоВременномКаталоге(Знач ИмяФайла) Возврат ОбъединитьПути(ВременныйКаталогФичи.ПолноеИмя, ИмяФайла); КонецФункции // ПутьВоВременномКаталоге(ИмяФайла) diff --git "a/features/core/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.os" "b/features/core/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.os" index fad619c..2393bc9 100644 --- "a/features/core/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.os" +++ "b/features/core/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.os" @@ -13,11 +13,11 @@ Возврат ВсеШаги; КонецФункции -Процедура ЯНичегоНеДелаю(ПарамСтрока) Экспорт +Процедура ЯНичегоНеДелаю(Знач ПарамСтрока) Экспорт ДобавитьВЖурнал("ЯНичегоНеДелаю", ПарамСтрока); КонецПроцедуры -Процедура НичегоНеПроисходит(ДругойПарамСтрока) Экспорт +Процедура НичегоНеПроисходит(Знач ДругойПарамСтрока) Экспорт ДобавитьВЖурнал("НичегоНеПроисходит", ДругойПарамСтрока); КонецПроцедуры diff --git "a/features/core/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\320\222\321\201\320\265\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\237\320\276\320\273\321\217.os" "b/features/core/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\320\222\321\201\320\265\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\237\320\276\320\273\321\217.os" index 9fea2fd..bc5eeaf 100644 --- "a/features/core/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\320\222\321\201\320\265\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\237\320\276\320\273\321\217.os" +++ "b/features/core/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\320\222\321\201\320\265\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\237\320\276\320\273\321\217.os" @@ -15,19 +15,19 @@ Возврат ВсеШаги; КонецФункции -Процедура ЯНичегоНеДелаю(ПарамСтрока) Экспорт +Процедура ЯНичегоНеДелаю(Знач ПарамСтрока) Экспорт ДобавитьВЖурнал("ЯНичегоНеДелаю", ПарамСтрока); КонецПроцедуры -Процедура НичегоНеПроисходит(ДругойПарамСтрока) Экспорт +Процедура НичегоНеПроисходит(Знач ДругойПарамСтрока) Экспорт ДобавитьВЖурнал("НичегоНеПроисходит", ДругойПарамСтрока); КонецПроцедуры -Процедура ВсеПутемИ(Парам1, Парам2) Экспорт +Процедура ВсеПутемИ(Знач Парам1, Знач Парам2) Экспорт ДобавитьВЖурнал("ВсеПутемИ", Парам1, Парам2); КонецПроцедуры -Процедура НиктоНичегоНеДелает(Парам1) Экспорт +Процедура НиктоНичегоНеДелает(Знач Парам1) Экспорт ДобавитьВЖурнал("НиктоНичегоНеДелает", Парам1); КонецПроцедуры diff --git "a/features/core/step_definitions/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217.os" "b/features/core/step_definitions/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217.os" index e5fd7b0..870b4de 100644 --- "a/features/core/step_definitions/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217.os" +++ "b/features/core/step_definitions/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\241\321\206\320\265\320\275\320\260\321\200\320\270\321\217.os" @@ -21,7 +21,7 @@ КонецФункции //я передаю два параметра разных типов <Параметр> и 1 -Процедура ЯПередаюДваПараметраРазныхТиповИ(ПарамСтрока1, ПарамЧисло2) Экспорт +Процедура ЯПередаюДваПараметраРазныхТиповИ(Знач ПарамСтрока1, Знач ПарамЧисло2) Экспорт //Сообщить(СтрШаблон("ПарамСтрока1 %1, ПарамЧисло2 %2", ПарамСтрока1, ПарамЧисло2)); ИсходныйПараметр = ПарамСтрока1; ТипИсходногоПараметра = ТипЗнч(ПарамСтрока1); @@ -30,25 +30,25 @@ КонецПроцедуры //я в первом параметре получаю значение с типом "Строка" -Процедура ЯВПервомПараметреПолучаюЗначениеСТипом(СтрокаТип) Экспорт +Процедура ЯВПервомПараметреПолучаюЗначениеСТипом(Знач СтрокаТип) Экспорт Ожидаем.Что(""+СтрокаТип, СтрШаблон("Ожидаем, что был передан параметр %1 с типом %2, а это не так", ИсходныйПараметр, ТипИсходногоПараметра)).Равно(""+ТипИсходногоПараметра); КонецПроцедуры //я в втором параметре получаю значение с типом Число" -Процедура ЯВВторомПараметреПолучаюЗначениеСТипом(СтрокаЧисло) Экспорт +Процедура ЯВВторомПараметреПолучаюЗначениеСТипом(Знач СтрокаЧисло) Экспорт Ожидаем.Что(""+СтрокаЧисло, СтрШаблон("Ожидаем, что был передан параметр %1 с типом %2, а это не так", ИсходныйПараметр2, ТипИсходногоПараметра2)).Равно(""+ТипИсходногоПараметра2); КонецПроцедуры //я в первом параметре получаю значение "Значение с пробелом" -Процедура ЯВПервомПараметреПолучаюЗначение(Парам1) Экспорт +Процедура ЯВПервомПараметреПолучаюЗначение(Знач Парам1) Экспорт Ожидаем.Что(Парам1, СтрШаблон("Ожидаем, что был передан параметр %1, а это не так", ИсходныйПараметр)).Равно(ИсходныйПараметр); КонецПроцедуры //я в втором параметре получаю значение 1 -Процедура ЯВВторомПараметреПолучаюЗначение(Парам1) Экспорт +Процедура ЯВВторомПараметреПолучаюЗначение(Знач Парам1) Экспорт Ожидаем.Что(Парам1, СтрШаблон("Ожидаем, что был передан параметр %1, а это не так", ИсходныйПараметр2)).Равно(ИсходныйПараметр2); КонецПроцедуры diff --git "a/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" "b/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" index e594df4..6c0d167 100644 --- "a/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" +++ "b/tests/fixtures/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\245\321\203\320\272\320\276\320\262.os" @@ -24,7 +24,7 @@ // Реализация шагов //я записываю "ШагСценария" в файл журнала -Процедура ЯЗаписываюВФайлЖурнала(СтрокаДляЖурнала) Экспорт +Процедура ЯЗаписываюВФайлЖурнала(Знач СтрокаДляЖурнала) Экспорт СтрокаИзЖурнала = ПрочитатьЖурнал(); ЗаписьФайла = Новый ЗаписьТекста(ПутьФайлаЖурнала(), "utf-8"); diff --git "a/tests/fixtures/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.os" "b/tests/fixtures/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.os" index a1976f1..1f96080 100644 --- "a/tests/fixtures/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.os" +++ "b/tests/fixtures/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.os" @@ -13,11 +13,11 @@ Возврат ВсеШаги; КонецФункции -Процедура ЯНичегоНеДелаю(ПарамСтрока) Экспорт +Процедура ЯНичегоНеДелаю(Знач ПарамСтрока) Экспорт ДобавитьВЖурнал("ЯНичегоНеДелаю", ПарамСтрока); КонецПроцедуры -Процедура НичегоНеПроисходит(ДругойПарамСтрока) Экспорт +Процедура НичегоНеПроисходит(Знач ДругойПарамСтрока) Экспорт ДобавитьВЖурнал("НичегоНеПроисходит", ДругойПарамСтрока); Ожидаем.Что(Журнал[КлючЖурнала], "Ожидали, что журнал выполнения будет правильным, а это не так").Равно("ЯНичегоНеДелаю<ПарамСтрока>;НичегоНеПроисходит<ДругойПарамСтрока>;"); diff --git "a/tests/fixtures/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\320\222\321\201\320\265\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\237\320\276\320\273\321\217.os" "b/tests/fixtures/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\320\222\321\201\320\265\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\237\320\276\320\273\321\217.os" index ced7f37..5bb008a 100644 --- "a/tests/fixtures/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\320\222\321\201\320\265\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\237\320\276\320\273\321\217.os" +++ "b/tests/fixtures/step_definitions/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\320\222\321\201\320\265\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\237\320\276\320\273\321\217.os" @@ -15,19 +15,19 @@ Возврат ВсеШаги; КонецФункции -Процедура ЯНичегоНеДелаю(ПарамСтрока) Экспорт +Процедура ЯНичегоНеДелаю(Знач ПарамСтрока) Экспорт ДобавитьВЖурнал("ЯНичегоНеДелаю", ПарамСтрока); КонецПроцедуры -Процедура ВсеПутемИ(Парам1, Парам2) Экспорт +Процедура ВсеПутемИ(Знач Парам1, Знач Парам2) Экспорт ДобавитьВЖурнал("ВсеПутемИ", Парам1, Парам2); КонецПроцедуры -Процедура НиктоНичегоНеДелает(Парам1) Экспорт +Процедура НиктоНичегоНеДелает(Знач Парам1) Экспорт ДобавитьВЖурнал("НиктоНичегоНеДелает", Парам1); КонецПроцедуры -Процедура НичегоНеПроисходит(ДругойПарамСтрока) Экспорт +Процедура НичегоНеПроисходит(Знач ДругойПарамСтрока) Экспорт ДобавитьВЖурнал("НичегоНеПроисходит", ДругойПарамСтрока); Ожидаем.Что(Журнал[КлючЖурнала], "Ожидали, что журнал выполнения будет правильным, а это не так").Равно("ВсеПутемИ<ПарамДано><ПарамНеДано>;ЯНичегоНеДелаю<ПарамКогда>;НиктоНичегоНеДелает<ПарамИ>;НичегоНеПроисходит<ПарамТогда>;"); КонецПроцедуры From ddbd0918dcac0fd176443a533da3fc25d8e009ec Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Thu, 21 Jul 2016 10:32:12 +0300 Subject: [PATCH 24/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE:=20=D0=9F=D1=80=D0=B8=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20=D1=84=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=20=D0=B2=D1=8B=D0=B4=D0=B0=D0=B2=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=D1=81=D1=8C=20=D0=BD=D0=B5=D0=B2=D0=B5=D1=80=D0=BD=D0=BE=D0=B5?= =?UTF-8?q?=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?,=20=D0=B5=D1=81=D0=BB=D0=B8=20=D1=88=D0=B0=D0=B3=20=D0=B5?= =?UTF-8?q?=D1=89=D0=B5=20=D0=BD=D0=B5=20=D0=B1=D1=8B=D0=BB=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bdd-exec.os | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/bdd-exec.os b/src/bdd-exec.os index 914b488..da138a5 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -380,8 +380,9 @@ Функция ВыполнитьШаг(Знач АдресШага, Знач ПараметрыШага, Знач НаборБиблиотечныхШагов, Знач ПредставлениеШага) СтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; - ОписаниеИсполнителяШагов = НаборБиблиотечныхШагов[ЧитательГеркин.НормализоватьАдресШага(АдресШага)]; - Если ОписаниеИсполнителяШагов = Неопределено Тогда + ОписаниеИсполнителяШагов = Неопределено; + ШагРеализован = НаборБиблиотечныхШагов.Свойство(ЧитательГеркин.НормализоватьАдресШага(АдресШага), ОписаниеИсполнителяШагов); + Если Не ШагРеализован ИЛИ ОписаниеИсполнителяШагов = Неопределено Тогда СтатусВыполнения = ВозможныеСтатусыВыполнения.НеРеализован; Иначе Рефлектор = Новый Рефлектор; From 1fc35ea01335a42167b353de4cafebcc62fdd9f2 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Thu, 21 Jul 2016 10:43:26 +0300 Subject: [PATCH 25/56] =?UTF-8?q?=D0=A4=D0=B8=D1=87=D0=B0=20=D1=81=20?= =?UTF-8?q?=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B5=D0=B9=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B8=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=202=D1=85=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D1=8B=D1=85=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20#11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\260\320\275\320\275\321\213\321\205.os" | 57 +++++++++++++++++++ ...0\320\275\320\275\321\213\321\205.feature" | 16 ++++++ 2 files changed, 73 insertions(+) create mode 100644 "features/core/step_definitions/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.os" create mode 100644 "features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" diff --git "a/features/core/step_definitions/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.os" "b/features/core/step_definitions/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.os" new file mode 100644 index 0000000..e9b1e11 --- /dev/null +++ "b/features/core/step_definitions/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.os" @@ -0,0 +1,57 @@ +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("ЯПередаюТаблицу"); + ВсеШаги.Добавить("ПереданнаяТаблицаЯвляетсяТипом"); + ВсеШаги.Добавить("УПереданнойТаблицыКолонки"); + ВсеШаги.Добавить("УПереданнойТаблицыСтроки"); + ВсеШаги.Добавить("УСтрокиТаблицыЗаданыЗначенияИ"); + + Возврат ВсеШаги; +КонецФункции + +// Реализация шагов + +// Процедура выполняется перед запуском каждого сценария +Процедура ПередЗапускомСценария(Знач Узел) Экспорт + +КонецПроцедуры + +// Процедура выполняется после завершения каждого сценария +Процедура ПослеЗапускаСценария(Знач Узел) Экспорт + +КонецПроцедуры + +//я передаю таблицу +Процедура ЯПередаюТаблицу(Знач ИсходнаяТаблица) Экспорт + БДД.СохранитьВКонтекст("ТаблицаДанных", ИсходнаяТаблица); +КонецПроцедуры + +//переданная таблица является типом "ТаблицаЗначений" +Процедура ПереданнаяТаблицаЯвляетсяТипом(Знач ТипСтрокой) Экспорт + Таблица = БДД.ПолучитьИзКонтекста("ТаблицаДанных"); + Ожидаем.Что(Таблица).ИмеетТип(ТипСтрокой); +КонецПроцедуры + +//у переданной таблицы 2 колонки +Процедура УПереданнойТаблицыКолонки(Знач ПарамЧисло1) Экспорт + ВызватьИсключение Новый ИнформацияОбОшибке("Шаг <УПереданнойТаблицыКолонки> не реализован", "Не реализовано."); +КонецПроцедуры + +//у переданной таблицы 2 строки +Процедура УПереданнойТаблицыСтроки(Знач ПарамЧисло1) Экспорт + ВызватьИсключение Новый ИнформацияОбОшибке("Шаг <УПереданнойТаблицыСтроки> не реализован", "Не реализовано."); +КонецПроцедуры + +//у 1 строки таблицы заданы значения "Ячейка11" и "Ячейка12" +Процедура УСтрокиТаблицыЗаданыЗначенияИ(Знач ПарамЧисло1,Знач ПарамСтрока2,Знач ПарамСтрока3) Экспорт + ВызватьИсключение Новый ИнформацияОбОшибке("Шаг <УСтрокиТаблицыЗаданыЗначенияИ> не реализован", "Не реализовано."); +КонецПроцедуры + diff --git "a/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" "b/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" new file mode 100644 index 0000000..7bf749e --- /dev/null +++ "b/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" @@ -0,0 +1,16 @@ +# language: ru + +Функционал: Таблицы данных + Как Разработчик + Я Хочу чтобы можно было использовать различные форматы данных в фича-файлах + +Сценарий: Проверяю передачу простой таблицы + + Когда я передаю таблицу + | Ячейка11 | Ячейка12| + | Ячейка21 | Ячейка22| + Тогда переданная таблица является типом "ТаблицаЗначений" + И у переданной таблицы 2 колонки + И у переданной таблицы 2 строки + И у 1 строки таблицы заданы значения "Ячейка11" и "Ячейка12" + И у 2 строки таблицы заданы значения "Ячейка21" и "Ячейка22" \ No newline at end of file From da14eae350cd0078e89272b7f29da5900417182a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=83=D1=80=20=D0=90=D1=8E=D1=85=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=20aka=20artbear?= Date: Thu, 21 Jul 2016 19:21:21 +0300 Subject: [PATCH 26/56] =?UTF-8?q?=D0=9F=D1=80=D0=B8=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=B5=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=84=D0=B8=D1=87=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=87=D0=BD=D1=8B=D0=B5=20os-=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D1=8B,=20=D0=B1=D0=B5=D0=B7=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D1=82=D1=8C=D0=A1?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=D0=A8=D0=B0=D0=B3=D0=BE=D0=B2,?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83=D1=81=D0=BA=D0=B0=D1=8E=20fix?= =?UTF-8?q?=20#64?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\200\320\260\321\206\320\270\320\270.os" | 28 +++++++++++++------ ...0\320\265\320\244\320\270\321\207.feature" | 9 ++++++ src/bdd-exec.os | 11 ++++++-- src/bdd.os | 8 ++++-- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" index 652946f..7fae8ce 100644 --- "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" +++ "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -25,6 +25,7 @@ ВсеШаги.Добавить("ЯПодставилФайлШаговСУжеРеализованнымиШагамиДляФичи"); ВсеШаги.Добавить("ЯЗапустилВыполнениеФичиСПередачейПараметра"); ВсеШаги.Добавить("ЯСоздалФайлФичиСТекстом"); + ВсеШаги.Добавить("ЯСоздалФайлСТекстом"); ВсеШаги.Добавить("ЯСоздалЕщеОдинКаталог"); ВсеШаги.Добавить("УстановилКаталогКакТекущий"); ВсеШаги.Добавить("ЯЗапустилВыполнениеФичи"); @@ -195,6 +196,23 @@ УстановитьТекущийКаталог(ОбъединитьПути(ВременныйКаталогФичи.ПолноеИмя, ИмяКаталога)); КонецПроцедуры + +//я создал файл "ПустойСкрипт.os" с текстом +//""" +//// Пустой скрипт +//""" +Процедура ЯСоздалФайлСТекстом(Знач ПутьФайла, Знач ТексФайла) Экспорт + ЗаписьФайла = Новый ЗаписьТекста(ОбъединитьПути(ТекущийКаталог(), ПутьФайла), "utf-8"); + + Для Счетчик = 1 По СтрЧислоСтрок(ТексФайла) Цикл + Строка = СтрПолучитьСтроку(ТексФайла, Счетчик); + ЗаписьФайла.ЗаписатьСтроку(Строка); + //Лог.Отладка("Записываю в файл шагов ----- "+Строка); + КонецЦикла; + + ЗаписьФайла.Закрыть(); +КонецПроцедуры + //я создал файл фичи "ФичаБезШагов" с текстом //""" //# language: ru @@ -204,15 +222,7 @@ // Тогда я получаю параметр "Минимальный" //""" Процедура ЯСоздалФайлФичиСТекстом(Знач ИмяФичи, Знач ТекстФичи) Экспорт - ЗаписьФайла = Новый ЗаписьТекста(ПутьВоВременномКаталоге(ИмяФичи + ".feature"), "utf-8"); - - Для Счетчик = 1 По СтрЧислоСтрок(ТекстФичи) Цикл - Строка = СтрПолучитьСтроку(ТекстФичи, Счетчик); - ЗаписьФайла.ЗаписатьСтроку(Строка); - //Лог.Отладка("Записываю в файл шагов ----- "+Строка); - КонецЦикла; - - ЗаписьФайла.Закрыть(); + ЯСоздалФайлСТекстом(ПутьВоВременномКаталоге(ИмяФичи + ".feature"), ТекстФичи); КонецПроцедуры Функция ПолучитьТестовыйФайлФичи(ИмяФичи) diff --git "a/features/core/\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\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" index 8c2f309..ddd2528 100644 --- "a/features/core/\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\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" @@ -26,3 +26,12 @@ | с использованием полного пути каталога | КаталогТестовыйПолный | | с использованием относительного пути каталога | КаталогТестовыйОтносительный | +Сценарий: Выполнение фич в каталоге, в котором есть обычные os-скрипты, не являющиеся файлами шагов + Когда я подготовил тестовый каталог для фич + И установил тестовый каталог как текущий + И я создал файл "ПустойСкрипт.os" с текстом + """ + // Пустой скрипт + """ + + Тогда проверка поведения фич с передачей параметра "" из каталога "." закончилась с кодом возврата 0 \ No newline at end of file diff --git a/src/bdd-exec.os b/src/bdd-exec.os index da138a5..17c0a35 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -244,8 +244,15 @@ Рефлектор = Новый Рефлектор; МассивПараметров = Новый Массив; МассивПараметров.Добавить(ЭтотОбъект); - МассивОписанийШагов = Рефлектор.ВызватьМетод(ИсполнительШагов, ЧитательГеркин.НаименованиеФункцииПолученияСпискаШагов(), МассивПараметров); - Возврат МассивОписанийШагов; + Попытка + МассивОписанийШагов = Рефлектор.ВызватьМетод(ИсполнительШагов, ЧитательГеркин.НаименованиеФункцииПолученияСпискаШагов(), МассивПараметров); + Возврат МассивОписанийШагов; + + Исключение + КонецПопытки; + + Возврат Новый Массив; + КонецФункции // ПолучитьМассивОписанийШагов() // возвращает Неопределено или структуру. diff --git a/src/bdd.os b/src/bdd.os index 06b7e7d..91635ca 100644 --- a/src/bdd.os +++ b/src/bdd.os @@ -167,9 +167,13 @@ ИскатьВПодкаталогах = Истина; РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(ФайлФичи, ФайлБиблиотек, ИскатьВПодкаталогах); - КодВозврата = ИсполнительБДД.ВозможныеКодыВозвратовПроцесса()[РезультатыВыполнения.Строки[0].СтатусВыполнения]; + Если РезультатыВыполнения.Строки.Количество() = 0 Тогда + КодВозврата = ИсполнительБДД.ВозможныеКодыВозвратовПроцесса()[ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся]; + Иначе + КодВозврата = ИсполнительБДД.ВозможныеКодыВозвратовПроцесса()[РезультатыВыполнения.Строки[0].СтатусВыполнения]; - ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, ФайлФичи.ЭтоКаталог()); + ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, ФайлФичи.ЭтоКаталог()); + КонецЕсли; Возврат КодВозврата; КонецФункции From a153123b145267bb5453e79222a523c74f82391c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=83=D1=80=20=D0=90=D1=8E=D1=85=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=20aka=20artbear?= Date: Thu, 21 Jul 2016 23:03:35 +0300 Subject: [PATCH 27/56] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=84=D0=B8=D1=87=D0=B0?= =?UTF-8?q?=20=D0=B8=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20#63?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\270\320\265\320\244\320\270\321\207.os" | 41 +++++++++++++++++++ ...21\200\320\260\321\206\320\270\320\270.os" | 38 +++++++++++------ ...0\320\265\320\244\320\270\321\207.feature" | 10 ++++- ...20\270\320\271\320\250\320\260\320\263.os" | 28 +++++++++++++ ...0\320\271\320\250\320\260\320\263.feature" | 11 +++++ 5 files changed, 114 insertions(+), 14 deletions(-) create mode 100644 "features/core/step_definitions/\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.os" create mode 100644 "tests/fixtures/step_definitions/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\250\320\260\320\263.os" create mode 100644 "tests/fixtures/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\250\320\260\320\263.feature" diff --git "a/features/core/step_definitions/\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.os" "b/features/core/step_definitions/\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.os" new file mode 100644 index 0000000..6b78090 --- /dev/null +++ "b/features/core/step_definitions/\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.os" @@ -0,0 +1,41 @@ +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("УстановилКаталогПроектаКакТекущий"); + ВсеШаги.Добавить("ВЛог_ФайлеЗапускаПродуктаЕстьСтрока"); + ВсеШаги.Добавить("ВЛог_ФайлеЗапускаПродуктаОтсутствуетСтрока"); + + Возврат ВсеШаги; +КонецФункции + + +// Реализация шагов + +//установил каталог проекта "tests\fixtures" как текущий +Процедура УстановилКаталогПроектаКакТекущий(Знач ПутьКаталога) Экспорт + УстановитьТекущийКаталог(ОбъединитьПути(КаталогПроекта(), ПутьКаталога)); +КонецПроцедуры + +//в лог-файле запуска продукта есть строка "ЯЗапускаюПадающийШагСПараметром-Первый падающий шаг" +Процедура ВЛог_ФайлеЗапускаПродуктаЕстьСтрока(Знач ПроверяемаяСтрока) Экспорт + ТекстЛогФайла = БДД.ПолучитьИзКонтекста("ТекстЛогФайлаПродукта"); + Ожидаем.Что(ТекстЛогФайла).Содержит(ПроверяемаяСтрока); +КонецПроцедуры + +//в лог-файле запуска продукта отсутствует строка "ДоЭтогоШагаВыполнениеДойтиНеДолжно" +Процедура ВЛог_ФайлеЗапускаПродуктаОтсутствуетСтрока(Знач ПроверяемаяСтрока) Экспорт + ТекстЛогФайла = БДД.ПолучитьИзКонтекста("ТекстЛогФайлаПродукта"); + Ожидаем.Что(ТекстЛогФайла).ЭтоНе().Содержит(ПроверяемаяСтрока); +КонецПроцедуры + +Функция КаталогПроекта() Экспорт + КаталогПроекта = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "..", ".."); + Возврат КаталогПроекта; +КонецФункции diff --git "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" index 7fae8ce..69c2ced 100644 --- "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" +++ "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -72,15 +72,18 @@ ИмяЛогаКоманды = ОбъединитьПути(ТекущийКаталог(), "gen-log.txt"); СтрокаКоманды = СтрШаблон("cmd /c oscript.exe %4 %1 gen %2 %3 %5", ПутьИсполнителяБДД, ФайлФичиИлиКаталога.ПолноеИмя, - ПараметрыКоманднойСтроки, "-encoding=utf-8", СуффиксПеренаправленияВывода(ИмяЛогаКоманды, Ложь)); + ПараметрыКоманднойСтроки, "-encoding=utf-8", СуффиксПеренаправленияВывода(ИмяЛогаКоманды, Ложь)); Лог.Отладка("СтрокаКоманды "+СтрокаКоманды); КодВозврата = Неопределено; ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог(), Истина, КодВозврата); + ТекстФайла = ПолучитьТекстФайла(ИмяЛогаКоманды); + БДД.СохранитьВКонтекст("ТекстЛогФайлаПродукта", ТекстФайла); + Если КодВозврата <> 0 ИЛИ СтрНайти(ПараметрыКоманднойСтроки, "-verbose on") <> 0 Тогда - ВывестиТекстФайла(ИмяЛогаКоманды); + ВывестиТекст(ТекстФайла); Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата равен 0, а это не так").Равно(0); КонецЕсли; @@ -93,14 +96,14 @@ //я получил сгенерированный os-файл "ФичаБезШагов" в ожидаемом каталоге Процедура ЯПолучилСгенерированныйOs_ФайлВОжидаемомКаталоге(Знач ИмяФичи) Экспорт - ФайлШагов = Новый Файл(ОбъединитьПути(ТекущийКаталог(), "step_definitions", ИмяФичи+".os")); - Ожидаем.Что(ФайлШагов.Существует(), "Ожидаем, что файл исполнителя шагов существует, а его нет. "+ФайлШагов.ПолноеИмя).Равно(Истина); + ФайлШагов = Новый Файл(ОбъединитьПути(ТекущийКаталог(), "step_definitions", ИмяФичи+".os")); + Ожидаем.Что(ФайлШагов.Существует(), "Ожидаем, что файл исполнителя шагов существует, а его нет. "+ФайлШагов.ПолноеИмя).Равно(Истина); КонецПроцедуры //я не получил сгенерированный os-файл "ФичаБезШагов" в ожидаемом каталоге Процедура ЯНеПолучилСгенерированныйOs_ФайлВОжидаемомКаталоге(Знач ИмяФичи) Экспорт - ФайлШагов = Новый Файл(ОбъединитьПути(ТекущийКаталог(), "step_definitions", ИмяФичи+".os")); - Ожидаем.Что(ФайлШагов.Существует(), "Ожидаем, что файл исполнителя шагов не существует, а он есть. "+ФайлШагов.ПолноеИмя).Равно(Ложь); + ФайлШагов = Новый Файл(ОбъединитьПути(ТекущийКаталог(), "step_definitions", ИмяФичи+".os")); + Ожидаем.Что(ФайлШагов.Существует(), "Ожидаем, что файл исполнителя шагов не существует, а он есть. "+ФайлШагов.ПолноеИмя).Равно(Ложь); КонецПроцедуры //проверка поведения фичи "ПередачаПараметров" закончилась со статусом "НеРеализован" @@ -147,14 +150,17 @@ ИмяЛогаКоманды = ОбъединитьПути(ТекущийКаталог(), "exec-log.txt"); СтрокаКоманды = СтрШаблон("cmd /c oscript.exe %4 %1 %2 %3 %5", ПутьИсполнителяБДД, ФайлФичиИлиКаталога.ПолноеИмя, - СохраненныеПараметрыКоманднойСтроки, "-encoding=utf-8", СуффиксПеренаправленияВывода(ИмяЛогаКоманды, Ложь)); + СохраненныеПараметрыКоманднойСтроки, "-encoding=utf-8", СуффиксПеренаправленияВывода(ИмяЛогаКоманды, Ложь)); Лог.Отладка("СтрокаКоманды "+СтрокаКоманды); КодВозврата = Неопределено; ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог(), Истина, КодВозврата); + ТекстФайла = ПолучитьТекстФайла(ИмяЛогаКоманды); + БДД.СохранитьВКонтекст("ТекстЛогФайлаПродукта", ТекстФайла); + Если КодВозврата <> ОжидаемыйКодВозврата ИЛИ СтрНайти(ПараметрыКоманднойСтроки, "-verbose on") <> 0 Тогда - ВывестиТекстФайла(ИмяЛогаКоманды); + ВывестиТекст(ТекстФайла); Ожидаем.Что(КодВозврата, "ПроверитьПоведениеФичиИлиКаталога").Равно(ОжидаемыйКодВозврата); КонецЕсли; КонецПроцедуры @@ -183,12 +189,12 @@ //установил тестовый каталог как текущий Процедура УстановилТестовыйКаталогКакТекущий() Экспорт - УстановитьТекущийКаталог(ВременныйКаталогФичи.ПолноеИмя); + УстановитьТекущийКаталог(ВременныйКаталогФичи.ПолноеИмя); КонецПроцедуры //я создал еще один каталог "lib" Процедура ЯСоздалЕщеОдинКаталог(Знач ИмяКаталога) Экспорт - СоздатьКаталог(ОбъединитьПути(ВременныйКаталогФичи.ПолноеИмя, ИмяКаталога)); + СоздатьКаталог(ОбъединитьПути(ВременныйКаталогФичи.ПолноеИмя, ИмяКаталога)); КонецПроцедуры //установил каталог "lib" как текущий @@ -246,12 +252,12 @@ Ожидаем.Что(ФайлИсполнителяШагов.Существует(), "Ожидаем, что файл исполнителя шагов не существует, а он есть. "+ФайлИсполнителяШагов.ПолноеИмя).Равно(Ложь); КонецПроцедуры -Процедура ВывестиТекстФайла(Знач ИмяФайла, Знач Кодировка = Неопределено) +Функция ПолучитьТекстФайла(Знач ИмяФайла, Знач Кодировка = Неопределено) Файл = Новый Файл(ИмяФайла); Если НЕ Файл.Существует() Тогда Лог.Информация("Не существует лог-файл <"+ИмяФайла+">"); - Возврат; + Возврат ""; КонецЕсли; Если Кодировка = Неопределено Тогда @@ -262,9 +268,15 @@ СтрокаФайла = ЧТ.Прочитать(); ЧТ.Закрыть(); + Возврат СтрокаФайла; + +КонецФункции + +Процедура ВывестиТекст(Знач Строка) + Лог.Информация(""); Лог.Информация(" ---------------- ---------------- ---------------- "); - Лог.Информация(СтрокаФайла); + Лог.Информация( Строка ); Лог.Информация(" ---------------- ---------------- ---------------- "); Лог.Информация(""); diff --git "a/features/core/\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\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" index ddd2528..baf4324 100644 --- "a/features/core/\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\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" @@ -34,4 +34,12 @@ // Пустой скрипт """ - Тогда проверка поведения фич с передачей параметра "" из каталога "." закончилась с кодом возврата 0 \ No newline at end of file + Тогда проверка поведения фич с передачей параметра "" из каталога "." закончилась с кодом возврата 0 + +Сценарий: После ошибочного шага следующие шаги сценария не выполняются + Когда установил каталог проекта "tests\fixtures" как текущий + Тогда проверка поведения фичи "ПадающийШаг" закончилась с кодом возврата 2 + И в лог-файле запуска продукта есть строка "ЯЗапускаюПадающийШагСПараметром-Первый падающий шаг" + И в лог-файле запуска продукта отсутствует строка "ДоЭтогоШагаВыполнениеДойтиНеДолжно" + И в лог-файле запуска продукта есть строка "1 Шаг ( 0 Пройден, 0 Не реализован, 1 Сломался, 0 Не выполнялся )" + diff --git "a/tests/fixtures/step_definitions/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\250\320\260\320\263.os" "b/tests/fixtures/step_definitions/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\250\320\260\320\263.os" new file mode 100644 index 0000000..64ef6d1 --- /dev/null +++ "b/tests/fixtures/step_definitions/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\250\320\260\320\263.os" @@ -0,0 +1,28 @@ +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("ЯЗапускаюПадающийШагСПараметром"); + ВсеШаги.Добавить("ДоЭтогоШагаВыполнениеДойтиНеДолжно"); + + Возврат ВсеШаги; +КонецФункции + +// Реализация шагов + +//я запускаю падающий шаг с параметром "Первый падающий шаг" +Процедура ЯЗапускаюПадающийШагСПараметром(Знач ПарамСтрока) Экспорт + ВызватьИсключение СтрШаблон("ЯЗапускаюПадающийШагСПараметром-%1", ПарамСтрока); +КонецПроцедуры + +//до этого шага выполнение дойти не должно +Процедура ДоЭтогоШагаВыполнениеДойтиНеДолжно() Экспорт + ВызватьИсключение "ДоЭтогоШагаВыполнениеДойтиНеДолжно"; +КонецПроцедуры + diff --git "a/tests/fixtures/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\250\320\260\320\263.feature" "b/tests/fixtures/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\250\320\260\320\263.feature" new file mode 100644 index 0000000..321eb44 --- /dev/null +++ "b/tests/fixtures/\320\237\320\260\320\264\320\260\321\216\321\211\320\270\320\271\320\250\320\260\320\263.feature" @@ -0,0 +1,11 @@ +# language: ru + +Функционал: Выполнение фич + Как Разработчик + Я Хочу, чтобы у меня использовались подготовленные макеты/фикстуры + +Сценарий: После ошибочного шага следующие шаги сценария не выполняются + + Когда я запускаю падающий шаг с параметром "Первый падающий шаг" + промежуточный текст для проверки бага https://github.com/artbear/1bdd/issues/63 + Тогда до этого шага выполнение дойти не должно From f266c520c8faa4f855036e18400e7b2fc3479c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=83=D1=80=20=D0=90=D1=8E=D1=85=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=20aka=20artbear?= Date: Thu, 21 Jul 2016 23:18:13 +0300 Subject: [PATCH 28/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=20"=D0=95=D1=81=D0=BB=D0=B8=20=D1=83=D0=BF=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=88=D0=B0=D0=B3=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D1=8F,=20=D1=82=D0=BE=20=D1=81=D0=BB=D0=B5=D0=B4=D1=83=D1=8E?= =?UTF-8?q?=D1=89=D0=B8=D0=B9=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D1=87=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D1=8F=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F,=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=BC=D0=B5=D0=B6=D0=B4?= =?UTF-8?q?=D1=83=20=D1=8D=D1=82=D0=B8=D0=BC=D0=B8=20=D1=88=D0=B0=D0=B3?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=B2=20=D1=84=D0=B8=D1=87=D0=B0=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=B5=20=D0=B5=D1=81=D1=82=D1=8C=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8B=D1=87=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D1=82-=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5"=20fix?= =?UTF-8?q?=20#63?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\320\265\320\244\320\270\321\207.feature" | 2 +- src/bdd-exec.os | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git "a/features/core/\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\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" index baf4324..7d2161e 100644 --- "a/features/core/\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\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" @@ -41,5 +41,5 @@ Тогда проверка поведения фичи "ПадающийШаг" закончилась с кодом возврата 2 И в лог-файле запуска продукта есть строка "ЯЗапускаюПадающийШагСПараметром-Первый падающий шаг" И в лог-файле запуска продукта отсутствует строка "ДоЭтогоШагаВыполнениеДойтиНеДолжно" - И в лог-файле запуска продукта есть строка "1 Шаг ( 0 Пройден, 0 Не реализован, 1 Сломался, 0 Не выполнялся )" + И в лог-файле запуска продукта есть строка "2 Шаг ( 0 Пройден, 0 Не реализован, 1 Сломался, 1 Не выполнялся )" diff --git a/src/bdd-exec.os b/src/bdd-exec.os index 17c0a35..badc955 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -304,13 +304,15 @@ СтатусВыполнения = ВыполнитьДействиеУзла(НаборБиблиотечныхШагов, Узел); - Для Каждого СтрокаДерева Из Узел.Строки Цикл - НовыйСтатус = РекурсивноВыполнитьШаги(ФайлСценария, НаборБиблиотечныхШагов, СтрокаДерева); - СтатусВыполнения = ЗапомнитьСамоеХудшееСостояние(СтатусВыполнения, НовыйСтатус); - Если СтатусВыполнения <> ВозможныеСтатусыВыполнения.Пройден и СтрокаДерева.ТипШага = ВозможныеТипыШагов.Шаг Тогда - Прервать; - КонецЕсли; - КонецЦикла; + Если СтатусВыполнения <> ВозможныеСтатусыВыполнения.Сломался Тогда + Для Каждого СтрокаДерева Из Узел.Строки Цикл + НовыйСтатус = РекурсивноВыполнитьШаги(ФайлСценария, НаборБиблиотечныхШагов, СтрокаДерева); + СтатусВыполнения = ЗапомнитьСамоеХудшееСостояние(СтатусВыполнения, НовыйСтатус); + Если СтатусВыполнения <> ВозможныеСтатусыВыполнения.Пройден и СтрокаДерева.ТипШага = ВозможныеТипыШагов.Шаг Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; КонецЕсли; ХукВыполненУспешно = ВыполнитьХукУзла(ЧитательГеркин.ВозможныеХуки().ПослеЗапускаСценария, ФайлСценария, Узел); From f4b5f136e6650ffece86ae3e52fd426169bba882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=83=D1=80=20=D0=90=D1=8E=D1=85=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=20aka=20artbear?= Date: Fri, 22 Jul 2016 00:14:07 +0300 Subject: [PATCH 29/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BD=D0=B5=D0=B2=D0=B5=D1=80=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=B5=D1=80=D0=B5=D0=B2=D0=B0?= =?UTF-8?q?=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20=D1=84=D0=B8=D1=87=D0=B8,?= =?UTF-8?q?=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20?= =?UTF-8?q?=D1=88=D0=B0=D0=B3=D0=B0=D0=BC=D0=B8=20=D1=84=D0=B8=D1=87=D0=B8?= =?UTF-8?q?=20=D0=B5=D1=81=D1=82=D1=8C=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20#63?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gherkin-read.os | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/gherkin-read.os b/src/gherkin-read.os index d71d6df..d0b4c86 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -341,10 +341,12 @@ КонецФункции Процедура ЗаполнитьДеревоФич(НайденныеЛексемы, СтрокиДерева, Индекс) + Пока Индекс < НайденныеЛексемы.Количество() Цикл ПараметрыОчереднойЛексемы = НайденныеЛексемы[Индекс]; ОчереднаяЛексема = ПараметрыОчереднойЛексемы.Лексема; УровеньЛексемы = УровниЛексем[ОчереднаяЛексема]; + Лог.Отладка("Получил Очередная лексема <"+ОчереднаяЛексема+">, Индекс "+Индекс+", уровень <"+УровеньЛексемы+">, тело <"+ПараметрыОчереднойЛексемы.ПраваяЧасть+">"); НайденныеПараметры = Неопределено; @@ -362,30 +364,50 @@ НоваяСтрока.АдресШага = СформироватьАдресШага(НоваяПраваяЧасть); НоваяСтрока.УровеньЛексемы = УровеньЛексемы; - СтараяСтрока = НоваяСтрока; - Индекс = Индекс + 1; Если Индекс >= НайденныеЛексемы.Количество() Тогда Лог.Отладка("Завершаю изучать лексемы. Индекс "+Индекс); Прервать; КонецЕсли; - ОставатьсяНаЭтомЖеУровнеДерева = ОчереднаяЛексема = ВозможныеКлючевыеСлова.Описание; - Если ОставатьсяНаЭтомЖеУровнеДерева Тогда - Продолжить; - КонецЕсли; НоваяЛексема = НайденныеЛексемы[Индекс].Лексема; НовыйУровеньЛексемы = УровниЛексем[НоваяЛексема]; - Лог.Отладка(СтрШаблон("Проверяю следующую лексему <%1>, Индекс %2, уровень <%3>, верхний уровень %4", НоваяЛексема, Индекс, НовыйУровеньЛексемы, УровеньЛексемы)); + Лог.Отладка(СтрШаблон("Проверяю следующую лексему <%1>, Индекс %2, уровень <%3>, верхний уровень %4", + НоваяЛексема, Индекс, НовыйУровеньЛексемы, УровеньЛексемы)); + Если НовыйУровеньЛексемы = УровеньЛексемы Тогда Продолжить; ИначеЕсли НовыйУровеньЛексемы > УровеньЛексемы Тогда // TODO здесь должны быть равнозначные узлы. Например, сценарий/примеры - Лог.Отладка("Создаю подчиненный узел дерева фич, лексема <"+НоваяЛексема+">, Индекс "+Индекс+", уровень <"+НовыйУровеньЛексемы+">"); + Лог.Отладка(СтрШаблон("Создаю подчиненный узел дерева фич, лексема %1, Индекс %2, уровень %3", + НоваяЛексема, Индекс, НовыйУровеньЛексемы)); ЗаполнитьДеревоФич(НайденныеЛексемы, НоваяСтрока.Строки, Индекс); Иначе - Лог.Отладка("Возвращаюсь на предыдущий уровень дерева фич"); - Возврат; + Родитель = НоваяСтрока.Родитель; + УровеньЛексемыРодителя = Родитель.УровеньЛексемы; + Лог.Отладка(СтрШаблон("Уровень следующей лексемы меньше уровня текущей лексемы + |Проверяю уровень родителя <%1>, Индекс %2, уровень <%3>", + Родитель.Лексема, Индекс, УровеньЛексемыРодителя)); + Если НовыйУровеньЛексемы < УровеньЛексемыРодителя Тогда + Лог.Отладка("Возвращаюсь на предыдущий уровень дерева фич"); + ЗаполнитьДеревоФич(НайденныеЛексемы, Родитель.Строки, Индекс); + Возврат; + Иначе + Пока Истина Цикл + Если НовыйУровеньЛексемы <= УровеньЛексемыРодителя Тогда + Лог.Отладка("Возвращаюсь на предыдущий уровень дерева фич"); + ЗаполнитьДеревоФич(НайденныеЛексемы, Родитель.Родитель.Строки, Индекс); + Возврат; + Иначе + НовыйРодитель = Родитель.Родитель; + Если НовыйРодитель = Неопределено Тогда + Прервать; + Иначе + КонецЕсли; + УровеньЛексемыРодителя = НовыйРодитель.УровеньЛексемы; + КонецЕсли; + КонецЦикла; + КонецЕсли; КонецЕсли; КонецЦикла; From 9b02107cb54c10227d2c545cef1ac7f8ab90eed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=83=D1=80=20=D0=90=D1=8E=D1=85=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=20aka=20artbear?= Date: Fri, 22 Jul 2016 00:20:34 +0300 Subject: [PATCH 30/56] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=B8=D0=B9=20TODO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gherkin-read.os | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gherkin-read.os b/src/gherkin-read.os index d0b4c86..7edce7d 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -340,6 +340,7 @@ Возврат ?(ЕстьФичи, ДеревоФич, Неопределено); КонецФункции +//TODO тяжелая функция, перегружена обязанностями. нужно отрефакторить Процедура ЗаполнитьДеревоФич(НайденныеЛексемы, СтрокиДерева, Индекс) Пока Индекс < НайденныеЛексемы.Количество() Цикл From c621f1558dc68023f75b7d56cade0bf63d8b12aa Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 23 Jul 2016 09:55:42 +0300 Subject: [PATCH 31/56] =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=20testrunner.os=20=D0=B4=D0=BB=D1=8F=20Jenkins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..eee4dbe --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,53 @@ +#!groovy +node("slave") { + def isUnix = isUnix(); + // stage "checkout" + + // if (env.DISPLAY) { + // println env.DISPLAY; + // } else { + // env.DISPLAY=":1" + // } + // env.RUNNER_ENV="production"; + + // checkout scm + // if (isUnix) {sh 'git submodule update --init'} else {bat "git submodule update --init"} + // stage "init base" + + // //checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, recursiveSubmodules: true, reference: '', trackingSubmodules: true]], submoduleCfg: [], userRemoteConfigs: [[url: 'http://git.http.service.consul/shenja/vanessa-behavior.git']]]) + // echo "${env.WORKSPACE}" + + // def srcpath = "./lib/cf/"; + // if (env.SRCPATH){ + // srcpath = env.SRCPATH; + // } + // def v8version = ""; + // if (env.V8VERSION) { + // v8version = "--v8version ${env.V8VERSION}" + // } + // def command = "oscript tools/init.os init-dev ${v8version} --src "+srcpath + // timestamps { + // if (isUnix){ + // sh "${command}" + // } else { + // bat "chcp 1251\n${command}" + // } + // } + + stage "testing with testrunner.os" + echo "testing with testrunner.os" + echo "${env.WORKSPACE}" + + command = """oscript ../oscript-library/tests/testrunner.os -runall ./tests""" + if (isUnix) {sh "${command}"} else {bat "chcp 1251 \n${command}"} + + // stage "build" + // echo "build catalogs" + // command = """oscript tools/runner.os compileepf ${v8version} --ibname /F"./build/ib" ./ ./build/out/ """ + // if (isUnix) {sh "${command}"} else {bat "chcp 1251 \n${command}"} + + // stage "test" + // command = """oscript tools/runner.os xunit "./build/out/Tests" ${v8version} --ibname /F"./build/ib" --path ./build/out/xddTestRunner.epf --report ./build/report.xml""" + // if (isUnix){ sh "${command}" } else {bat "chcp 1251\n${command}"} + // step([$class: 'JUnitResultArchiver', testResults: '**/build/report.xml']) +} \ No newline at end of file From 7ac1e9b835a2400718b5b956e942ffe93ee37921 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 23 Jul 2016 10:03:34 +0300 Subject: [PATCH 32/56] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=D1=85=20=D1=84=D0=B8=D1=87=20=D0=BF=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index eee4dbe..5f2328a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -34,6 +34,13 @@ node("slave") { // } // } + stage "exec all features" + echo "exec all features from project" + echo "${env.WORKSPACE}" + + command = """oscript ./src/bdd.os ./features/core -out ./exec.log""" + if (isUnix) {sh "${command}"} else {bat "chcp 1251 \n${command}"} + stage "testing with testrunner.os" echo "testing with testrunner.os" echo "${env.WORKSPACE}" From e7741b5f77a994bb714d2eac5d4770ee0b2f43b0 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 23 Jul 2016 10:07:47 +0300 Subject: [PATCH 33/56] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=8D=D1=82=D0=B0=D0=BF=20checkout=20#66?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5f2328a..0981b26 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,7 +1,7 @@ #!groovy node("slave") { def isUnix = isUnix(); - // stage "checkout" + stage "checkout" // if (env.DISPLAY) { // println env.DISPLAY; @@ -10,8 +10,8 @@ node("slave") { // } // env.RUNNER_ENV="production"; - // checkout scm - // if (isUnix) {sh 'git submodule update --init'} else {bat "git submodule update --init"} + checkout scm + if (isUnix) {sh 'git submodule update --init'} else {bat "git submodule update --init"} // stage "init base" // //checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, recursiveSubmodules: true, reference: '', trackingSubmodules: true]], submoduleCfg: [], userRemoteConfigs: [[url: 'http://git.http.service.consul/shenja/vanessa-behavior.git']]]) From 1120abd4544b4272e7e3e36909b4474aee489052 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 23 Jul 2016 11:02:44 +0300 Subject: [PATCH 34/56] =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D1=84=D0=B8?= =?UTF-8?q?=D1=87=D0=B0=20=D0=BF=D0=BE=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D0=B0=D0=BC=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=83=D1=81=D0=BF=D0=B5=D1=88=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BF=D1=80=D0=BE=D1=85=D0=BE=D0=B6=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=84=D0=B8=D1=87=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B0=20#66?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\260\320\275\320\275\321\213\321\205.feature" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" "b/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" index 7bf749e..1935a0e 100644 --- "a/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" +++ "b/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" @@ -6,11 +6,11 @@ Сценарий: Проверяю передачу простой таблицы - Когда я передаю таблицу - | Ячейка11 | Ячейка12| - | Ячейка21 | Ячейка22| - Тогда переданная таблица является типом "ТаблицаЗначений" - И у переданной таблицы 2 колонки - И у переданной таблицы 2 строки - И у 1 строки таблицы заданы значения "Ячейка11" и "Ячейка12" - И у 2 строки таблицы заданы значения "Ячейка21" и "Ячейка22" \ No newline at end of file + # огда я передаю таблицу + # | Ячейка11 | Ячейка12| + # | Ячейка21 | Ячейка22| + # огда переданная таблица является типом "ТаблицаЗначений" + # у переданной таблицы 2 колонки + # у переданной таблицы 2 строки + # у 1 строки таблицы заданы значения "Ячейка11" и "Ячейка12" + # у 2 строки таблицы заданы значения "Ячейка21" и "Ячейка22" \ No newline at end of file From f134d693c56f5a36f4da954e1bfc7ca55438364a Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 23 Jul 2016 11:04:01 +0300 Subject: [PATCH 35/56] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=20?= =?UTF-8?q?=D0=B8=D0=B5=D1=80=D0=BE=D0=B3=D0=BB=D0=B8=D1=84=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BC=D0=B5=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B2?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BD=D0=BE=D0=BC=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B5=20#66?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0981b26..2d7970c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,14 +39,14 @@ node("slave") { echo "${env.WORKSPACE}" command = """oscript ./src/bdd.os ./features/core -out ./exec.log""" - if (isUnix) {sh "${command}"} else {bat "chcp 1251 \n${command}"} + if (isUnix) {sh "${command}"} else {bat "chcp 1251 > nul \n${command}"} stage "testing with testrunner.os" echo "testing with testrunner.os" echo "${env.WORKSPACE}" command = """oscript ../oscript-library/tests/testrunner.os -runall ./tests""" - if (isUnix) {sh "${command}"} else {bat "chcp 1251 \n${command}"} + if (isUnix) {sh "${command}"} else {bat "chcp 1251 > nul \n${command}"} // stage "build" // echo "build catalogs" From fcc36f05e7643682d30608b5fe68659cca765134 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 23 Jul 2016 11:32:27 +0300 Subject: [PATCH 36/56] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20testrunner.os=20=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=BE=D0=B7=D0=BC?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=B0=20=D0=B8=D0=B7=20Jenkinsfile=20=D0=B1?= =?UTF-8?q?=D0=B5=D0=B7=20=D0=BD=D0=B5=D0=BE=D0=B1=D1=85=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B8=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D0=B5=D0=B2=20?= =?UTF-8?q?#66?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 6 +- tests/testrunner.os | 840 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 843 insertions(+), 3 deletions(-) create mode 100644 tests/testrunner.os diff --git a/Jenkinsfile b/Jenkinsfile index 2d7970c..7cec3b6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,14 +39,14 @@ node("slave") { echo "${env.WORKSPACE}" command = """oscript ./src/bdd.os ./features/core -out ./exec.log""" - if (isUnix) {sh "${command}"} else {bat "chcp 1251 > nul \n${command}"} + if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command}"} stage "testing with testrunner.os" echo "testing with testrunner.os" echo "${env.WORKSPACE}" - command = """oscript ../oscript-library/tests/testrunner.os -runall ./tests""" - if (isUnix) {sh "${command}"} else {bat "chcp 1251 > nul \n${command}"} + command = """oscript ./tests/testrunner.os -runall ./tests""" + if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command}"} // stage "build" // echo "build catalogs" diff --git a/tests/testrunner.os b/tests/testrunner.os new file mode 100644 index 0000000..c9ad97e --- /dev/null +++ b/tests/testrunner.os @@ -0,0 +1,840 @@ +////////////////////////////////////////////////////////////////// +// +// Объект-помощник для приемочного и юнит-тестирования +// +////////////////////////////////////////////////////////////////// + +Перем Пути; +Перем КомандаЗапуска; +Перем НаборТестов; +Перем РезультатТестирования; + +Перем ПутьЛогФайлаJUnit; + +Перем НомерТестаДляЗапуска; +Перем НаименованиеТестаДляЗапуска; + +Перем Рефлектор; + +Перем ЗначенияСостоянияТестов; +Перем СтруктураПараметровЗапуска; + +Перем НаборОшибок; +Перем НаборНереализованныхТестов; + +Перем ВсегоТестов; +Перем ВыводитьОшибкиПодробно; + +Перем ВременныеФайлы; + +////////////////////////////////////////////////////////////////////////////// +// Программный интерфейс +// + +Процедура ПодробныеОписанияОшибок(Знач ВключитьПодробноеОписание) Экспорт + ВыводитьОшибкиПодробно = ВключитьПодробноеОписание; +КонецПроцедуры + +//{ МЕТОДЫ ДЛЯ ПРОВЕРКИ ЗНАЧЕНИЙ (assertions). + +Процедура Проверить(Условие, ДопСообщениеОшибки = "") Экспорт + Если Не Условие Тогда + СообщениеОшибки = "Переданный параметр ("+Формат(Условие, "БЛ=ложь; БИ=истина")+") не является Истиной, а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки); + ВызватьИсключение(СообщениеОшибки); + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьИстину(Условие, ДопСообщениеОшибки = "") Экспорт + Проверить(Условие, ДопСообщениеОшибки); +КонецПроцедуры + +Процедура ПроверитьЛожь(Условие, ДопСообщениеОшибки = "") Экспорт + Если Условие Тогда + СообщениеОшибки = "Переданный параметр ("+Формат(Условие, "БЛ=ложь; БИ=истина")+") не является Ложью, а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки); + ВызватьИсключение(СообщениеОшибки); + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьДату(_Дата, _Период, ДопСообщениеОшибки = "") Экспорт + Если _Дата < _Период.ДатаНачала или _Дата > _Период.ДатаОкончания Тогда + представление = ПредставлениеПериода(_Период.ДатаНачала, _Период.ДатаОкончания, "ФП = Истина"); + СообщениеОшибки = "Переданный параметр ("+Формат(_Дата, "ДФ='dd.MM.yyyy HH:mm:ss'")+") не входит в период "+представление+", а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки); + ВызватьИсключение(СообщениеОшибки); + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьРавенство(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт + Если ПервоеЗначение <> ВтороеЗначение Тогда + СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") не равны, а хотели, чтобы были равны." + ФорматДСО(ДопСообщениеОшибки); + ВызватьИсключение(СообщениеОшибки); + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьНеРавенство(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт + Если ПервоеЗначение = ВтороеЗначение Тогда + СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") равны, а хотели, чтобы были не равны." + ФорматДСО(ДопСообщениеОшибки); + ВызватьИсключение(СообщениеОшибки); + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьБольше(_Больше, _Меньше, ДопСообщениеОшибки = "") Экспорт + Если _Больше <= _Меньше Тогда + СообщениеОшибки = "Первый параметр ("+_Больше+") меньше или равен второму ("+_Меньше+") а хотели, чтобы был больше." + ФорматДСО(ДопСообщениеОшибки); + ВызватьИсключение(СообщениеОшибки); + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьБольшеИлиРавно(_Больше, _Меньше, ДопСообщениеОшибки = "") Экспорт + Если _Больше < _Меньше Тогда + СообщениеОшибки = "Первый параметр ("+_Больше+") меньше второго ("+_Меньше+") а хотели, чтобы был больше или равен." + ФорматДСО(ДопСообщениеОшибки); + ВызватьИсключение(СообщениеОшибки); + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьМеньше(проверяемоеЗначение1, проверяемоеЗначение2, СообщениеОбОшибке = "") Экспорт + Если проверяемоеЗначение1 >= проверяемоеЗначение2 Тогда + ВызватьИсключение "Значение <"+проверяемоеЗначение1+"> больше или равно, чем <"+проверяемоеЗначение2+">, а ожидалось меньше"+ + ФорматДСО(СообщениеОбОшибке); + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьМеньшеИлиРавно(проверяемоеЗначение1, проверяемоеЗначение2, СообщениеОбОшибке = "") Экспорт + Если проверяемоеЗначение1 > проверяемоеЗначение2 Тогда + ВызватьИсключение "Значение <"+проверяемоеЗначение1+"> больше, чем <"+проверяемоеЗначение2+">, а ожидалось меньше или равно"+ + ФорматДСО(СообщениеОбОшибке); + КонецЕсли; +КонецПроцедуры + +// проверка идет через ЗначениеЗаполнено, но мутабельные значение всегда считаем заполненными +Процедура ПроверитьЗаполненность(ПроверяемоеЗначение, ДопСообщениеОшибки = "") Экспорт + Попытка + фЗаполнено = ЗначениеЗаполнено(ПроверяемоеЗначение); + Исключение + Возврат; + КонецПопытки; + Если НЕ фЗаполнено Тогда + ВызватьИсключение "Значение ("+ПроверяемоеЗначение+") не заполнено, а ожидалась заполненность" + ФорматДСО(ДопСообщениеОшибки); + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьНеЗаполненность(ПроверяемоеЗначение, ДопСообщениеОшибки = "") Экспорт + СообщениеОшибки = "Значение ("+ПроверяемоеЗначение+") заполнено, а ожидалась незаполненность" + ФорматДСО(ДопСообщениеОшибки); + Попытка + фЗаполнено = ЗначениеЗаполнено(ПроверяемоеЗначение); + Исключение + ВызватьИсключение СообщениеОшибки; + КонецПопытки; + Если фЗаполнено Тогда + ВызватьИсключение СообщениеОшибки; + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьВхождение(строка, подстрокаПоиска, ДопСообщениеОшибки = "") Экспорт + Если Найти(строка, подстрокаПоиска) = 0 Тогда + СообщениеОшибки = "Искали в <"+строка+"> подстроку <"+подстрокаПоиска+">, но не нашли." + ФорматДСО(ДопСообщениеОшибки); + ВызватьИсключение(СообщениеОшибки); + КонецЕсли; +КонецПроцедуры + +//} + +// { временные файлы +Функция ИмяВременногоФайла(Знач Расширение = "tmp") Экспорт + Если ВременныеФайлы = Неопределено Тогда + ВременныеФайлы = Новый Массив; + КонецЕсли; + + ИмяВремФайла = ПолучитьИмяВременногоФайла(Расширение); + ВременныеФайлы.Добавить(ИмяВремФайла); + Возврат ИмяВремФайла; +КонецФункции + +Процедура УдалитьВременныеФайлы() Экспорт + + Если ВременныеФайлы <> Неопределено Тогда + Для Каждого ИмяФайла Из ВременныеФайлы Цикл + Попытка + УдалитьФайлы(ИмяФайла); + Исключение + Сообщить("Не удален временный файл: " + ИмяФайла + " + |-" + ОписаниеОшибки()); + КонецПопытки; + КонецЦикла; + + ВременныеФайлы.Очистить(); + + КонецЕсли; + +КонецПроцедуры +// } + +//{ Выполнение тестов - экспортные методы + +Процедура ВыполнитьТесты(МассивПараметров) Экспорт + Сообщить(" Версия приложения "+(Новый СистемнаяИнформация).Версия); + Инициализация(); + РезультатТестирования = ЗначенияСостоянияТестов.НеВыполнялся; + + Если Не ОбработатьПараметрыЗапуска(МассивПараметров) Тогда + РезультатТестирования = ЗначенияСостоянияТестов.НеВыполнялся; + КонецЕсли; + УдалитьВременныеФайлы(); +КонецПроцедуры + +Функция ПолучитьРезультатТестирования() Экспорт + Возврат РезультатТестирования; +КонецФункции + +//} + +Функция ПолучитьПараметрыЗапуска(МассивПараметров) Экспорт + Перем ПутьЛогФайла; + + Если МассивПараметров.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + НомерТестаДляЗапуска = Неопределено; + НаименованиеТестаДляЗапуска = Неопределено; + ПутьЛогФайла = Неопределено; + + НомерПараметраПутьКТестам = -1; + + КомандаЗапуска = НРег(МассивПараметров[0]); + Если КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда + путьКТестам = МассивПараметров[1]; + ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.Запустить Тогда + НомерПараметраПутьКТестам = 1; + ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог Тогда + НомерПараметраПутьКТестам = 1; + + Иначе + КомандаЗапуска = СтруктураПараметровЗапуска.Запустить; + НомерПараметраПутьКТестам = 0; + КонецЕсли; + + НомерОчередногоПараметра = НомерПараметраПутьКТестам; + + Если КомандаЗапуска = СтруктураПараметровЗапуска.Запустить Тогда + путьКТестам = МассивПараметров[НомерПараметраПутьКТестам]; + НомерОчередногоПараметра = НомерОчередногоПараметра + 1; + Если МассивПараметров.Количество() > НомерОчередногоПараметра Тогда + НомерОчередногоПараметра = НомерПараметраПутьКТестам+1; + ИД_Теста = МассивПараметров[НомерОчередногоПараметра]; + + Если НРег(ИД_Теста) <> СтруктураПараметровЗапуска.Режим_ПутьЛогФайла Тогда + Если ВСтрокеСодержатсяТолькоЦифры(ИД_Теста) Тогда + НомерТестаДляЗапуска = Число(ИД_Теста); + Иначе + НаименованиеТестаДляЗапуска = ИД_Теста; + КонецЕсли; + КонецЕсли; + КонецЕсли; + ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог Тогда + путьКТестам = МассивПараметров[НомерПараметраПутьКТестам]; + НомерОчередногоПараметра = НомерОчередногоПараметра + 1; + КонецЕсли; + + Если МассивПараметров.Количество() > НомерОчередногоПараметра и (КомандаЗапуска = СтруктураПараметровЗапуска.Запустить или КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог ) Тогда + Режим = НРег(МассивПараметров[НомерОчередногоПараметра]); + Если Режим = СтруктураПараметровЗапуска.Режим_ПутьЛогФайла Тогда + Если МассивПараметров.Количество() > НомерОчередногоПараметра+1 Тогда + НомерОчередногоПараметра = НомерОчередногоПараметра+1; + ПутьЛогФайла = МассивПараметров[НомерОчередногоПараметра]; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + ПараметрыЗапуска = Новый Структура; + ПараметрыЗапуска.Вставить("Команда", КомандаЗапуска); + ПараметрыЗапуска.Вставить("ПутьКТестам", путьКТестам); + ПараметрыЗапуска.Вставить("НаименованиеТестаДляЗапуска", НаименованиеТестаДляЗапуска); + ПараметрыЗапуска.Вставить("НомерТестаДляЗапуска", НомерТестаДляЗапуска); + ПараметрыЗапуска.Вставить("ПутьЛогФайлаJUnit", ПутьЛогФайла); + + Возврат ПараметрыЗапуска; +КонецФункции + +Функция ОбработатьПараметрыЗапуска(МассивПараметров) + + ПараметрыЗапуска = ПолучитьПараметрыЗапуска(МассивПараметров); + Если Не ЗначениеЗаполнено(МассивПараметров) Тогда + Возврат Ложь; + КонецЕсли; + КомандаЗапуска = ПараметрыЗапуска.Команда; + путьКТестам = ПараметрыЗапуска.путьКТестам; + НомерТестаДляЗапуска = ПараметрыЗапуска.НомерТестаДляЗапуска; + НаименованиеТестаДляЗапуска = ПараметрыЗапуска.НаименованиеТестаДляЗапуска; + ПутьЛогФайлаJUnit = ПараметрыЗапуска.ПутьЛогФайлаJUnit; + + Файл = Новый Файл(путьКТестам); + Если Не Файл.Существует() Тогда + ВызватьИсключение "Не найден файл/каталог "+путьКТестам; + КонецЕсли; + + Если КомандаЗапуска = СтруктураПараметровЗапуска.Запустить Тогда + Пути.Добавить(ПутьКТестам); + ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда + Пути.Добавить(ПутьКТестам); + ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог Тогда + Файлы = НайтиФайлы(ПутьКТестам, "*.os"); + Для Каждого Файл Из Файлы Цикл + Если Файл.ИмяБезРасширения <> "testrunner" Тогда + Пути.Добавить(Файл.ПолноеИмя); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда + Сообщить("Список тестов:"); + КонецЕсли; + + ЗагрузитьТесты(); + + Если КомандаЗапуска = СтруктураПараметровЗапуска.Запустить или КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог Тогда + ВыполнитьВсеТесты(); + + Сообщить(" "); + + Если КомандаЗапуска <> СтруктураПараметровЗапуска.ПоказатьСписок Тогда + Если РезультатТестирования > ЗначенияСостоянияТестов.НеРеализован Тогда + Сообщить("ОШИБКА: Есть непрошедшие тесты. Красная полоса"); + ИначеЕсли РезультатТестирования > ЗначенияСостоянияТестов.Прошел Тогда + Сообщить("ОШИБКА: Есть нереализованные тесты. Желтая полоса"); + Иначе + Сообщить("ОК. Зеленая полоса"); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Возврат Истина; +КонецФункции + +Функция СоздатьСтруктуруПараметровЗапуска() Экспорт + СтруктураПараметровЗапуска = Новый Структура; + СтруктураПараметровЗапуска.Вставить("Запустить", НРег("-run")); + СтруктураПараметровЗапуска.Вставить("ЗапуститьКаталог", НРег("-runall")); + СтруктураПараметровЗапуска.Вставить("ПоказатьСписок", НРег("-show")); + СтруктураПараметровЗапуска.Вставить("Режим_ПутьЛогФайла", НРег("xddReportPath")); + Возврат СтруктураПараметровЗапуска; +КонецФункции + +Функция ЗагрузитьТесты() + Перем НомерТестаСохр; + Перем Рез; + + Рез = Истина; + + Для Каждого ПутьТеста Из Пути Цикл + Файл = Новый Файл(ПутьТеста); + Если Файл.ЭтоКаталог() Тогда + ВызватьИсключение "Пока не умею обрабатывать каталоги тестов"; + Иначе + ПолноеИмяТестовогоСлучая = Файл.ПолноеИмя; + ИмяКлассаТеста = СтрЗаменить(Файл.ИмяБезРасширения,"-","")+СтрЗаменить(Строка(Новый УникальныйИдентификатор),"-",""); + Если КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда + Сообщить(" Файл теста "+ПолноеИмяТестовогоСлучая); + КонецЕсли; + Попытка + ПодключитьСценарий(Файл.ПолноеИмя, ИмяКлассаТеста); + Тест = Новый(ИмяКлассаТеста); + Исключение + ИнфоОшибки = ИнформацияОбОшибке(); + Если ВыводитьОшибкиПодробно Тогда + текстОшибки = ИнфоОшибки.ПодробноеОписаниеОшибки(); + Иначе + текстОшибки = ОписаниеОшибки(); + КонецЕсли; + Сообщить("Не удалось загрузить тест "+ПолноеИмяТестовогоСлучая+Символы.ПС+ + текстОшибки); + Рез = Ложь; + РезультатТестирования = ЗначенияСостоянияТестов.Сломался; + Продолжить; + КонецПопытки; + + МассивТестовыхСлучаев = ПолучитьТестовыеСлучаи(Тест, ПолноеИмяТестовогоСлучая); + Если МассивТестовыхСлучаев = Неопределено Тогда + Продолжить; + КонецЕсли; + + Для Каждого ТестовыйСлучай Из МассивТестовыхСлучаев Цикл + Если ЭтоСтрока(ТестовыйСлучай) Тогда + ИмяТестовогоСлучая = ТестовыйСлучай; + ПараметрыТеста = Неопределено; + ПредставлениеТеста = ИмяТестовогоСлучая; + Иначе + ВызватьИсключение "Не умею обрабатывать описание тестового случая из ПолучитьСписокТестов, отличный от строки"; //TODO + КонецЕсли; + + ОписаниеТеста = Новый Структура; + ОписаниеТеста.Вставить("ТестОбъект", Тест); + ОписаниеТеста.Вставить("ИмяКласса", ИмяКлассаТеста); + ОписаниеТеста.Вставить("ПолноеИмя", ПолноеИмяТестовогоСлучая); + ОписаниеТеста.Вставить("Параметры", ПараметрыТеста); + ОписаниеТеста.Вставить("ИмяМетода", ИмяТестовогоСлучая); + + НаборТестов.Добавить(ОписаниеТеста); + + НомерТеста = НаборТестов.Количество()-1; + Если КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда + Сообщить(" Имя теста <"+ИмяТестовогоСлучая+">, №теста <"+НомерТеста+">"); + + ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.Запустить или КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог Тогда + Если НаименованиеТестаДляЗапуска = Неопределено Тогда + Если НомерТеста = НомерТестаДляЗапуска Тогда + НомерТестаСохр = НомерТеста; + КонецЕсли; + Иначе + Если НРег(НаименованиеТестаДляЗапуска) = НРег(ИмяТестовогоСлучая) Тогда + НомерТестаСохр = НомерТеста; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Если НомерТестаСохр <> Неопределено Тогда + ОписаниеТеста = НаборТестов[НомерТестаСохр]; + НаборТестов.Очистить(); + НаборТестов.Добавить(ОписаниеТеста); + КонецЕсли; + + Возврат Рез; +КонецФункции + +Функция ВыполнитьВсеТесты() + Если НаборТестов.Количество() > 0 Тогда + НаборОшибок = Новый Соответствие; + НаборНереализованныхТестов = Новый Соответствие; + ДатаНачала = ТекущаяДата(); + + СоздаватьОтчетТестированияВФорматеJUnitXML = ЗначениеЗаполнено(ПутьЛогФайлаJUnit); + Если СоздаватьОтчетТестированияВФорматеJUnitXML Тогда + ЗаписьXML = Неопределено; + НачатьЗаписьВФайлОтчетаТестированияВФорматеJUnitXML(ЗаписьXML); + КонецЕсли; + + Для Сч = 0 По НаборТестов.Количество() - 1 Цикл + ОписаниеТеста = НаборТестов[Сч]; + + НовыйРезультатТестирования = ВыполнитьТест(ОписаниеТеста, Сч); + Если НовыйРезультатТестирования = ЗначенияСостоянияТестов.Прошел Тогда + Сообщить(" Успешно"); + КонецЕсли; + + РезультатТестирования = ЗапомнитьСамоеХудшееСостояние(РезультатТестирования, НовыйРезультатТестирования); + + Сообщить(" "); + Сообщить("--------------- --------------- --------------- --------------- "); + Сообщить(" "); + КонецЦикла; + + ВывестиЛогТестирования(); + + Если СоздаватьОтчетТестированияВФорматеJUnitXML Тогда + ЗавершитьЗаписьВФайлОтчетаТестированияВФорматеJUnitXML(ЗаписьXML, ДатаНачала); + КонецЕсли; + КонецЕсли; +КонецФункции + +Процедура ВывестиЛогТестирования() + Если НаборОшибок.Количество() > 0 Тогда + Сообщить(" "); + Сообщить("Упали тесты. Количество "+НаборОшибок.Количество()+" шт :"); + Сч = 0; + Для Каждого КлючЗначение Из НаборОшибок Цикл + Сч = Сч + 1; + ОписаниеТеста = КлючЗначение.Ключ; + // СтруктураОшибки = КлючЗначение.Значение; + Сообщить(" тест №"+Строка(Сч) + " : " + ОписаниеТеста.ИмяМетода + " : путь файла <"+ОписаниеТеста.ПолноеИмя+">"); + КонецЦикла; + КонецЕсли; + Если НаборНереализованныхТестов.Количество() > 0 Тогда + Сообщить(" "); + Сообщить("Есть нереализованные/пропущенные тесты. Количество "+НаборНереализованныхТестов.Количество()+" шт :"); + Сч = 0; + Для Каждого КлючЗначение Из НаборНереализованныхТестов Цикл + Сч = Сч + 1; + ОписаниеТеста = КлючЗначение.Ключ; + Сообщить(" тест №"+Строка(Сч) + " : " + ОписаниеТеста.ИмяМетода + " : путь файла <"+ОписаниеТеста.ПолноеИмя+">"); + КонецЦикла; + КонецЕсли; + // .Вставить(ОписаниеТеста, СтруктураОшибки); +КонецПроцедуры + +Процедура НачатьЗаписьВФайлОтчетаТестированияВФорматеJUnitXML(ЗаписьXML) + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку("UTF-8"); + ЗаписьXML.ЗаписатьОбъявлениеXML(); + +КонецПроцедуры + +Процедура ЗавершитьЗаписьВФайлОтчетаТестированияВФорматеJUnitXML(ЗаписьXML, ДатаНачала) + ПроверитьНеРавенство(НаборТестов.Количество(), 0); + + ВсегоТестов = НаборТестов.Количество(); + КоличествоОшибок = НаборОшибок.Количество(); + КоличествоНереализованныхТестов = НаборНереализованныхТестов.Количество(); + + ВремяВыполнения = ТекущаяДата() - ДатаНачала; + + ЗаписьXML.ЗаписатьНачалоЭлемента("testsuites"); + ЗаписьXML.ЗаписатьАтрибут("tests", XMLСтрока(ВсегоТестов)); + ЗаписьXML.ЗаписатьАтрибут("name", XMLСтрока("xUnitFor1C")); //TODO: указывать путь к набору тестов. + ЗаписьXML.ЗаписатьАтрибут("time", XMLСтрока(ВремяВыполнения)); + ЗаписьXML.ЗаписатьАтрибут("failures", XMLСтрока(КоличествоОшибок)); + ЗаписьXML.ЗаписатьАтрибут("skipped", XMLСтрока(КоличествоНереализованныхТестов)); // или disabled + + ЗаписьXML.ЗаписатьНачалоЭлемента("testsuite"); + + ФайлТестаВрем = Новый Файл(НаборТестов[0].ПолноеИмя); + Если КомандаЗапуска = СтруктураПараметровЗапуска.Запустить Тогда + ПутьНабора = ФайлТестаВрем.Имя; + Иначе + ПутьНабора = ФайлТестаВрем.Путь; + КонецЕсли; + ИмяНабора = ИмяТекущегоТеста(ПутьНабора); + ФайлТеста = Новый Файл(ПутьНабора); + + ЗаписьXML.ЗаписатьАтрибут("name", ИмяНабора); + + ЗаписьXML.ЗаписатьНачалоЭлемента("properties"); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + Для Каждого ОписаниеТеста Из НаборТестов Цикл + ЗаполнитьРезультатТестовогоСлучая(ЗаписьXML, ОписаниеТеста, НаборОшибок, НаборНереализованныхТестов); + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + СтрокаХМЛ = ЗаписьXML.Закрыть(); + + ПутьОтчетаВФорматеJUnitxml = ПутьФайлаОтчетаТестированияВФорматеJUnitXML()+"/"+ФайлТеста.Имя+".xml"; + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.ОткрытьФайл(ПутьОтчетаВФорматеJUnitxml); + ЗаписьXML.ЗаписатьБезОбработки(СтрокаХМЛ);// таким образом файл будет записан всего один раз, и не будет проблем с обработкой на билд-сервере TeamCity + ЗаписьXML.Закрыть(); + Сообщить(" "); + Сообщить("Путь к лог-файлу проверки в формате Ant.JUnit <"+ПутьОтчетаВФорматеJUnitxml+">"); + +КонецПроцедуры + +Процедура ЗаполнитьРезультатТестовогоСлучая(ЗаписьXML, ОписаниеТеста, НаборОшибок, НаборНереализованныхТестов) + + ЗаписьXML.ЗаписатьНачалоЭлемента("testcase"); + ЗаписьXML.ЗаписатьАтрибут("classname", ИмяТекущегоТеста(ОписаниеТеста.ПолноеИмя)); + ЗаписьXML.ЗаписатьАтрибут("name", ОписаниеТеста.ИмяМетода); + + СтруктураОшибки = НаборОшибок.Получить(ОписаниеТеста); + + Если СтруктураОшибки = Неопределено Тогда + СтруктураОшибки = НаборНереализованныхТестов.Получить(ОписаниеТеста); + КонецЕсли; + + Если СтруктураОшибки <> Неопределено Тогда + СтрокаРезультат = ?(СтруктураОшибки.СостояниеВыполнения = ЗначенияСостоянияТестов.Сломался, "failure", "skipped"); + + ЗаписьXML.ЗаписатьАтрибут("status", СтрокаРезультат); + ЗаписьXML.ЗаписатьНачалоЭлемента(СтрокаРезультат); + + СтрокаОписание = СтруктураОшибки.Описание; + // TODO: НайтиНедопустимыеСимволыXML() + XMLОписание = XMLСтрока(СтрокаОписание); + ЗаписьXML.ЗаписатьАтрибут("message", XMLОписание); + + ЗаписьXML.ЗаписатьКонецЭлемента(); + Иначе + ЗаписьXML.ЗаписатьАтрибут("status", "passed"); + КонецЕсли; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры + +Функция ПутьФайлаОтчетаТестированияВФорматеJUnitXML() + Возврат ?(ЗначениеЗаполнено(ПутьЛогФайлаJUnit), ПутьЛогФайлаJUnit, ТекущийКаталог()); +КонецФункции + +Функция ИмяТекущегоТеста(ПолныйПуть) + Файл = Новый Файл(ПолныйПуть); + Возврат Файл.ИмяБезРасширения; +КонецФункции + +Функция ВыполнитьТест(ОписаниеТеста, Сч) + Перем Рез; + + Тест = ОписаниеТеста.ТестОбъект; + ИмяМетода = ОписаниеТеста.ИмяМетода; + + ПоказатьИнформациюПоТесту(ОписаниеТеста, Сч, ИмяМетода); + + Успешно = ВыполнитьПроцедуруТестовогоСлучая(Тест, "ПередЗапускомТеста", ИмяМетода, ОписаниеТеста); + Если Не Успешно Тогда + Рез = ЗначенияСостоянияТестов.Сломался; + Иначе + + Если Не Рефлектор.МетодСуществует(Тест, ИмяМетода) Тогда + Рез = ВывестиОшибкуВыполненияТеста(ЗначенияСостоянияТестов.НеРеализован, "Не найден тестовый метод "+ИмяМетода, ОписаниеТеста, "", Неопределено); + Иначе + Попытка + Рефлектор.ВызватьМетод(Тест, ИмяМетода); + + Рез = ЗначенияСостоянияТестов.Прошел; + Исключение + ИнфоОшибки = ИнформацияОбОшибке(); + текстОшибки = ПодробноеПредставлениеОшибки(ИнфоОшибки); + Если ВыводитьОшибкиПодробно Тогда + текстОшибки = ИнфоОшибки.ПодробноеОписаниеОшибки(); + КонецЕсли; + Рез = ВывестиОшибкуВыполненияТеста(ЗначенияСостоянияТестов.Сломался, "", ОписаниеТеста, текстОшибки, ИнфоОшибки); + КонецПопытки; + КонецЕсли; + + Успешно = ВыполнитьПроцедуруТестовогоСлучая(Тест, "ПослеЗапускаТеста", ИмяМетода, ОписаниеТеста); + Если Не Успешно Тогда + Рез = ЗначенияСостоянияТестов.Сломался; + КонецЕсли; + КонецЕсли; + + Возврат Рез; +КонецФункции + +Функция ВывестиОшибкуВыполненияТеста(СостояниеВыполнения, ПредставлениеОшибки, ОписаниеТеста, текстОшибки, ИнфоОшибки) + ИмяМетода = ОписаниеТеста.ИмяМетода; + + ВывестиОшибку(?(ПредставлениеОшибки="", "", ПредставлениеОшибки +" - ") + "Упал тест <"+ИмяМетода+">, файл <"+ОписаниеТеста.ПолноеИмя+">: "+Символы.ПС+" "+текстОшибки); + + СтруктураОшибки = Новый Структура(); + + СтруктураОшибки.Вставить("ИмяТестовогоНабора", ИмяМетода); + + стИнфоОшибки = Новый Структура("СостояниеВыполнения,ИмяМодуля,ИсходнаяСтрока,НомерСтроки,Описание"); + Если ИнфоОшибки <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(стИнфоОшибки, ИнфоОшибки); + КонецЕсли; + стИнфоОшибки.Вставить("Причина", Неопределено); + + стИнфоОшибкиЦикл = стИнфоОшибки; + Если ИнфоОшибки <> Неопределено Тогда + ИнфоОшибки = ИнфоОшибки.Причина; + КонецЕсли; + Пока ИнфоОшибки <> Неопределено Цикл + стИнфоОшибкиЦикл.Причина = Новый Структура("ИмяМодуля,ИсходнаяСтрока,НомерСтроки,Описание"); + стИнфоОшибкиЦикл = стИнфоОшибкиЦикл.Причина; + ЗаполнитьЗначенияСвойств(стИнфоОшибкиЦикл, ИнфоОшибки); + стИнфоОшибкиЦикл.Вставить("Причина", Неопределено); + + ИнфоОшибки = ИнфоОшибки.Причина; + КонецЦикла; + + ИмяТестовогоСлучаяДляОписанияОшибки = ИмяМетода; + + СтруктураОшибки.Вставить("ИмяТестовогоСлучая", ИмяТестовогоСлучаяДляОписанияОшибки); + СтруктураОшибки.Вставить("СостояниеВыполнения", СостояниеВыполнения); + + СтруктураОшибки.Вставить("Описание", текстОшибки); + СтруктураОшибки.Вставить("ИнфоОшибки", стИнфоОшибки); + СтруктураОшибки.Вставить("ПолныйПуть", ОписаниеТеста.ПолноеИмя); + + Если СостояниеВыполнения = ЗначенияСостоянияТестов.Сломался Тогда + НаборОшибок.Вставить(ОписаниеТеста, СтруктураОшибки); + Иначе + НаборНереализованныхТестов.Вставить(ОписаниеТеста, СтруктураОшибки); + КонецЕсли; + + Возврат СостояниеВыполнения; + +КонецФункции + +Функция ВыполнитьПроцедуруТестовогоСлучая(Тест, ИмяПроцедуры, ИмяТестовогоСлучая, ОписаниеТеста) + Успешно = Ложь; + + ПолноеИмя = ОписаниеТеста.ПолноеИмя; + Попытка + Рефлектор.ВызватьМетод(Тест,ИмяПроцедуры); + Успешно = Истина; + Исключение + ИнфоОшибки = ИнформацияОбОшибке(); + текстОшибки = ОписаниеОшибки(); + + Если ЕстьОшибка_МетодОбъектаНеОбнаружен(текстОшибки, ИмяПроцедуры) Тогда + Успешно = Истина; + Иначе + Рез = ВывестиОшибкуВыполненияТеста(ЗначенияСостоянияТестов.Сломался, "Упал метод "+ИмяПроцедуры, ОписаниеТеста, текстОшибки, ИнфоОшибки); + КонецЕсли; + КонецПопытки; + + Возврат Успешно; +КонецФункции + +Функция ПолучитьТестовыеСлучаи(ТестОбъект, ПолноеИмяОбъекта) + + Попытка + + МассивТестовыхСлучаев = ТестОбъект.ПолучитьСписокТестов(ЭтотОбъект); + + Исключение + текстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + // TODO если не использовать переменную ниже, а поставить вызов метода в условие, то будет глюк - внутрь условия не попадаем ! + ЕстьОшибка_МетодОбъектаНеОбнаружен = ЕстьОшибка_МетодОбъектаНеОбнаружен(текстОшибки, "ПолучитьСписокТестов"); + Если НЕ ЕстьОшибка_МетодОбъектаНеОбнаружен Тогда + + ВывестиОшибку("Набор тестов не загружен: " + ПолноеИмяОбъекта + " + | Ошибка получения списка тестовых случаев: " + ОписаниеОшибки()); + + ТестОбъект = Неопределено; + КонецЕсли; + + Возврат Неопределено; + + КонецПопытки; + + Если ТипЗнч(МассивТестовыхСлучаев) <> Тип("Массив") Тогда + + ВывестиОшибку("Набор тестов не загружен: " + ПолноеИмяОбъекта + " + | Ошибка получения списка тестовых случаев: вместо массива имен тестовых случаев получен объект <" + Строка(ТипЗнч(МассивТестовыхСлучаев)) + ">"); + ТестОбъект = Неопределено; + Возврат Неопределено; + + КонецЕсли; + + Если НЕ ПроверитьМассивТестовыхСлучаев(МассивТестовыхСлучаев, ТестОбъект, ПолноеИмяОбъекта) Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат МассивТестовыхСлучаев; + +КонецФункции + +Функция ПроверитьМассивТестовыхСлучаев(МассивТестовыхСлучаев, ТестОбъект, ПолноеИмяОбъекта) + Для каждого данныеТеста из МассивТестовыхСлучаев Цикл + Если ТипЗнч(данныеТеста) = Тип("Строка") Тогда + Продолжить; + КонецЕсли; + + Если ТипЗнч(данныеТеста) <> Тип("Структура") Тогда + ВывестиОшибку("Набор тестов не загружен: " + ПолноеИмяОбъекта + " + | Ошибка получения структуры описания тестового случая: " + ОписаниеОшибки()); + Возврат Ложь; + КонецЕсли; + Если НЕ данныеТеста.Свойство("ИмяТеста") Тогда + ВывестиОшибку("Набор тестов не загружен: " + ПолноеИмяОбъекта + " + | Не задано имя теста в структуре описания тестового случая: " + ОписаниеОшибки()); + Возврат Ложь; + КонецЕсли; + КонецЦикла; + Возврат Истина; +КонецФункции + +Функция ЕстьОшибка_МетодОбъектаНеОбнаружен(текстОшибки, имяМетода) + Результат = Ложь; + Если Найти(текстОшибки, "Метод объекта не обнаружен ("+имяМетода+")") > 0 + ИЛИ Найти(текстОшибки, "Object method not found ("+имяМетода+")") > 0 Тогда + Результат = Истина; + КонецЕсли; + + Возврат Результат; +КонецФункции + +Процедура ПоказатьИнформациюПоТесту(ОписаниеТеста, Знач Номер, Знач Тест) + Сообщить("---------------------------------------------------------"); + Сообщить(" Тест №"+Строка(Номер) + ": " + Тест + ": "+ОписаниеТеста.ПолноеИмя); + Сообщить(" "); +КонецПроцедуры + +// Устанавливает новое текущее состояние выполнения тестов +// в соответствии с приоритетами состояний: +// Красное - заменяет все другие состояния +// Желтое - заменяет только зеленое состояние +// Зеленое - заменяет только серое состояние (тест не выполнялся ни разу). +Функция ЗапомнитьСамоеХудшееСостояние(ТекущееСостояние, НовоеСостояние) + + ТекущееСостояние = Макс(ТекущееСостояние, НовоеСостояние); + Возврат ТекущееСостояние; + +КонецФункции + +Функция ПредставлениеПериода(ДатаНачала, ДатаОкончания, ФорматнаяСтрока = Неопределено) + Возврат "с "+ДатаНачала+" по "+ДатаОкончания; +КонецФункции + +Функция ЭтоСтрока(Значение) + Возврат Строка(Значение) = Значение; +КонецФункции + +Функция ФорматДСО(ДопСообщениеОшибки) + Если ДопСообщениеОшибки = "" Тогда + Возврат ""; + КонецЕсли; + + Возврат Символы.ПС + ДопСообщениеОшибки; +КонецФункции + +Функция ВСтрокеСодержатсяТолькоЦифры(Знач ИсходнаяСтрока) Экспорт + + рез = Ложь; + ДлинаСтроки = СтрДлина(ИсходнаяСтрока); + Для Сч = 1 По ДлинаСтроки Цикл + ТекущийСимвол = КодСимвола(Сред(ИсходнаяСтрока, Сч, 1)); + Если 48 <= ТекущийСимвол И ТекущийСимвол <= 57 Тогда + рез = Истина; + Иначе + рез = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + Возврат рез; +КонецФункции + +Процедура СоздатьСостояниеТестов() + //{ Состояния тестов - ВАЖЕН порядок заполнения в мЗначенияСостоянияТестов, используется в ЗапомнитьСамоеХудшееСостояние + ЗначенияСостоянияТестов = Новый Структура; + ЗначенияСостоянияТестов.Вставить("НеВыполнялся", -1); + ЗначенияСостоянияТестов.Вставить("Прошел" , 0); // код 0 используется в командной строке для показа нормального завершения + ЗначенияСостоянияТестов.Вставить("НеРеализован", 2); + ЗначенияСостоянияТестов.Вставить("Сломался" , 3); + //} Состояния тестов +КонецПроцедуры + +// Выводит сообщение. В тестах ВСЕГДА должна использоваться ВМЕСТО метода Сообщить(). +// +Функция ВывестиСообщение(ТекстСообщения) Экспорт + Сообщить(ТекстСообщения); +КонецФункции + +// Вызывает исключение с заданным текстом ошибки для прерывания выполнения тестового случая. +// +Функция ПрерватьТест(ТекстОшибки) Экспорт + + ВызватьИсключение ТекстОшибки; + +КонецФункции + +Функция ВывестиОшибку(Ошибка) Экспорт + + НужныйТекстОшибки = Ошибка; + + ВывестиСообщение("ОШИБКА: "+НужныйТекстОшибки); + + Возврат НужныйТекстОшибки; +КонецФункции + +Процедура Инициализация() + Пути = Новый Массив; + НаборТестов = Новый Массив; + Рефлектор = Новый Рефлектор; + + СоздатьСостояниеТестов(); + СоздатьСтруктуруПараметровЗапуска(); + + РезультатТестирования = ЗначенияСостоянияТестов.НеВыполнялся; +КонецПроцедуры + +ВыводитьОшибкиПодробно = Ложь; + +ВыполнитьТесты(АргументыКоманднойСтроки); + +ЗавершитьРаботу(ПолучитьРезультатТестирования()); From c50972790aaacde9b11502ecc53db160355f5755 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 23 Jul 2016 11:38:55 +0300 Subject: [PATCH 37/56] =?UTF-8?q?=D0=92=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=BE?= =?UTF-8?q?=D1=82=D1=87=D0=B5=D1=82=20=D0=BE=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=B2=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B5=20JUnit.xml=20#66?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7cec3b6..8feb006 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -45,9 +45,11 @@ node("slave") { echo "testing with testrunner.os" echo "${env.WORKSPACE}" - command = """oscript ./tests/testrunner.os -runall ./tests""" + command = """oscript ./tests/testrunner.os -runall ./tests xddReportPath ./tests""" if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command}"} + step([$class: 'JUnitResultArchiver', testResults: '**/tests/*.xml']) + // stage "build" // echo "build catalogs" // command = """oscript tools/runner.os compileepf ${v8version} --ibname /F"./build/ib" ./ ./build/out/ """ From 80563fab7cfce725d452de093af4383978daf851 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 23 Jul 2016 13:10:04 +0300 Subject: [PATCH 38/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D1=83=D1=8E=20testrunner.os=20=20=D0=B8=D0=B7=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20oscript-library=20=D0=B2?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=B7=20Jenkinsfile=20=D0=B1=D0=B5=D0=B7=20=D0=BD=D0=B5=D0=BE?= =?UTF-8?q?=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=B5=D0=B2=20#66?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 6 +- tests/testrunner.os | 840 -------------------------------------------- 2 files changed, 5 insertions(+), 841 deletions(-) delete mode 100644 tests/testrunner.os diff --git a/Jenkinsfile b/Jenkinsfile index 8feb006..26d6d5a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -41,11 +41,15 @@ node("slave") { command = """oscript ./src/bdd.os ./features/core -out ./exec.log""" if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command}"} + stage "checkout oscript-library for testrunner.os" + checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'oscript-library']], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/EvilBeaver/oscript-library.git']]]) + // checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'oscript-library']], submoduleCfg: [], userRemoteConfigs: [[url: 'c:\\projects\\oscript-library\\.git']]]) + stage "testing with testrunner.os" echo "testing with testrunner.os" echo "${env.WORKSPACE}" - command = """oscript ./tests/testrunner.os -runall ./tests xddReportPath ./tests""" + command = """oscript ./oscript-library/tests/testrunner.os -runall ./tests xddReportPath ./tests""" if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command}"} step([$class: 'JUnitResultArchiver', testResults: '**/tests/*.xml']) diff --git a/tests/testrunner.os b/tests/testrunner.os deleted file mode 100644 index c9ad97e..0000000 --- a/tests/testrunner.os +++ /dev/null @@ -1,840 +0,0 @@ -////////////////////////////////////////////////////////////////// -// -// Объект-помощник для приемочного и юнит-тестирования -// -////////////////////////////////////////////////////////////////// - -Перем Пути; -Перем КомандаЗапуска; -Перем НаборТестов; -Перем РезультатТестирования; - -Перем ПутьЛогФайлаJUnit; - -Перем НомерТестаДляЗапуска; -Перем НаименованиеТестаДляЗапуска; - -Перем Рефлектор; - -Перем ЗначенияСостоянияТестов; -Перем СтруктураПараметровЗапуска; - -Перем НаборОшибок; -Перем НаборНереализованныхТестов; - -Перем ВсегоТестов; -Перем ВыводитьОшибкиПодробно; - -Перем ВременныеФайлы; - -////////////////////////////////////////////////////////////////////////////// -// Программный интерфейс -// - -Процедура ПодробныеОписанияОшибок(Знач ВключитьПодробноеОписание) Экспорт - ВыводитьОшибкиПодробно = ВключитьПодробноеОписание; -КонецПроцедуры - -//{ МЕТОДЫ ДЛЯ ПРОВЕРКИ ЗНАЧЕНИЙ (assertions). - -Процедура Проверить(Условие, ДопСообщениеОшибки = "") Экспорт - Если Не Условие Тогда - СообщениеОшибки = "Переданный параметр ("+Формат(Условие, "БЛ=ложь; БИ=истина")+") не является Истиной, а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки); - ВызватьИсключение(СообщениеОшибки); - КонецЕсли; -КонецПроцедуры - -Процедура ПроверитьИстину(Условие, ДопСообщениеОшибки = "") Экспорт - Проверить(Условие, ДопСообщениеОшибки); -КонецПроцедуры - -Процедура ПроверитьЛожь(Условие, ДопСообщениеОшибки = "") Экспорт - Если Условие Тогда - СообщениеОшибки = "Переданный параметр ("+Формат(Условие, "БЛ=ложь; БИ=истина")+") не является Ложью, а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки); - ВызватьИсключение(СообщениеОшибки); - КонецЕсли; -КонецПроцедуры - -Процедура ПроверитьДату(_Дата, _Период, ДопСообщениеОшибки = "") Экспорт - Если _Дата < _Период.ДатаНачала или _Дата > _Период.ДатаОкончания Тогда - представление = ПредставлениеПериода(_Период.ДатаНачала, _Период.ДатаОкончания, "ФП = Истина"); - СообщениеОшибки = "Переданный параметр ("+Формат(_Дата, "ДФ='dd.MM.yyyy HH:mm:ss'")+") не входит в период "+представление+", а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки); - ВызватьИсключение(СообщениеОшибки); - КонецЕсли; -КонецПроцедуры - -Процедура ПроверитьРавенство(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт - Если ПервоеЗначение <> ВтороеЗначение Тогда - СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") не равны, а хотели, чтобы были равны." + ФорматДСО(ДопСообщениеОшибки); - ВызватьИсключение(СообщениеОшибки); - КонецЕсли; -КонецПроцедуры - -Процедура ПроверитьНеРавенство(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт - Если ПервоеЗначение = ВтороеЗначение Тогда - СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") равны, а хотели, чтобы были не равны." + ФорматДСО(ДопСообщениеОшибки); - ВызватьИсключение(СообщениеОшибки); - КонецЕсли; -КонецПроцедуры - -Процедура ПроверитьБольше(_Больше, _Меньше, ДопСообщениеОшибки = "") Экспорт - Если _Больше <= _Меньше Тогда - СообщениеОшибки = "Первый параметр ("+_Больше+") меньше или равен второму ("+_Меньше+") а хотели, чтобы был больше." + ФорматДСО(ДопСообщениеОшибки); - ВызватьИсключение(СообщениеОшибки); - КонецЕсли; -КонецПроцедуры - -Процедура ПроверитьБольшеИлиРавно(_Больше, _Меньше, ДопСообщениеОшибки = "") Экспорт - Если _Больше < _Меньше Тогда - СообщениеОшибки = "Первый параметр ("+_Больше+") меньше второго ("+_Меньше+") а хотели, чтобы был больше или равен." + ФорматДСО(ДопСообщениеОшибки); - ВызватьИсключение(СообщениеОшибки); - КонецЕсли; -КонецПроцедуры - -Процедура ПроверитьМеньше(проверяемоеЗначение1, проверяемоеЗначение2, СообщениеОбОшибке = "") Экспорт - Если проверяемоеЗначение1 >= проверяемоеЗначение2 Тогда - ВызватьИсключение "Значение <"+проверяемоеЗначение1+"> больше или равно, чем <"+проверяемоеЗначение2+">, а ожидалось меньше"+ - ФорматДСО(СообщениеОбОшибке); - КонецЕсли; -КонецПроцедуры - -Процедура ПроверитьМеньшеИлиРавно(проверяемоеЗначение1, проверяемоеЗначение2, СообщениеОбОшибке = "") Экспорт - Если проверяемоеЗначение1 > проверяемоеЗначение2 Тогда - ВызватьИсключение "Значение <"+проверяемоеЗначение1+"> больше, чем <"+проверяемоеЗначение2+">, а ожидалось меньше или равно"+ - ФорматДСО(СообщениеОбОшибке); - КонецЕсли; -КонецПроцедуры - -// проверка идет через ЗначениеЗаполнено, но мутабельные значение всегда считаем заполненными -Процедура ПроверитьЗаполненность(ПроверяемоеЗначение, ДопСообщениеОшибки = "") Экспорт - Попытка - фЗаполнено = ЗначениеЗаполнено(ПроверяемоеЗначение); - Исключение - Возврат; - КонецПопытки; - Если НЕ фЗаполнено Тогда - ВызватьИсключение "Значение ("+ПроверяемоеЗначение+") не заполнено, а ожидалась заполненность" + ФорматДСО(ДопСообщениеОшибки); - КонецЕсли; -КонецПроцедуры - -Процедура ПроверитьНеЗаполненность(ПроверяемоеЗначение, ДопСообщениеОшибки = "") Экспорт - СообщениеОшибки = "Значение ("+ПроверяемоеЗначение+") заполнено, а ожидалась незаполненность" + ФорматДСО(ДопСообщениеОшибки); - Попытка - фЗаполнено = ЗначениеЗаполнено(ПроверяемоеЗначение); - Исключение - ВызватьИсключение СообщениеОшибки; - КонецПопытки; - Если фЗаполнено Тогда - ВызватьИсключение СообщениеОшибки; - КонецЕсли; -КонецПроцедуры - -Процедура ПроверитьВхождение(строка, подстрокаПоиска, ДопСообщениеОшибки = "") Экспорт - Если Найти(строка, подстрокаПоиска) = 0 Тогда - СообщениеОшибки = "Искали в <"+строка+"> подстроку <"+подстрокаПоиска+">, но не нашли." + ФорматДСО(ДопСообщениеОшибки); - ВызватьИсключение(СообщениеОшибки); - КонецЕсли; -КонецПроцедуры - -//} - -// { временные файлы -Функция ИмяВременногоФайла(Знач Расширение = "tmp") Экспорт - Если ВременныеФайлы = Неопределено Тогда - ВременныеФайлы = Новый Массив; - КонецЕсли; - - ИмяВремФайла = ПолучитьИмяВременногоФайла(Расширение); - ВременныеФайлы.Добавить(ИмяВремФайла); - Возврат ИмяВремФайла; -КонецФункции - -Процедура УдалитьВременныеФайлы() Экспорт - - Если ВременныеФайлы <> Неопределено Тогда - Для Каждого ИмяФайла Из ВременныеФайлы Цикл - Попытка - УдалитьФайлы(ИмяФайла); - Исключение - Сообщить("Не удален временный файл: " + ИмяФайла + " - |-" + ОписаниеОшибки()); - КонецПопытки; - КонецЦикла; - - ВременныеФайлы.Очистить(); - - КонецЕсли; - -КонецПроцедуры -// } - -//{ Выполнение тестов - экспортные методы - -Процедура ВыполнитьТесты(МассивПараметров) Экспорт - Сообщить(" Версия приложения "+(Новый СистемнаяИнформация).Версия); - Инициализация(); - РезультатТестирования = ЗначенияСостоянияТестов.НеВыполнялся; - - Если Не ОбработатьПараметрыЗапуска(МассивПараметров) Тогда - РезультатТестирования = ЗначенияСостоянияТестов.НеВыполнялся; - КонецЕсли; - УдалитьВременныеФайлы(); -КонецПроцедуры - -Функция ПолучитьРезультатТестирования() Экспорт - Возврат РезультатТестирования; -КонецФункции - -//} - -Функция ПолучитьПараметрыЗапуска(МассивПараметров) Экспорт - Перем ПутьЛогФайла; - - Если МассивПараметров.Количество() = 0 Тогда - Возврат Неопределено; - КонецЕсли; - - НомерТестаДляЗапуска = Неопределено; - НаименованиеТестаДляЗапуска = Неопределено; - ПутьЛогФайла = Неопределено; - - НомерПараметраПутьКТестам = -1; - - КомандаЗапуска = НРег(МассивПараметров[0]); - Если КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда - путьКТестам = МассивПараметров[1]; - ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.Запустить Тогда - НомерПараметраПутьКТестам = 1; - ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог Тогда - НомерПараметраПутьКТестам = 1; - - Иначе - КомандаЗапуска = СтруктураПараметровЗапуска.Запустить; - НомерПараметраПутьКТестам = 0; - КонецЕсли; - - НомерОчередногоПараметра = НомерПараметраПутьКТестам; - - Если КомандаЗапуска = СтруктураПараметровЗапуска.Запустить Тогда - путьКТестам = МассивПараметров[НомерПараметраПутьКТестам]; - НомерОчередногоПараметра = НомерОчередногоПараметра + 1; - Если МассивПараметров.Количество() > НомерОчередногоПараметра Тогда - НомерОчередногоПараметра = НомерПараметраПутьКТестам+1; - ИД_Теста = МассивПараметров[НомерОчередногоПараметра]; - - Если НРег(ИД_Теста) <> СтруктураПараметровЗапуска.Режим_ПутьЛогФайла Тогда - Если ВСтрокеСодержатсяТолькоЦифры(ИД_Теста) Тогда - НомерТестаДляЗапуска = Число(ИД_Теста); - Иначе - НаименованиеТестаДляЗапуска = ИД_Теста; - КонецЕсли; - КонецЕсли; - КонецЕсли; - ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог Тогда - путьКТестам = МассивПараметров[НомерПараметраПутьКТестам]; - НомерОчередногоПараметра = НомерОчередногоПараметра + 1; - КонецЕсли; - - Если МассивПараметров.Количество() > НомерОчередногоПараметра и (КомандаЗапуска = СтруктураПараметровЗапуска.Запустить или КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог ) Тогда - Режим = НРег(МассивПараметров[НомерОчередногоПараметра]); - Если Режим = СтруктураПараметровЗапуска.Режим_ПутьЛогФайла Тогда - Если МассивПараметров.Количество() > НомерОчередногоПараметра+1 Тогда - НомерОчередногоПараметра = НомерОчередногоПараметра+1; - ПутьЛогФайла = МассивПараметров[НомерОчередногоПараметра]; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - ПараметрыЗапуска = Новый Структура; - ПараметрыЗапуска.Вставить("Команда", КомандаЗапуска); - ПараметрыЗапуска.Вставить("ПутьКТестам", путьКТестам); - ПараметрыЗапуска.Вставить("НаименованиеТестаДляЗапуска", НаименованиеТестаДляЗапуска); - ПараметрыЗапуска.Вставить("НомерТестаДляЗапуска", НомерТестаДляЗапуска); - ПараметрыЗапуска.Вставить("ПутьЛогФайлаJUnit", ПутьЛогФайла); - - Возврат ПараметрыЗапуска; -КонецФункции - -Функция ОбработатьПараметрыЗапуска(МассивПараметров) - - ПараметрыЗапуска = ПолучитьПараметрыЗапуска(МассивПараметров); - Если Не ЗначениеЗаполнено(МассивПараметров) Тогда - Возврат Ложь; - КонецЕсли; - КомандаЗапуска = ПараметрыЗапуска.Команда; - путьКТестам = ПараметрыЗапуска.путьКТестам; - НомерТестаДляЗапуска = ПараметрыЗапуска.НомерТестаДляЗапуска; - НаименованиеТестаДляЗапуска = ПараметрыЗапуска.НаименованиеТестаДляЗапуска; - ПутьЛогФайлаJUnit = ПараметрыЗапуска.ПутьЛогФайлаJUnit; - - Файл = Новый Файл(путьКТестам); - Если Не Файл.Существует() Тогда - ВызватьИсключение "Не найден файл/каталог "+путьКТестам; - КонецЕсли; - - Если КомандаЗапуска = СтруктураПараметровЗапуска.Запустить Тогда - Пути.Добавить(ПутьКТестам); - ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда - Пути.Добавить(ПутьКТестам); - ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог Тогда - Файлы = НайтиФайлы(ПутьКТестам, "*.os"); - Для Каждого Файл Из Файлы Цикл - Если Файл.ИмяБезРасширения <> "testrunner" Тогда - Пути.Добавить(Файл.ПолноеИмя); - КонецЕсли; - КонецЦикла; - КонецЕсли; - - Если КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда - Сообщить("Список тестов:"); - КонецЕсли; - - ЗагрузитьТесты(); - - Если КомандаЗапуска = СтруктураПараметровЗапуска.Запустить или КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог Тогда - ВыполнитьВсеТесты(); - - Сообщить(" "); - - Если КомандаЗапуска <> СтруктураПараметровЗапуска.ПоказатьСписок Тогда - Если РезультатТестирования > ЗначенияСостоянияТестов.НеРеализован Тогда - Сообщить("ОШИБКА: Есть непрошедшие тесты. Красная полоса"); - ИначеЕсли РезультатТестирования > ЗначенияСостоянияТестов.Прошел Тогда - Сообщить("ОШИБКА: Есть нереализованные тесты. Желтая полоса"); - Иначе - Сообщить("ОК. Зеленая полоса"); - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Возврат Истина; -КонецФункции - -Функция СоздатьСтруктуруПараметровЗапуска() Экспорт - СтруктураПараметровЗапуска = Новый Структура; - СтруктураПараметровЗапуска.Вставить("Запустить", НРег("-run")); - СтруктураПараметровЗапуска.Вставить("ЗапуститьКаталог", НРег("-runall")); - СтруктураПараметровЗапуска.Вставить("ПоказатьСписок", НРег("-show")); - СтруктураПараметровЗапуска.Вставить("Режим_ПутьЛогФайла", НРег("xddReportPath")); - Возврат СтруктураПараметровЗапуска; -КонецФункции - -Функция ЗагрузитьТесты() - Перем НомерТестаСохр; - Перем Рез; - - Рез = Истина; - - Для Каждого ПутьТеста Из Пути Цикл - Файл = Новый Файл(ПутьТеста); - Если Файл.ЭтоКаталог() Тогда - ВызватьИсключение "Пока не умею обрабатывать каталоги тестов"; - Иначе - ПолноеИмяТестовогоСлучая = Файл.ПолноеИмя; - ИмяКлассаТеста = СтрЗаменить(Файл.ИмяБезРасширения,"-","")+СтрЗаменить(Строка(Новый УникальныйИдентификатор),"-",""); - Если КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда - Сообщить(" Файл теста "+ПолноеИмяТестовогоСлучая); - КонецЕсли; - Попытка - ПодключитьСценарий(Файл.ПолноеИмя, ИмяКлассаТеста); - Тест = Новый(ИмяКлассаТеста); - Исключение - ИнфоОшибки = ИнформацияОбОшибке(); - Если ВыводитьОшибкиПодробно Тогда - текстОшибки = ИнфоОшибки.ПодробноеОписаниеОшибки(); - Иначе - текстОшибки = ОписаниеОшибки(); - КонецЕсли; - Сообщить("Не удалось загрузить тест "+ПолноеИмяТестовогоСлучая+Символы.ПС+ - текстОшибки); - Рез = Ложь; - РезультатТестирования = ЗначенияСостоянияТестов.Сломался; - Продолжить; - КонецПопытки; - - МассивТестовыхСлучаев = ПолучитьТестовыеСлучаи(Тест, ПолноеИмяТестовогоСлучая); - Если МассивТестовыхСлучаев = Неопределено Тогда - Продолжить; - КонецЕсли; - - Для Каждого ТестовыйСлучай Из МассивТестовыхСлучаев Цикл - Если ЭтоСтрока(ТестовыйСлучай) Тогда - ИмяТестовогоСлучая = ТестовыйСлучай; - ПараметрыТеста = Неопределено; - ПредставлениеТеста = ИмяТестовогоСлучая; - Иначе - ВызватьИсключение "Не умею обрабатывать описание тестового случая из ПолучитьСписокТестов, отличный от строки"; //TODO - КонецЕсли; - - ОписаниеТеста = Новый Структура; - ОписаниеТеста.Вставить("ТестОбъект", Тест); - ОписаниеТеста.Вставить("ИмяКласса", ИмяКлассаТеста); - ОписаниеТеста.Вставить("ПолноеИмя", ПолноеИмяТестовогоСлучая); - ОписаниеТеста.Вставить("Параметры", ПараметрыТеста); - ОписаниеТеста.Вставить("ИмяМетода", ИмяТестовогоСлучая); - - НаборТестов.Добавить(ОписаниеТеста); - - НомерТеста = НаборТестов.Количество()-1; - Если КомандаЗапуска = СтруктураПараметровЗапуска.ПоказатьСписок Тогда - Сообщить(" Имя теста <"+ИмяТестовогоСлучая+">, №теста <"+НомерТеста+">"); - - ИначеЕсли КомандаЗапуска = СтруктураПараметровЗапуска.Запустить или КомандаЗапуска = СтруктураПараметровЗапуска.ЗапуститьКаталог Тогда - Если НаименованиеТестаДляЗапуска = Неопределено Тогда - Если НомерТеста = НомерТестаДляЗапуска Тогда - НомерТестаСохр = НомерТеста; - КонецЕсли; - Иначе - Если НРег(НаименованиеТестаДляЗапуска) = НРег(ИмяТестовогоСлучая) Тогда - НомерТестаСохр = НомерТеста; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЦикла; - - Если НомерТестаСохр <> Неопределено Тогда - ОписаниеТеста = НаборТестов[НомерТестаСохр]; - НаборТестов.Очистить(); - НаборТестов.Добавить(ОписаниеТеста); - КонецЕсли; - - Возврат Рез; -КонецФункции - -Функция ВыполнитьВсеТесты() - Если НаборТестов.Количество() > 0 Тогда - НаборОшибок = Новый Соответствие; - НаборНереализованныхТестов = Новый Соответствие; - ДатаНачала = ТекущаяДата(); - - СоздаватьОтчетТестированияВФорматеJUnitXML = ЗначениеЗаполнено(ПутьЛогФайлаJUnit); - Если СоздаватьОтчетТестированияВФорматеJUnitXML Тогда - ЗаписьXML = Неопределено; - НачатьЗаписьВФайлОтчетаТестированияВФорматеJUnitXML(ЗаписьXML); - КонецЕсли; - - Для Сч = 0 По НаборТестов.Количество() - 1 Цикл - ОписаниеТеста = НаборТестов[Сч]; - - НовыйРезультатТестирования = ВыполнитьТест(ОписаниеТеста, Сч); - Если НовыйРезультатТестирования = ЗначенияСостоянияТестов.Прошел Тогда - Сообщить(" Успешно"); - КонецЕсли; - - РезультатТестирования = ЗапомнитьСамоеХудшееСостояние(РезультатТестирования, НовыйРезультатТестирования); - - Сообщить(" "); - Сообщить("--------------- --------------- --------------- --------------- "); - Сообщить(" "); - КонецЦикла; - - ВывестиЛогТестирования(); - - Если СоздаватьОтчетТестированияВФорматеJUnitXML Тогда - ЗавершитьЗаписьВФайлОтчетаТестированияВФорматеJUnitXML(ЗаписьXML, ДатаНачала); - КонецЕсли; - КонецЕсли; -КонецФункции - -Процедура ВывестиЛогТестирования() - Если НаборОшибок.Количество() > 0 Тогда - Сообщить(" "); - Сообщить("Упали тесты. Количество "+НаборОшибок.Количество()+" шт :"); - Сч = 0; - Для Каждого КлючЗначение Из НаборОшибок Цикл - Сч = Сч + 1; - ОписаниеТеста = КлючЗначение.Ключ; - // СтруктураОшибки = КлючЗначение.Значение; - Сообщить(" тест №"+Строка(Сч) + " : " + ОписаниеТеста.ИмяМетода + " : путь файла <"+ОписаниеТеста.ПолноеИмя+">"); - КонецЦикла; - КонецЕсли; - Если НаборНереализованныхТестов.Количество() > 0 Тогда - Сообщить(" "); - Сообщить("Есть нереализованные/пропущенные тесты. Количество "+НаборНереализованныхТестов.Количество()+" шт :"); - Сч = 0; - Для Каждого КлючЗначение Из НаборНереализованныхТестов Цикл - Сч = Сч + 1; - ОписаниеТеста = КлючЗначение.Ключ; - Сообщить(" тест №"+Строка(Сч) + " : " + ОписаниеТеста.ИмяМетода + " : путь файла <"+ОписаниеТеста.ПолноеИмя+">"); - КонецЦикла; - КонецЕсли; - // .Вставить(ОписаниеТеста, СтруктураОшибки); -КонецПроцедуры - -Процедура НачатьЗаписьВФайлОтчетаТестированияВФорматеJUnitXML(ЗаписьXML) - ЗаписьXML = Новый ЗаписьXML; - ЗаписьXML.УстановитьСтроку("UTF-8"); - ЗаписьXML.ЗаписатьОбъявлениеXML(); - -КонецПроцедуры - -Процедура ЗавершитьЗаписьВФайлОтчетаТестированияВФорматеJUnitXML(ЗаписьXML, ДатаНачала) - ПроверитьНеРавенство(НаборТестов.Количество(), 0); - - ВсегоТестов = НаборТестов.Количество(); - КоличествоОшибок = НаборОшибок.Количество(); - КоличествоНереализованныхТестов = НаборНереализованныхТестов.Количество(); - - ВремяВыполнения = ТекущаяДата() - ДатаНачала; - - ЗаписьXML.ЗаписатьНачалоЭлемента("testsuites"); - ЗаписьXML.ЗаписатьАтрибут("tests", XMLСтрока(ВсегоТестов)); - ЗаписьXML.ЗаписатьАтрибут("name", XMLСтрока("xUnitFor1C")); //TODO: указывать путь к набору тестов. - ЗаписьXML.ЗаписатьАтрибут("time", XMLСтрока(ВремяВыполнения)); - ЗаписьXML.ЗаписатьАтрибут("failures", XMLСтрока(КоличествоОшибок)); - ЗаписьXML.ЗаписатьАтрибут("skipped", XMLСтрока(КоличествоНереализованныхТестов)); // или disabled - - ЗаписьXML.ЗаписатьНачалоЭлемента("testsuite"); - - ФайлТестаВрем = Новый Файл(НаборТестов[0].ПолноеИмя); - Если КомандаЗапуска = СтруктураПараметровЗапуска.Запустить Тогда - ПутьНабора = ФайлТестаВрем.Имя; - Иначе - ПутьНабора = ФайлТестаВрем.Путь; - КонецЕсли; - ИмяНабора = ИмяТекущегоТеста(ПутьНабора); - ФайлТеста = Новый Файл(ПутьНабора); - - ЗаписьXML.ЗаписатьАтрибут("name", ИмяНабора); - - ЗаписьXML.ЗаписатьНачалоЭлемента("properties"); - ЗаписьXML.ЗаписатьКонецЭлемента(); - - Для Каждого ОписаниеТеста Из НаборТестов Цикл - ЗаполнитьРезультатТестовогоСлучая(ЗаписьXML, ОписаниеТеста, НаборОшибок, НаборНереализованныхТестов); - КонецЦикла; - - ЗаписьXML.ЗаписатьКонецЭлемента(); - - СтрокаХМЛ = ЗаписьXML.Закрыть(); - - ПутьОтчетаВФорматеJUnitxml = ПутьФайлаОтчетаТестированияВФорматеJUnitXML()+"/"+ФайлТеста.Имя+".xml"; - - ЗаписьXML = Новый ЗаписьXML; - ЗаписьXML.ОткрытьФайл(ПутьОтчетаВФорматеJUnitxml); - ЗаписьXML.ЗаписатьБезОбработки(СтрокаХМЛ);// таким образом файл будет записан всего один раз, и не будет проблем с обработкой на билд-сервере TeamCity - ЗаписьXML.Закрыть(); - Сообщить(" "); - Сообщить("Путь к лог-файлу проверки в формате Ant.JUnit <"+ПутьОтчетаВФорматеJUnitxml+">"); - -КонецПроцедуры - -Процедура ЗаполнитьРезультатТестовогоСлучая(ЗаписьXML, ОписаниеТеста, НаборОшибок, НаборНереализованныхТестов) - - ЗаписьXML.ЗаписатьНачалоЭлемента("testcase"); - ЗаписьXML.ЗаписатьАтрибут("classname", ИмяТекущегоТеста(ОписаниеТеста.ПолноеИмя)); - ЗаписьXML.ЗаписатьАтрибут("name", ОписаниеТеста.ИмяМетода); - - СтруктураОшибки = НаборОшибок.Получить(ОписаниеТеста); - - Если СтруктураОшибки = Неопределено Тогда - СтруктураОшибки = НаборНереализованныхТестов.Получить(ОписаниеТеста); - КонецЕсли; - - Если СтруктураОшибки <> Неопределено Тогда - СтрокаРезультат = ?(СтруктураОшибки.СостояниеВыполнения = ЗначенияСостоянияТестов.Сломался, "failure", "skipped"); - - ЗаписьXML.ЗаписатьАтрибут("status", СтрокаРезультат); - ЗаписьXML.ЗаписатьНачалоЭлемента(СтрокаРезультат); - - СтрокаОписание = СтруктураОшибки.Описание; - // TODO: НайтиНедопустимыеСимволыXML() - XMLОписание = XMLСтрока(СтрокаОписание); - ЗаписьXML.ЗаписатьАтрибут("message", XMLОписание); - - ЗаписьXML.ЗаписатьКонецЭлемента(); - Иначе - ЗаписьXML.ЗаписатьАтрибут("status", "passed"); - КонецЕсли; - - ЗаписьXML.ЗаписатьКонецЭлемента(); - -КонецПроцедуры - -Функция ПутьФайлаОтчетаТестированияВФорматеJUnitXML() - Возврат ?(ЗначениеЗаполнено(ПутьЛогФайлаJUnit), ПутьЛогФайлаJUnit, ТекущийКаталог()); -КонецФункции - -Функция ИмяТекущегоТеста(ПолныйПуть) - Файл = Новый Файл(ПолныйПуть); - Возврат Файл.ИмяБезРасширения; -КонецФункции - -Функция ВыполнитьТест(ОписаниеТеста, Сч) - Перем Рез; - - Тест = ОписаниеТеста.ТестОбъект; - ИмяМетода = ОписаниеТеста.ИмяМетода; - - ПоказатьИнформациюПоТесту(ОписаниеТеста, Сч, ИмяМетода); - - Успешно = ВыполнитьПроцедуруТестовогоСлучая(Тест, "ПередЗапускомТеста", ИмяМетода, ОписаниеТеста); - Если Не Успешно Тогда - Рез = ЗначенияСостоянияТестов.Сломался; - Иначе - - Если Не Рефлектор.МетодСуществует(Тест, ИмяМетода) Тогда - Рез = ВывестиОшибкуВыполненияТеста(ЗначенияСостоянияТестов.НеРеализован, "Не найден тестовый метод "+ИмяМетода, ОписаниеТеста, "", Неопределено); - Иначе - Попытка - Рефлектор.ВызватьМетод(Тест, ИмяМетода); - - Рез = ЗначенияСостоянияТестов.Прошел; - Исключение - ИнфоОшибки = ИнформацияОбОшибке(); - текстОшибки = ПодробноеПредставлениеОшибки(ИнфоОшибки); - Если ВыводитьОшибкиПодробно Тогда - текстОшибки = ИнфоОшибки.ПодробноеОписаниеОшибки(); - КонецЕсли; - Рез = ВывестиОшибкуВыполненияТеста(ЗначенияСостоянияТестов.Сломался, "", ОписаниеТеста, текстОшибки, ИнфоОшибки); - КонецПопытки; - КонецЕсли; - - Успешно = ВыполнитьПроцедуруТестовогоСлучая(Тест, "ПослеЗапускаТеста", ИмяМетода, ОписаниеТеста); - Если Не Успешно Тогда - Рез = ЗначенияСостоянияТестов.Сломался; - КонецЕсли; - КонецЕсли; - - Возврат Рез; -КонецФункции - -Функция ВывестиОшибкуВыполненияТеста(СостояниеВыполнения, ПредставлениеОшибки, ОписаниеТеста, текстОшибки, ИнфоОшибки) - ИмяМетода = ОписаниеТеста.ИмяМетода; - - ВывестиОшибку(?(ПредставлениеОшибки="", "", ПредставлениеОшибки +" - ") + "Упал тест <"+ИмяМетода+">, файл <"+ОписаниеТеста.ПолноеИмя+">: "+Символы.ПС+" "+текстОшибки); - - СтруктураОшибки = Новый Структура(); - - СтруктураОшибки.Вставить("ИмяТестовогоНабора", ИмяМетода); - - стИнфоОшибки = Новый Структура("СостояниеВыполнения,ИмяМодуля,ИсходнаяСтрока,НомерСтроки,Описание"); - Если ИнфоОшибки <> Неопределено Тогда - ЗаполнитьЗначенияСвойств(стИнфоОшибки, ИнфоОшибки); - КонецЕсли; - стИнфоОшибки.Вставить("Причина", Неопределено); - - стИнфоОшибкиЦикл = стИнфоОшибки; - Если ИнфоОшибки <> Неопределено Тогда - ИнфоОшибки = ИнфоОшибки.Причина; - КонецЕсли; - Пока ИнфоОшибки <> Неопределено Цикл - стИнфоОшибкиЦикл.Причина = Новый Структура("ИмяМодуля,ИсходнаяСтрока,НомерСтроки,Описание"); - стИнфоОшибкиЦикл = стИнфоОшибкиЦикл.Причина; - ЗаполнитьЗначенияСвойств(стИнфоОшибкиЦикл, ИнфоОшибки); - стИнфоОшибкиЦикл.Вставить("Причина", Неопределено); - - ИнфоОшибки = ИнфоОшибки.Причина; - КонецЦикла; - - ИмяТестовогоСлучаяДляОписанияОшибки = ИмяМетода; - - СтруктураОшибки.Вставить("ИмяТестовогоСлучая", ИмяТестовогоСлучаяДляОписанияОшибки); - СтруктураОшибки.Вставить("СостояниеВыполнения", СостояниеВыполнения); - - СтруктураОшибки.Вставить("Описание", текстОшибки); - СтруктураОшибки.Вставить("ИнфоОшибки", стИнфоОшибки); - СтруктураОшибки.Вставить("ПолныйПуть", ОписаниеТеста.ПолноеИмя); - - Если СостояниеВыполнения = ЗначенияСостоянияТестов.Сломался Тогда - НаборОшибок.Вставить(ОписаниеТеста, СтруктураОшибки); - Иначе - НаборНереализованныхТестов.Вставить(ОписаниеТеста, СтруктураОшибки); - КонецЕсли; - - Возврат СостояниеВыполнения; - -КонецФункции - -Функция ВыполнитьПроцедуруТестовогоСлучая(Тест, ИмяПроцедуры, ИмяТестовогоСлучая, ОписаниеТеста) - Успешно = Ложь; - - ПолноеИмя = ОписаниеТеста.ПолноеИмя; - Попытка - Рефлектор.ВызватьМетод(Тест,ИмяПроцедуры); - Успешно = Истина; - Исключение - ИнфоОшибки = ИнформацияОбОшибке(); - текстОшибки = ОписаниеОшибки(); - - Если ЕстьОшибка_МетодОбъектаНеОбнаружен(текстОшибки, ИмяПроцедуры) Тогда - Успешно = Истина; - Иначе - Рез = ВывестиОшибкуВыполненияТеста(ЗначенияСостоянияТестов.Сломался, "Упал метод "+ИмяПроцедуры, ОписаниеТеста, текстОшибки, ИнфоОшибки); - КонецЕсли; - КонецПопытки; - - Возврат Успешно; -КонецФункции - -Функция ПолучитьТестовыеСлучаи(ТестОбъект, ПолноеИмяОбъекта) - - Попытка - - МассивТестовыхСлучаев = ТестОбъект.ПолучитьСписокТестов(ЭтотОбъект); - - Исключение - текстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - - // TODO если не использовать переменную ниже, а поставить вызов метода в условие, то будет глюк - внутрь условия не попадаем ! - ЕстьОшибка_МетодОбъектаНеОбнаружен = ЕстьОшибка_МетодОбъектаНеОбнаружен(текстОшибки, "ПолучитьСписокТестов"); - Если НЕ ЕстьОшибка_МетодОбъектаНеОбнаружен Тогда - - ВывестиОшибку("Набор тестов не загружен: " + ПолноеИмяОбъекта + " - | Ошибка получения списка тестовых случаев: " + ОписаниеОшибки()); - - ТестОбъект = Неопределено; - КонецЕсли; - - Возврат Неопределено; - - КонецПопытки; - - Если ТипЗнч(МассивТестовыхСлучаев) <> Тип("Массив") Тогда - - ВывестиОшибку("Набор тестов не загружен: " + ПолноеИмяОбъекта + " - | Ошибка получения списка тестовых случаев: вместо массива имен тестовых случаев получен объект <" + Строка(ТипЗнч(МассивТестовыхСлучаев)) + ">"); - ТестОбъект = Неопределено; - Возврат Неопределено; - - КонецЕсли; - - Если НЕ ПроверитьМассивТестовыхСлучаев(МассивТестовыхСлучаев, ТестОбъект, ПолноеИмяОбъекта) Тогда - Возврат Неопределено; - КонецЕсли; - - Возврат МассивТестовыхСлучаев; - -КонецФункции - -Функция ПроверитьМассивТестовыхСлучаев(МассивТестовыхСлучаев, ТестОбъект, ПолноеИмяОбъекта) - Для каждого данныеТеста из МассивТестовыхСлучаев Цикл - Если ТипЗнч(данныеТеста) = Тип("Строка") Тогда - Продолжить; - КонецЕсли; - - Если ТипЗнч(данныеТеста) <> Тип("Структура") Тогда - ВывестиОшибку("Набор тестов не загружен: " + ПолноеИмяОбъекта + " - | Ошибка получения структуры описания тестового случая: " + ОписаниеОшибки()); - Возврат Ложь; - КонецЕсли; - Если НЕ данныеТеста.Свойство("ИмяТеста") Тогда - ВывестиОшибку("Набор тестов не загружен: " + ПолноеИмяОбъекта + " - | Не задано имя теста в структуре описания тестового случая: " + ОписаниеОшибки()); - Возврат Ложь; - КонецЕсли; - КонецЦикла; - Возврат Истина; -КонецФункции - -Функция ЕстьОшибка_МетодОбъектаНеОбнаружен(текстОшибки, имяМетода) - Результат = Ложь; - Если Найти(текстОшибки, "Метод объекта не обнаружен ("+имяМетода+")") > 0 - ИЛИ Найти(текстОшибки, "Object method not found ("+имяМетода+")") > 0 Тогда - Результат = Истина; - КонецЕсли; - - Возврат Результат; -КонецФункции - -Процедура ПоказатьИнформациюПоТесту(ОписаниеТеста, Знач Номер, Знач Тест) - Сообщить("---------------------------------------------------------"); - Сообщить(" Тест №"+Строка(Номер) + ": " + Тест + ": "+ОписаниеТеста.ПолноеИмя); - Сообщить(" "); -КонецПроцедуры - -// Устанавливает новое текущее состояние выполнения тестов -// в соответствии с приоритетами состояний: -// Красное - заменяет все другие состояния -// Желтое - заменяет только зеленое состояние -// Зеленое - заменяет только серое состояние (тест не выполнялся ни разу). -Функция ЗапомнитьСамоеХудшееСостояние(ТекущееСостояние, НовоеСостояние) - - ТекущееСостояние = Макс(ТекущееСостояние, НовоеСостояние); - Возврат ТекущееСостояние; - -КонецФункции - -Функция ПредставлениеПериода(ДатаНачала, ДатаОкончания, ФорматнаяСтрока = Неопределено) - Возврат "с "+ДатаНачала+" по "+ДатаОкончания; -КонецФункции - -Функция ЭтоСтрока(Значение) - Возврат Строка(Значение) = Значение; -КонецФункции - -Функция ФорматДСО(ДопСообщениеОшибки) - Если ДопСообщениеОшибки = "" Тогда - Возврат ""; - КонецЕсли; - - Возврат Символы.ПС + ДопСообщениеОшибки; -КонецФункции - -Функция ВСтрокеСодержатсяТолькоЦифры(Знач ИсходнаяСтрока) Экспорт - - рез = Ложь; - ДлинаСтроки = СтрДлина(ИсходнаяСтрока); - Для Сч = 1 По ДлинаСтроки Цикл - ТекущийСимвол = КодСимвола(Сред(ИсходнаяСтрока, Сч, 1)); - Если 48 <= ТекущийСимвол И ТекущийСимвол <= 57 Тогда - рез = Истина; - Иначе - рез = Ложь; - Прервать; - КонецЕсли; - КонецЦикла; - Возврат рез; -КонецФункции - -Процедура СоздатьСостояниеТестов() - //{ Состояния тестов - ВАЖЕН порядок заполнения в мЗначенияСостоянияТестов, используется в ЗапомнитьСамоеХудшееСостояние - ЗначенияСостоянияТестов = Новый Структура; - ЗначенияСостоянияТестов.Вставить("НеВыполнялся", -1); - ЗначенияСостоянияТестов.Вставить("Прошел" , 0); // код 0 используется в командной строке для показа нормального завершения - ЗначенияСостоянияТестов.Вставить("НеРеализован", 2); - ЗначенияСостоянияТестов.Вставить("Сломался" , 3); - //} Состояния тестов -КонецПроцедуры - -// Выводит сообщение. В тестах ВСЕГДА должна использоваться ВМЕСТО метода Сообщить(). -// -Функция ВывестиСообщение(ТекстСообщения) Экспорт - Сообщить(ТекстСообщения); -КонецФункции - -// Вызывает исключение с заданным текстом ошибки для прерывания выполнения тестового случая. -// -Функция ПрерватьТест(ТекстОшибки) Экспорт - - ВызватьИсключение ТекстОшибки; - -КонецФункции - -Функция ВывестиОшибку(Ошибка) Экспорт - - НужныйТекстОшибки = Ошибка; - - ВывестиСообщение("ОШИБКА: "+НужныйТекстОшибки); - - Возврат НужныйТекстОшибки; -КонецФункции - -Процедура Инициализация() - Пути = Новый Массив; - НаборТестов = Новый Массив; - Рефлектор = Новый Рефлектор; - - СоздатьСостояниеТестов(); - СоздатьСтруктуруПараметровЗапуска(); - - РезультатТестирования = ЗначенияСостоянияТестов.НеВыполнялся; -КонецПроцедуры - -ВыводитьОшибкиПодробно = Ложь; - -ВыполнитьТесты(АргументыКоманднойСтроки); - -ЗавершитьРаботу(ПолучитьРезультатТестирования()); From 0a0c4ef005afc5836262d68ac10fa758e52d422e Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 24 Jul 2016 18:57:19 +0300 Subject: [PATCH 39/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE:=20"=D0=9F=D1=80=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=D0=BD=D0=B5=20=D1=84=D0=B8=D1=87=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=BD=D0=B5=D0=B2=D0=B5=D1=80=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=B4=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=B0"=20fix=20#69?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\265\321\200\320\260\321\206\320\270\320\270.os" | 2 +- ...5\320\270\320\265\320\244\320\270\321\207.feature" | 7 ++++++- src/bdd-exec.os | 11 ++++++++++- src/bdd.os | 3 ++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" index 69c2ced..22e93be 100644 --- "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" +++ "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -161,7 +161,7 @@ Если КодВозврата <> ОжидаемыйКодВозврата ИЛИ СтрНайти(ПараметрыКоманднойСтроки, "-verbose on") <> 0 Тогда ВывестиТекст(ТекстФайла); - Ожидаем.Что(КодВозврата, "ПроверитьПоведениеФичиИлиКаталога").Равно(ОжидаемыйКодВозврата); + Ожидаем.Что(КодВозврата, "Код возврата в ПроверитьПоведениеФичиИлиКаталога").Равно(ОжидаемыйКодВозврата); КонецЕсли; КонецПроцедуры diff --git "a/features/core/\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\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" index 7d2161e..a293e6a 100644 --- "a/features/core/\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\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" @@ -36,10 +36,15 @@ Тогда проверка поведения фич с передачей параметра "" из каталога "." закончилась с кодом возврата 0 +Контекст: Каталог проекта устанавливаю как текущий + Допустим установил каталог проекта "tests\fixtures" как текущий + Сценарий: После ошибочного шага следующие шаги сценария не выполняются - Когда установил каталог проекта "tests\fixtures" как текущий Тогда проверка поведения фичи "ПадающийШаг" закончилась с кодом возврата 2 И в лог-файле запуска продукта есть строка "ЯЗапускаюПадающийШагСПараметром-Первый падающий шаг" И в лог-файле запуска продукта отсутствует строка "ДоЭтогоШагаВыполнениеДойтиНеДолжно" И в лог-файле запуска продукта есть строка "2 Шаг ( 0 Пройден, 0 Не реализован, 1 Сломался, 1 Не выполнялся )" +Сценарий: Прогон фич из каталога при наличии падающих фич выдает правильный код возврата + Тогда проверка поведения фич с передачей параметра "" из каталога "." закончилась с кодом возврата 2 + diff --git a/src/bdd-exec.os b/src/bdd-exec.os index badc955..05f21d8 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -446,11 +446,20 @@ Для каждого РезультатВыполненияФичи Из НаборРезультатовВыполнения Цикл Подстрока = РезультатВыполнения.Строки.Добавить(); ЧитательГеркин.СкопироватьДерево(Подстрока, РезультатВыполненияФичи.Строки[0]); - СтатусВыполнения = ЗапомнитьСамоеХудшееСостояние(СтатусВыполнения, Подстрока.СтатусВыполнения); КонецЦикла; + Возврат РезультатВыполнения; КонецФункции // СобратьЕдиноеДеревоИзНабораРезультатовВыполнения(НаборРезультатовВыполнения) +Функция ПолучитьИтоговыйСтатусВыполнения(Знач РезультатыВыполнения) Экспорт + ИтоговыйСтатусВыполнения = ВозможныеСтатусыВыполнения.НеВыполнялся; + Для каждого РезультатВыполненияФичи Из РезультатыВыполнения.Строки Цикл + ИтоговыйСтатусВыполнения = ЗапомнитьСамоеХудшееСостояние(РезультатВыполненияФичи.СтатусВыполнения, ИтоговыйСтатусВыполнения); + КонецЦикла; + + Возврат ИтоговыйСтатусВыполнения; +КонецФункции + Процедура РекурсивноПосчитатьИтогиВыполнения(Узел, СтруктураИтогов) Если ТипЗнч(Узел) <> Тип("ДеревоЗначений") Тогда НужныйИтог = Неопределено; diff --git a/src/bdd.os b/src/bdd.os index 91635ca..5ab18a0 100644 --- a/src/bdd.os +++ b/src/bdd.os @@ -170,7 +170,8 @@ Если РезультатыВыполнения.Строки.Количество() = 0 Тогда КодВозврата = ИсполнительБДД.ВозможныеКодыВозвратовПроцесса()[ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся]; Иначе - КодВозврата = ИсполнительБДД.ВозможныеКодыВозвратовПроцесса()[РезультатыВыполнения.Строки[0].СтатусВыполнения]; + СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + КодВозврата = ИсполнительБДД.ВозможныеКодыВозвратовПроцесса()[СтатусВыполнения]; ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, ФайлФичи.ЭтоКаталог()); КонецЕсли; From 8b162e790bcb80e6e755ff8a35329cb474a1ea7e Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 24 Jul 2016 20:24:22 +0300 Subject: [PATCH 40/56] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=8F=D1=8E=20=D0=BF=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B1=D0=B8=D0=BB=D0=B4=D0=B0,=20=D0=B5=D1=81=D0=BB=D0=B8=20?= =?UTF-8?q?=D1=84=D0=B8=D1=87=D0=B8=20=D0=BD=D0=B5=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=88=D0=BB=D0=B8=20#66=20=D0=A2=D0=B0=D0=BA=D0=B6=D0=B5=20?= =?UTF-8?q?=D0=B2=20=D0=B0=D1=80=D1=82=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D1=8B?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D1=8E=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=20=D0=BB=D0=BE=D0=B3=D0=B0=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=84=D0=B8?= =?UTF-8?q?=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 77 +++++++++++++++++++---------------------------------- 1 file changed, 27 insertions(+), 50 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 26d6d5a..43a87a2 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,66 +1,43 @@ #!groovy node("slave") { def isUnix = isUnix(); + stage "checkout" - // if (env.DISPLAY) { - // println env.DISPLAY; - // } else { - // env.DISPLAY=":1" - // } - // env.RUNNER_ENV="production"; - checkout scm if (isUnix) {sh 'git submodule update --init'} else {bat "git submodule update --init"} - // stage "init base" - - // //checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, recursiveSubmodules: true, reference: '', trackingSubmodules: true]], submoduleCfg: [], userRemoteConfigs: [[url: 'http://git.http.service.consul/shenja/vanessa-behavior.git']]]) - // echo "${env.WORKSPACE}" - - // def srcpath = "./lib/cf/"; - // if (env.SRCPATH){ - // srcpath = env.SRCPATH; - // } - // def v8version = ""; - // if (env.V8VERSION) { - // v8version = "--v8version ${env.V8VERSION}" - // } - // def command = "oscript tools/init.os init-dev ${v8version} --src "+srcpath - // timestamps { - // if (isUnix){ - // sh "${command}" - // } else { - // bat "chcp 1251\n${command}" - // } - // } - - stage "exec all features" - echo "exec all features from project" - echo "${env.WORKSPACE}" - - command = """oscript ./src/bdd.os ./features/core -out ./exec.log""" - if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command}"} stage "checkout oscript-library for testrunner.os" checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'oscript-library']], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/EvilBeaver/oscript-library.git']]]) - // checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'oscript-library']], submoduleCfg: [], userRemoteConfigs: [[url: 'c:\\projects\\oscript-library\\.git']]]) stage "testing with testrunner.os" - echo "testing with testrunner.os" - echo "${env.WORKSPACE}" command = """oscript ./oscript-library/tests/testrunner.os -runall ./tests xddReportPath ./tests""" - if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command}"} - + if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command} \n exit /b %ERRORLEVEL%"} + step([$class: 'JUnitResultArchiver', testResults: '**/tests/*.xml']) - - // stage "build" - // echo "build catalogs" - // command = """oscript tools/runner.os compileepf ${v8version} --ibname /F"./build/ib" ./ ./build/out/ """ - // if (isUnix) {sh "${command}"} else {bat "chcp 1251 \n${command}"} - - // stage "test" - // command = """oscript tools/runner.os xunit "./build/out/Tests" ${v8version} --ibname /F"./build/ib" --path ./build/out/xddTestRunner.epf --report ./build/report.xml""" - // if (isUnix){ sh "${command}" } else {bat "chcp 1251\n${command}"} - // step([$class: 'JUnitResultArchiver', testResults: '**/build/report.xml']) + + stage "exec all features" + + command = """oscript ./src/bdd.os ./features/core -out ./bdd-exec.log""" + + def errors = [] + try{ + if (isUnix){ + sh "${command}" + } else { + bat "@chcp 1251 > nul \n${command}\n exit /b %ERRORLEVEL% " + } + } catch (e) { + errors << "BDD status : ${e}" + } + + if (errors.size() > 0) { + currentBuild.result = 'UNSTABLE' + for (int i = 0; i < errors.size(); i++) { + echo errors[i] + } + } + + step([$class: 'ArtifactArchiver', artifacts: '**/bdd-exec.log', fingerprint: true]) } \ No newline at end of file From 5e339e715692c701170d65d580cffea11ced3e70 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 24 Jul 2016 22:58:25 +0300 Subject: [PATCH 41/56] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=B4?= =?UTF-8?q?=20#66?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 43a87a2..f17ecbd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -13,7 +13,7 @@ node("slave") { stage "testing with testrunner.os" command = """oscript ./oscript-library/tests/testrunner.os -runall ./tests xddReportPath ./tests""" - if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command} \n exit /b %ERRORLEVEL%"} + if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command}} step([$class: 'JUnitResultArchiver', testResults: '**/tests/*.xml']) @@ -26,7 +26,7 @@ node("slave") { if (isUnix){ sh "${command}" } else { - bat "@chcp 1251 > nul \n${command}\n exit /b %ERRORLEVEL% " + bat "@chcp 1251 > nul \n${command}" } } catch (e) { errors << "BDD status : ${e}" From aeb614d3df3de3ff592ccfc8529430a79bfdf287 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 24 Jul 2016 23:02:25 +0300 Subject: [PATCH 42/56] =?UTF-8?q?=D0=92=D0=B5=D1=80=D0=BD=D1=83=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B2=D0=B5=D1=80=D0=BD=D0=BE=20=D1=83=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BD=D0=B0=D1=87=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D1=81=D0=B8=D0=BC=D0=B2=D0=BE?= =?UTF-8?q?=D0=BB=D1=8B=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20#11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\320\260\320\275\320\275\321\213\321\205.feature" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" "b/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" index 1935a0e..33be01c 100644 --- "a/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" +++ "b/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" @@ -6,11 +6,11 @@ Сценарий: Проверяю передачу простой таблицы - # огда я передаю таблицу + # Когда я передаю таблицу # | Ячейка11 | Ячейка12| # | Ячейка21 | Ячейка22| - # огда переданная таблица является типом "ТаблицаЗначений" - # у переданной таблицы 2 колонки - # у переданной таблицы 2 строки - # у 1 строки таблицы заданы значения "Ячейка11" и "Ячейка12" - # у 2 строки таблицы заданы значения "Ячейка21" и "Ячейка22" \ No newline at end of file + # Тогда переданная таблица является типом "ТаблицаЗначений" + # И у переданной таблицы 2 колонки + # И у переданной таблицы 2 строки + # И у 1 строки таблицы заданы значения "Ячейка11" и "Ячейка12" + # И у 2 строки таблицы заданы значения "Ячейка21" и "Ячейка22" \ No newline at end of file From 58958eff23cf124d7ff837dca0eb5a0dbcd13481 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 24 Jul 2016 23:10:19 +0300 Subject: [PATCH 43/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=81=D0=B8=D0=BD=D1=82=D0=B0=D0=BA=D1=81-?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20#66?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index f17ecbd..e2714c8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -13,7 +13,7 @@ node("slave") { stage "testing with testrunner.os" command = """oscript ./oscript-library/tests/testrunner.os -runall ./tests xddReportPath ./tests""" - if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command}} + if (isUnix) {sh "${command}"} else {bat "@chcp 1251 > nul \n${command}"} step([$class: 'JUnitResultArchiver', testResults: '**/tests/*.xml']) From 146e663cb710c2726b3e8df3a095edd235a64646 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Mon, 25 Jul 2016 00:21:16 +0300 Subject: [PATCH 44/56] =?UTF-8?q?=D0=98=D0=B7=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D0=BE=D1=82=20=D0=97=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=82=D1=8C=D0=9F=D1=80=D0=B8=D0=BB=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BB=20=D0=BA=20=D0=B8=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=20=D0=9F=D1=80=D0=BE=D1=86?= =?UTF-8?q?=D0=B5=D1=81=D1=81,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D1=8F=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=BD=D0=B5=D0=B2=D0=B8=D0=B4=D0=B8=D0=BC=D1=8B?= =?UTF-8?q?=D0=BC=20#65?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\200\320\260\321\206\320\270\320\270.os" | 64 ++++++++++++++----- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" index 22e93be..d7dbbc6 100644 --- "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" +++ "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -69,17 +69,13 @@ Ожидаем.Что(ФайлИсполнителя.Существует(), "Ожидаем, что скрипт исполнителя шагов существует, а его нет. "+ФайлИсполнителя.ПолноеИмя).Равно(Истина); ФайлФичиИлиКаталога = Новый Файл(ОбъединитьПути(ТекущийКаталог(), ИмяФичи + ".feature")); - ИмяЛогаКоманды = ОбъединитьПути(ТекущийКаталог(), "gen-log.txt"); - СтрокаКоманды = СтрШаблон("cmd /c oscript.exe %4 %1 gen %2 %3 %5", ПутьИсполнителяБДД, ФайлФичиИлиКаталога.ПолноеИмя, - ПараметрыКоманднойСтроки, "-encoding=utf-8", СуффиксПеренаправленияВывода(ИмяЛогаКоманды, Ложь)); + СтрокаКоманды = СтрШаблон("oscript.exe %4 %1 gen %2 %3", ПутьИсполнителяБДД, ФайлФичиИлиКаталога.ПолноеИмя, + ПараметрыКоманднойСтроки, "-encoding=utf-8"); - Лог.Отладка("СтрокаКоманды "+СтрокаКоманды); + ТекстФайла = ""; + КодВозврата = ВыполнитьПроцесс(СтрокаКоманды, ТекстФайла); - КодВозврата = Неопределено; - ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог(), Истина, КодВозврата); - - ТекстФайла = ПолучитьТекстФайла(ИмяЛогаКоманды); БДД.СохранитьВКонтекст("ТекстЛогФайлаПродукта", ТекстФайла); Если КодВозврата <> 0 ИЛИ СтрНайти(ПараметрыКоманднойСтроки, "-verbose on") <> 0 Тогда @@ -148,15 +144,12 @@ ФайлФичиИлиКаталога = Новый Файл(ИмяФичиИлиПутьКаталога + ".feature"); КонецЕсли; - ИмяЛогаКоманды = ОбъединитьПути(ТекущийКаталог(), "exec-log.txt"); - СтрокаКоманды = СтрШаблон("cmd /c oscript.exe %4 %1 %2 %3 %5", ПутьИсполнителяБДД, ФайлФичиИлиКаталога.ПолноеИмя, - СохраненныеПараметрыКоманднойСтроки, "-encoding=utf-8", СуффиксПеренаправленияВывода(ИмяЛогаКоманды, Ложь)); - Лог.Отладка("СтрокаКоманды "+СтрокаКоманды); + СтрокаКоманды = СтрШаблон("oscript.exe %4 %1 %2 %3 %5", ПутьИсполнителяБДД, ФайлФичиИлиКаталога.ПолноеИмя, + СохраненныеПараметрыКоманднойСтроки, "-encoding=utf-8"); - КодВозврата = Неопределено; - ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог(), Истина, КодВозврата); + ТекстФайла = ""; + КодВозврата = ВыполнитьПроцесс(СтрокаКоманды, ТекстФайла); - ТекстФайла = ПолучитьТекстФайла(ИмяЛогаКоманды); БДД.СохранитьВКонтекст("ТекстЛогФайлаПродукта", ТекстФайла); Если КодВозврата <> ОжидаемыйКодВозврата ИЛИ СтрНайти(ПараметрыКоманднойСтроки, "-verbose on") <> 0 Тогда @@ -165,6 +158,47 @@ КонецЕсли; КонецПроцедуры +Функция ВыполнитьПроцесс(Знач СтрокаВыполнения, ТекстВывода, Знач КодировкаПотока = Неопределено) + Перем ПаузаОжиданияЧтенияБуфера; + + ПаузаОжиданияЧтенияБуфера = 10; + МаксСчетчикЦикла = 100000; + + Если КодировкаПотока = Неопределено Тогда + КодировкаПотока = КодировкаТекста.UTF8; + КонецЕсли; + Лог.Отладка("СтрокаКоманды "+СтрокаВыполнения); + Процесс = СоздатьПроцесс(СтрокаВыполнения, ТекущийКаталог(), Истина,Истина, КодировкаПотока); + Процесс.Запустить(); + + ТекстВывода = ""; + Счетчик = 0; + + Пока Не Процесс.Завершен Цикл + Текст = Процесс.ПотокВывода.Прочитать(); + Лог.Отладка("Цикл ПотокаВывода "+Текст); + Если Текст = Неопределено ИЛИ ПустаяСтрока(Текст) Тогда + Прервать; + КонецЕсли; + ТекстВывода = ТекстВывода + Текст; + + Счетчик = Счетчик + 1; + Если Счетчик > МаксСчетчикЦикла Тогда + Прервать; + КонецЕсли; + + sleep(ПаузаОжиданияЧтенияБуфера); + КонецЦикла; + + Процесс.ОжидатьЗавершения(); + + Текст = Процесс.ПотокВывода.Прочитать(); + ТекстВывода = ТекстВывода + Текст; + Лог.Отладка(ТекстВывода); + + Возврат Процесс.КодВозврата; +КонецФункции + //я запустил выполнение фичи "ФичаБезШагов" с передачей параметра "-require СтруктураСценария.feature" Процедура ЯЗапустилВыполнениеФичиСПередачейПараметра(Знач ИмяФичи, Знач ПараметрыКоманднойСтроки) Экспорт СохраненныеПараметрыКоманднойСтроки = ПараметрыКоманднойСтроки; From e51d3268833efff97df2d7381eb36868c857db1c Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Tue, 26 Jul 2016 21:39:24 +0300 Subject: [PATCH 45/56] =?UTF-8?q?=D0=A4=D0=B8=D1=87=D0=B0=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B3=D0=B0=20#71?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\275\321\202\320\265\320\272\321\201\321\202.feature" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/features/core/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.feature" "b/features/core/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.feature" index c87c8ad..08b3534 100644 --- "a/features/core/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.feature" +++ "b/features/core/\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202.feature" @@ -66,3 +66,10 @@ Тогда я получаю значение "НовоеЗначениеВКонтексте" от исполнителя +Контекст: Без начального шага + Простое описание контекста, которое приводило к зависанию + И Я сохранил значение "ЗначениеВКонтекстеШаг2" в исполнителе + +Сценарий: Первый сценарий + + Тогда я получаю значение "ЗначениеВКонтекстеШаг2" от исполнителя From 78ece9625302b66669541ddb098db92c1705361c Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Tue, 26 Jul 2016 21:48:08 +0300 Subject: [PATCH 46/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B5=D1=81=D0=BA=D0=BE=D0=BD=D0=B5?= =?UTF-8?q?=D1=87=D0=BD=D1=8B=D0=B9=20=D1=86=D0=B8=D0=BA=D0=BB=20fix=20#71?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gherkin-read.os | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gherkin-read.os b/src/gherkin-read.os index 7edce7d..903262b 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -400,12 +400,12 @@ ЗаполнитьДеревоФич(НайденныеЛексемы, Родитель.Родитель.Строки, Индекс); Возврат; Иначе - НовыйРодитель = Родитель.Родитель; - Если НовыйРодитель = Неопределено Тогда + Родитель = Родитель.Родитель; + Если Родитель = Неопределено Тогда Прервать; Иначе КонецЕсли; - УровеньЛексемыРодителя = НовыйРодитель.УровеньЛексемы; + УровеньЛексемыРодителя = Родитель.УровеньЛексемы; КонецЕсли; КонецЦикла; КонецЕсли; From fd56e21ef738977d268c8ea36c9f186491899eac Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Wed, 27 Jul 2016 19:37:31 +0300 Subject: [PATCH 47/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D1=83=D1=8E=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20?= =?UTF-8?q?=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D0=BD=D0=B5=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B5=D0=B2=20fix?= =?UTF-8?q?=20#72?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...320\265\321\200\320\260\321\206\320\270\320\270.os" | 4 +++- lib.config | 5 +++++ packagedef | 7 +++++++ src/bdd-exec.os | 4 +++- src/bdd-generate.os | 6 ++++-- src/bdd.os | 6 ++++-- tests/exec-feature-tests.os | 7 ++++--- tests/steps-generate-tests.os | 10 +++++----- 8 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 lib.config create mode 100644 packagedef diff --git "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" index d7dbbc6..658e59a 100644 --- "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" +++ "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -1,5 +1,7 @@ #Использовать logos +#Использовать "../../.." + Перем Лог; Перем БДД; @@ -104,7 +106,7 @@ //проверка поведения фичи "ПередачаПараметров" закончилась со статусом "НеРеализован" Процедура ПроверкаПоведенияФичиЗакончиласьСоСтатусом(Знач ИмяФичи, Знач ОжидаемыйСтатусВыполненияСтрока) Экспорт - ИсполнительБДД = ЗагрузитьСценарий(ОбъединитьПути(ПолучитьКаталогИсходников(), "bdd-exec.os")); + ИсполнительБДД = Новый ИсполнительБДД; ОжидаемыйСтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения()[ОжидаемыйСтатусВыполненияСтрока]; diff --git a/lib.config b/lib.config new file mode 100644 index 0000000..c20e8bf --- /dev/null +++ b/lib.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/packagedef b/packagedef new file mode 100644 index 0000000..e0f89bd --- /dev/null +++ b/packagedef @@ -0,0 +1,7 @@ + +Описание.Имя("1bdd") + .Версия("0.9") + .ВключитьФайл("src") + .ВключитьФайл("tests") + .ВключитьФайл("features") + .ВключитьФайл("lib.config") \ No newline at end of file diff --git a/src/bdd-exec.os b/src/bdd-exec.os index 05f21d8..755e2e3 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -15,6 +15,8 @@ #Использовать asserts #Использовать strings +// #Использовать ".." + Перем Лог; Перем ЧитательГеркин; @@ -594,7 +596,7 @@ ВозможныеЦветаСтатусовВыполнения = ВозможныеЦветаСтатусовВыполнения(); ТекущийУровень = 0; - ЧитательГеркин = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "gherkin-read.os")); + ЧитательГеркин = Новый ЧитательГеркин; ВозможныеТипыШагов = ЧитательГеркин.ВозможныеТипыШагов(); ВозможныеКлючиПараметров = ЧитательГеркин.ВозможныеКлючиПараметров(); diff --git a/src/bdd-generate.os b/src/bdd-generate.os index 3a647cc..4950f1d 100644 --- a/src/bdd-generate.os +++ b/src/bdd-generate.os @@ -14,6 +14,8 @@ #Использовать logos #Использовать asserts +// #Использовать ".." + Перем Лог; Перем ЧитательГеркин; @@ -91,7 +93,7 @@ Функция ПолучитьНаборБиблиотечныхШагов(Знач ФайлБиблиотек) //TODO подумать о замене на промежуточный класс, который собирает информацию о шагах в исполнителях - ИсполнительБДД = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "bdd-exec.os")); + ИсполнительБДД = Новый ИсполнительБДД; Набор = ИсполнительБДД.ПолучитьНаборБиблиотечныхШагов(ФайлБиблиотек); ОсвободитьОбъект(ИсполнительБДД); Возврат Набор; @@ -475,7 +477,7 @@ Функция Инициализация() Лог = Логирование.ПолучитьЛог(ИмяЛога()); - ЧитательГеркин = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "gherkin-read.os")); + ЧитательГеркин = Новый ЧитательГеркин; ДопЛог = Логирование.ПолучитьЛог(ЧитательГеркин.ИмяЛога()); ДопЛог.УстановитьУровень(Лог.Уровень()); diff --git a/src/bdd.os b/src/bdd.os index 5ab18a0..b8e52e6 100644 --- a/src/bdd.os +++ b/src/bdd.os @@ -12,6 +12,8 @@ #Использовать cmdline #Использовать logos +#Использовать ".." + Перем Лог; Перем УдалятьВременныеФайлы; Перем СохраненныйТекущийКаталог; @@ -155,7 +157,7 @@ ПутьИсполнителя = ОбъединитьПути(ТекущийСценарий().Каталог, "bdd-exec.os"); Лог.Отладка("Создаю исполнителя. Путь "+ПутьИсполнителя); - ИсполнительБДД = ЗагрузитьСценарий(ПутьИсполнителя); + ИсполнительБДД = Новый ИсполнительБДД; ДопЛог = Логирование.ПолучитьЛог(ИсполнительБДД.ИмяЛога()); ДопЛог.УстановитьУровень(Лог.Уровень()); @@ -184,7 +186,7 @@ ПутьГенератора = ОбъединитьПути(ТекущийСценарий().Каталог, "bdd-generate.os"); Лог.Отладка("Создаю помощника для генерации файла шагов. Путь "+ПутьГенератора); - ГенераторШагов = ЗагрузитьСценарий(ПутьГенератора); + ГенераторШагов = Новый ГенераторШагов; ДопЛог = Логирование.ПолучитьЛог(ГенераторШагов.ИмяЛога()); ДопЛог.УстановитьУровень(Лог.Уровень()); diff --git a/tests/exec-feature-tests.os b/tests/exec-feature-tests.os index b769f9d..63c52dd 100644 --- a/tests/exec-feature-tests.os +++ b/tests/exec-feature-tests.os @@ -15,6 +15,8 @@ #Использовать asserts #Использовать tempfiles +#Использовать ".." + Перем юТест; Перем Лог; Перем ЧитательГеркин; @@ -170,9 +172,8 @@ Функция Инициализация() Лог = Логирование.ПолучитьЛог("bdd-tests"); - ИсполнительБДД = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "../src/bdd-exec.os")); - - ЧитательГеркин = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "../src/gherkin-read.os")); + ИсполнительБДД = Новый ИсполнительБДД; + ЧитательГеркин = Новый ЧитательГеркин; КонецФункции diff --git a/tests/steps-generate-tests.os b/tests/steps-generate-tests.os index dafc51f..073f733 100644 --- a/tests/steps-generate-tests.os +++ b/tests/steps-generate-tests.os @@ -15,6 +15,8 @@ #Использовать asserts #Использовать tempfiles +#Использовать ".." + Перем юТест; Перем Лог; Перем ГенераторШагов; @@ -155,11 +157,9 @@ Лог = Логирование.ПолучитьЛог("bdd-gen-tests"); Лог.УстановитьУровень(УровниЛога.Отладка); - ЧитательГеркин = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "../src/gherkin-read.os")); - - ГенераторШагов = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "../src/bdd-generate.os")); - - ИсполнительБДД = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "../src/bdd-exec.os")); + ЧитательГеркин = Новый ЧитательГеркин; + ГенераторШагов = Новый ГенераторШагов; + ИсполнительБДД = Новый ИсполнительБДД; КонецФункции From ab2adf5e7ec07e45cd29e8e2331e72b9b47d1062 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 30 Jul 2016 20:27:45 +0300 Subject: [PATCH 48/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20"=D0=9D=D0=B5=20=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B8?= =?UTF-8?q?=D0=BC=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0,=20=D0=BA=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D0=B9=20=D0=BD=D0=B5=20=D1=80=D0=B5=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD,=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D0=B8"?= =?UTF-8?q?=20fix=20#74=20=D0=94=D0=BB=D1=8F=20=D0=BD=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D1=8E=20=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=81=D0=BE=D0=BB=D0=B8=20=D1=86=D0=B2=D0=B5=D1=82=20"?= =?UTF-8?q?=D0=91=D0=B8=D1=80=D1=8E=D0=B7=D0=B0"=20=D0=94=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20=D1=84=D0=B8=D1=87=20=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D0=B8=20=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D1=8E=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=88=D0=B0=D0=B3=D0=B0=20?= =?UTF-8?q?=D0=B1=D0=B5=D0=B7=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D1=8B=D1=85=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=83=D1=81=D0=BE=D0=B2=20-=20=D0=9E=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B0,=20=D0=BF=D1=80=D0=B5=D0=B4=D1=83=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=20?= =?UTF-8?q?=D1=82.=D0=BF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bdd-exec.os | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/bdd-exec.os b/src/bdd-exec.os index 755e2e3..854f281 100644 --- a/src/bdd-exec.os +++ b/src/bdd-exec.os @@ -425,9 +425,10 @@ КонецЕсли; КонецПопытки; - ВывестиСообщение(ПредставлениеШага, СтатусВыполнения); КонецЕсли; + ВывестиСообщение(ПредставлениеШага, СтатусВыполнения); + Возврат СтатусВыполнения; КонецФункции // ВыполнитьШаг() @@ -516,22 +517,11 @@ КонецФункции -// реализация интерфейс раскладки для логов +// реализация интерфейса раскладки для логов Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт Отступ = ПолучитьОтступ(ТекущийУровень); - НаименованиеУровня = ""; - - Если Уровень = УровниЛога.Информация Тогда - НаименованиеУровня = ?(Лог.Уровень() <> Уровень, УровниЛога.НаименованиеУровня(Уровень) +Символы.Таб+ "- ", ""); - Сообщение = СтроковыеФункции.ДополнитьСлеваМногострочнуюСтроку(Сообщение, Отступ); - Возврат СтрШаблон("%1%2", НаименованиеУровня, Сообщение); - КонецЕсли; - - НаименованиеУровня = УровниЛога.НаименованиеУровня(Уровень); - - Сообщение = СтроковыеФункции.ДополнитьСлеваМногострочнуюСтроку(Сообщение, СтрШаблон("- %1", Отступ)); - Возврат СтрШаблон("%1 %2 %3", НаименованиеУровня, Символы.Таб, Сообщение); - + Сообщение = СтроковыеФункции.ДополнитьСлеваМногострочнуюСтроку(Сообщение, Отступ); + Возврат Сообщение; КонецФункции // здесь нужно использовать различные виды форматирования @@ -563,7 +553,7 @@ Рез = Новый Соответствие; Рез.Вставить(ВозможныеСтатусыВыполнения.НеВыполнялся, Неопределено); Рез.Вставить(ВозможныеСтатусыВыполнения.Пройден, ЦветКонсоли.Зеленый); - Рез.Вставить(ВозможныеСтатусыВыполнения.НеРеализован, ЦветКонсоли.Серый); + Рез.Вставить(ВозможныеСтатусыВыполнения.НеРеализован, ЦветКонсоли.Бирюза); Рез.Вставить(ВозможныеСтатусыВыполнения.Сломался, ЦветКонсоли.Красный); Возврат Новый ФиксированноеСоответствие(Рез); From 0a562e8b37aa15d68ef55fd9e3a3dd5958f96411 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 31 Jul 2016 00:15:57 +0300 Subject: [PATCH 49/56] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=20=D1=83=D1=81=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D1=81=D1=82=D1=80=D0=BE=D0=BA=20=D0=BC=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=D1=81=D1=82=D1=80=D0=BE=D1=87=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0,=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=84?= =?UTF-8?q?=D0=B8=D1=87=D0=B0=20=D0=B8=20=D0=B5=D0=B5=20=D1=88=D0=B0=D0=B3?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\265\321\202\321\200\320\276\320\262.os" | 6 +--- ...5\321\202\321\200\320\276\320\262.feature" | 20 +++++++++++-- src/gherkin-read.os | 28 +++++++++++++++---- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git "a/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" index bcb6e0a..966d39e 100644 --- "a/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" +++ "b/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" @@ -61,11 +61,7 @@ КонецПроцедуры //1 строка у параметра равна "первая строка" -Процедура СтрокаУПараметраРавна(Знач НомерСтроки, Знач СтрокаПоНомеру) Экспорт - ОжидаемаяСтрока = "первая строка"; - Если НомерСтроки = 2 Тогда - ОжидаемаяСтрока = "вторая строка"; - КонецЕсли; +Процедура СтрокаУПараметраРавна(Знач НомерСтроки, Знач ОжидаемаяСтрока) Экспорт Ожидаем.Что(СтрПолучитьСтроку(ИсходныйПараметр, НомерСтроки), "СтрПолучитьСтроку(ИсходныйПараметр, НомерСтроки)").Равно(ОжидаемаяСтрока); КонецПроцедуры diff --git "a/features/core/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.feature" "b/features/core/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.feature" index f9245f3..7f90080 100644 --- "a/features/core/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.feature" +++ "b/features/core/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.feature" @@ -35,12 +35,28 @@ Когда я передаю параметр """ первая строка + вторая строка """ Тогда я получаю параметр с типом "Строка" - И количество строк у параметра равно 2 + И количество строк у параметра равно 3 + И 1 строка у параметра равна "первая строка" + И 2 строка у параметра равна "" + И 3 строка у параметра равна "вторая строка" + +Сценарий: Использование многострочных строк, когда есть разное сочетание пробелов и табуляции + + Когда я передаю параметр + """ + первая строка + + вторая строка + """ + Тогда я получаю параметр с типом "Строка" + И количество строк у параметра равно 3 И 1 строка у параметра равна "первая строка" - И 2 строка у параметра равна "вторая строка" + И 2 строка у параметра равна "" + И 3 строка у параметра равна " вторая строка" Сценарий: Использование параметров разных типов в одном шаге diff --git a/src/gherkin-read.os b/src/gherkin-read.os index 903262b..4003059 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -285,7 +285,7 @@ Возврат Рез; КонецФункции -Функция ПолучитьОчереднуюСтрокуФичи(Знач Фича, Знач УдалятьПробелыСлева = Истина) +Функция ПолучитьОчереднуюСтрокуФичи(Знач Фича, Знач ПропускатьПустыеСтроки = Истина) Рез = ""; Пока Истина Цикл ОчереднаяСтрока = Фича.ПрочитатьСтроку(); @@ -294,12 +294,13 @@ Возврат Неопределено; КонецЕсли; - Если УдалятьПробелыСлева Тогда + Если ПропускатьПустыеСтроки Тогда Рез = СокрЛП(ОчереднаяСтрока); + Если Не ПустаяСтрока(Рез) Тогда + Прервать; + КонецЕсли; Иначе Рез = СокрП(ОчереднаяСтрока); - КонецЕсли; - Если Не ПустаяСтрока(Рез) Тогда Прервать; КонецЕсли; КонецЦикла; @@ -966,7 +967,11 @@ Если ОчереднаяСтрока = Неопределено или Лев(СокрЛ(ОчереднаяСтрока), ДлинаСтрокиНачалаМногострочногоТекста) = ВозможныеТипыНачалаСтроки.МногострочныйТекст Тогда Прервать; КонецЕсли; - МногострочнаяСтрока = МногострочнаяСтрока + Сред(ОчереднаяСтрока, Отступ) + Символы.ПС; + // проверю, нет ли в отсекаемоей левой части строки непробельных символов, которые нужно сохранить + ПозицияПервогоНеПробельногоСимвола = НайтиПозициюПервогоНеПробельногоСимвола(Лев(ОчереднаяСтрока, Отступ-1)); + + ДобавляемаяСтрока = Сред(ОчереднаяСтрока, Мин(Отступ, ПозицияПервогоНеПробельногоСимвола)); + МногострочнаяСтрока = МногострочнаяСтрока + ДобавляемаяСтрока + Символы.ПС; КонецЦикла; Если Прав(МногострочнаяСтрока, 1) = Символы.ПС Тогда МногострочнаяСтрока = Сред(МногострочнаяСтрока, 1, СтрДлина(МногострочнаяСтрока) - 1); @@ -975,6 +980,18 @@ Возврат МногострочнаяСтрока; КонецФункции // ПолучитьМногострочныйТекст() +Функция НайтиПозициюПервогоНеПробельногоСимвола(Знач Строка) + КоллекцияГруппСовпадений = РегулярныеВыражения.ПробельныеСимволы.НайтиСовпадения(Строка); + Если КоллекцияГруппСовпадений.Количество() = 0 Тогда + Возврат СтрДлина(Строка)+1; + КонецЕсли; + Совпадение = КоллекцияГруппСовпадений[0]; + Значение = Совпадение.Группы[0].Значение; + Поз = Совпадение.Группы[0].Индекс; + Возврат Поз; + +КонецФункции // НайтиПозициюПервогоНепробельногоСимвола() + Функция ВозможныеТипыНачалаСтроки() Рез = Новый Структура; Рез.Вставить("Комментарий", "#"); @@ -1104,6 +1121,7 @@ Рез.Вставить("МногострочныйТекст", Новый РегулярноеВыражение("\s*""""""\n\r*((.*\n\r*)+)\s*""""""")); Рез.Вставить("ПараметрДляТаблицы", Новый РегулярноеВыражение("<([^>]+)>")); Рез.Вставить("ПараметрТаблицы", Новый РегулярноеВыражение("\|\s*([^\|]+)\s*")); + Рез.Вставить("ПробельныеСимволы", Новый РегулярноеВыражение("[^\s]")); Возврат Новый ФиксированнаяСтруктура(Рез); КонецФункции // СоздатьРегулярныеВыражения() From ec4255d378c9a1f93940626115441086bbbd359e Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 31 Jul 2016 00:16:44 +0300 Subject: [PATCH 50/56] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=84=D0=B8=D1=87=D0=B0=20=D0=B8=20=D1=88?= =?UTF-8?q?=D0=B0=D0=B3=D0=B8=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B8=20"=D0=9D=D0=B5=20=D0=BF=D0=BE=D0=BA=D0=B0?= =?UTF-8?q?=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B8=D0=BC?= =?UTF-8?q?=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0,=20=D0=BA=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D1=8B=D0=B9=20=D0=BD=D0=B5=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=B8=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?,=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D0=B8"=20fix?= =?UTF-8?q?=20#74?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\270\320\265\320\244\320\270\321\207.os" | 56 ++++++++++++++++++- ...0\320\265\320\244\320\270\321\207.feature" | 25 +++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git "a/features/core/step_definitions/\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.os" "b/features/core/step_definitions/\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.os" index 6b78090..62d3358 100644 --- "a/features/core/step_definitions/\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.os" +++ "b/features/core/step_definitions/\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.os" @@ -26,9 +26,63 @@ //в лог-файле запуска продукта есть строка "ЯЗапускаюПадающийШагСПараметром-Первый падающий шаг" Процедура ВЛог_ФайлеЗапускаПродуктаЕстьСтрока(Знач ПроверяемаяСтрока) Экспорт ТекстЛогФайла = БДД.ПолучитьИзКонтекста("ТекстЛогФайлаПродукта"); - Ожидаем.Что(ТекстЛогФайла).Содержит(ПроверяемаяСтрока); + Если СтрЧислоСтрок(ПроверяемаяСтрока) = 1 Тогда + Ожидаем.Что(ТекстЛогФайла).Содержит(ПроверяемаяСтрока); + Иначе + ПроверитьЧтоМногострочнаяСтрокаСодержитПодстрокуБезУчетаНачальныхКонечныхПробеловВПодстроках(ТекстЛогФайла, ПроверяемаяСтрока); + КонецЕсли; КонецПроцедуры +//TODO перенести в ассерты oscript-library +Процедура ПроверитьЧтоМногострочнаяСтрокаСодержитПодстрокуБезУчетаНачальныхКонечныхПробеловВПодстроках(Знач Строка, Знач Подстрока, ДопСообщениеОшибки = "") + СообщениеОшибки = ""; + Нашли = МногострочнаяСтрокаСодержитПодстрокуБезУчетаНачальныхКонечныхПробеловВПодстроках(Строка, Подстрока, СообщениеОшибки); + Если Не Нашли Тогда + ВызватьИсключение СтрШаблон("Ожидали, что в строке < + |%1 + |> + |найдем подстроку< + |%2 + |> + |А это не так. + |Уточнение: %3. + |%4", Строка, Подстрока, СообщениеОшибки, ДопСообщениеОшибки); + КонецЕсли; +КонецПроцедуры + +Функция МногострочнаяСтрокаСодержитПодстрокуБезУчетаНачальныхКонечныхПробеловВПодстроках(Знач Строка, Знач Подстрока, СообщениеОшибки = "") + ПерваяСтрока = СокрЛП(СтрПолучитьСтроку(Подстрока, 1)); + НашлиПервуюСтроку = Ложь; + Для Счетчик = 1 По СтрЧислоСтрок(Строка) Цикл + ОчереднаяСтрока = СокрЛП(СтрПолучитьСтроку(Строка, Счетчик)); + НашлиПервуюСтроку = Найти(ОчереднаяСтрока, ПерваяСтрока) <> 0; + Если НашлиПервуюСтроку Тогда + Прервать; + КонецЕсли; + КонецЦикла; + Если Не НашлиПервуюСтроку Тогда + СообщениеОшибки = СтрШаблон("Не нашли первую же подстроку <%1>", ПерваяСтрока); + Возврат Ложь; + КонецЕсли; + + СчетчикЧтоИщем = 2; + Для Счетчик = Счетчик+1 По СтрЧислоСтрок(Строка) Цикл + ОчереднаяСтрока = СокрЛП(СтрПолучитьСтроку(Строка, Счетчик)); + ЧтоИщем = СокрЛП(СтрПолучитьСтроку(Подстрока, СчетчикЧтоИщем)); + Поз = Найти(ОчереднаяСтрока, ЧтоИщем); + Если Поз = 0 Тогда + СообщениеОшибки = СтрШаблон("Не нашли подстроку № %1 <%2>", СчетчикЧтоИщем, ЧтоИщем); + Возврат Ложь; + Иначе + СчетчикЧтоИщем = СчетчикЧтоИщем + 1; + Если СчетчикЧтоИщем > СтрЧислоСтрок(Подстрока) Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + Возврат СчетчикЧтоИщем > СтрЧислоСтрок(Подстрока); +КонецФункции + //в лог-файле запуска продукта отсутствует строка "ДоЭтогоШагаВыполнениеДойтиНеДолжно" Процедура ВЛог_ФайлеЗапускаПродуктаОтсутствуетСтрока(Знач ПроверяемаяСтрока) Экспорт ТекстЛогФайла = БДД.ПолучитьИзКонтекста("ТекстЛогФайлаПродукта"); diff --git "a/features/core/\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\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" index a293e6a..a4b1790 100644 --- "a/features/core/\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\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" @@ -48,3 +48,28 @@ Сценарий: Прогон фич из каталога при наличии падающих фич выдает правильный код возврата Тогда проверка поведения фич с передачей параметра "" из каталога "." закончилась с кодом возврата 2 +Сценарий: Проверка лога при запуске нереализованного шага сценария + Когда я подготовил тестовый каталог для фич + И установил тестовый каталог как текущий + И я создал файл фичи "НесуществующийШаг" с текстом + """ + # language: ru + Функционал: Просто функционал + Сценарий: Просто сценарий + Тогда выполняется несуществующий шаг + """ + + Тогда проверка поведения фичи "НесуществующийШаг" закончилась с кодом возврата 1 + И в лог-файле запуска продукта есть строка + """ + Функциональность Просто функционал + Сценарий Просто сценарий + выполняется несуществующий шаг + Не реализован + """ + И в лог-файле запуска продукта есть строка + """ + 1 Сценарий ( 0 Пройден, 1 Не реализован, 0 Сломался, 0 Не выполнялся ) + 1 Шаг ( 0 Пройден, 1 Не реализован, 0 Сломался, 0 Не выполнялся ) + + """ From 827242868ef7b2f8537928f2f6eb8f2ae48cbdba Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 31 Jul 2016 00:26:45 +0300 Subject: [PATCH 51/56] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gherkin-read.os | 75 ++------------------------------------------- 1 file changed, 3 insertions(+), 72 deletions(-) diff --git a/src/gherkin-read.os b/src/gherkin-read.os index 4003059..1358db8 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -182,14 +182,11 @@ ПервыйСимвол = Лев(ОчереднаяСтрока, 1); Если ПервыйСимвол = ВозможныеТипыНачалаСтроки.Комментарий Тогда - //Лог.Отладка(" Первый символ строки - это комментарий."); НовыйЯзык = ПолучитьЯзыкФичи(ОчереднаяСтрока); Если ЗначениеЗаполнено(НовыйЯзык) Тогда Язык = НовыйЯзык; СоответствиеКлючевыеСлова = СоответствиеЯзыкКлючевыеСлова.Получить(Язык); Лог.Отладка(" Получили язык фичи "+Язык); - Иначе - //Лог.Отладка(" Пропускаю строку"); КонецЕсли; Продолжить; @@ -641,7 +638,6 @@ Лог.Отладка("Пропускаю Элемент "+Элемент); Продолжить; КонецЕсли; - // Элемент = СтрЗаменить(Элемент, "-", "_"); АдресШага = АдресШага + ТРег(Элемент); КонецЦикла; @@ -816,29 +812,20 @@ Процедура ВставитьУзлыКонтекстовВУзлыСценариевПодчиненныхКонтексту(СтрокиДерева, Знач СчетчикСтрокиВДереве = 0, Знач УзелКонтекста = Неопределено) Для Счетчик = СчетчикСтрокиВДереве По СтрокиДерева.Количество() -1 Цикл -// Лог.Ошибка("Счетчик в цикле %1, кол-во строк %2", Счетчик, СтрокиДерева.Количество() -1); СтрокаДерева = СтрокиДерева[Счетчик]; Лог.Отладка(" Лексема <%1>, Тело <%2>, уровень <%3>, уровень() %4", СтрокаДерева.Лексема, СтрокаДерева.Тело, СтрокаДерева.УровеньЛексемы, СтрокаДерева.Уровень()); - //Если ТипЗнч(СтрокаДерева.Владелец()) <> Тип("ДеревоЗначений") Тогда - // Лог.Ошибка(" Лексема <%1>, Тело <%2>, уровень <%3>", СтрокаДерева.Владелец().Лексема, СтрокаДерева.Владелец().Тело, СтрокаДерева.Владелец().УровеньЛексемы); - //КонецЕсли; Если СтрокаДерева.Уровень() > 1 Тогда - // Лог.Ошибка(" Пропускаю строку "); Прервать; КонецЕсли; Если СтрокаДерева.ТипШага = ВозможныеТипыШагов.Контекст Тогда Лог.Отладка(СтрШаблон("Найден контекст <%1>", СтрокаДерева.Тело)); - //Если УзелКонтекста = Неопределено Тогда - СтрокиДерева.Удалить(СтрокаДерева); - ВставитьУзлыКонтекстовВУзлыСценариевПодчиненныхКонтексту(СтрокиДерева, Счетчик, СтрокаДерева); - Прервать; - //Иначе - //КонецЕсли; + СтрокиДерева.Удалить(СтрокаДерева); + ВставитьУзлыКонтекстовВУзлыСценариевПодчиненныхКонтексту(СтрокиДерева, Счетчик, СтрокаДерева); + Прервать; Иначе Если УзелКонтекста <> Неопределено Тогда Если СтрокаДерева.УровеньЛексемы = УзелКонтекста.УровеньЛексемы Тогда - //МассивСтрокДляВставкиКонтекста.Добавить(СтрокаДерева); МассивСтрокДляВставкиКонтекста = Новый Массив; МассивСтрокДляВставкиКонтекста.Добавить(СтрокаДерева); ВставитьУзелКонтекста(МассивСтрокДляВставкиКонтекста, УзелКонтекста); @@ -853,62 +840,6 @@ КонецЦикла; КонецПроцедуры -// -//Процедура ВставитьУзлыКонтекстовВУзлыСценариевПодчиненныхКонтексту(СтрокиДерева) -// КоличествоСтрок = СтрокиДерева.Количество() - 1; -// Для Счетчик = 0 По КоличествоСтрок Цикл -// //Пока Счетчик <= КоличествоСтрок Цикл -// // Счетчик = Счетчик + 1; -// -//Лог.Ошибка("Счетчик в цикле %1, кол-во строк %2", Счетчик, КоличествоСтрок); -// Если Счетчик > КоличествоСтрок Тогда -// Прервать; -// КонецЕсли; -// СтрокаДерева = СтрокиДерева[Счетчик]; -// Лог.Ошибка(" Лексема <%1>, Тело <%2>", СтрокаДерева.Лексема, СтрокаДерева.Тело); -// Если СтрокаДерева.ТипШага = ВозможныеТипыШагов.Контекст Тогда -// Лог.Отладка(СтрШаблон("Найден контекст <%1>", СтрокаДерева.Тело)); -// СтрокиДерева.Удалить(СтрокаДерева); -// КоличествоСтрок = КоличествоСтрок - 1; -// -// МассивСтрокДляВставкиКонтекста = Новый Массив; -// Для СчетчикСценариев = Счетчик По КоличествоСтрок Цикл -// //Для СчетчикСценариев = Счетчик + 1 По КоличествоСтрок Цикл -// СтрокаСценария = СтрокиДерева[СчетчикСценариев]; -// -// // каждый новый контекст вытесняет предыдущий контекст -// Если СтрокаСценария.ТипШага = ВозможныеТипыШагов.Контекст Тогда -// ВставитьУзелКонтекста(МассивСтрокДляВставкиКонтекста, СтрокаДерева); -// МассивСтрокДляВставкиКонтекста = Новый Массив; -// -// Счетчик = СчетчикСценариев; -// //Счетчик = СчетчикСценариев - 1; -// -// //СтрокиДерева.Удалить(СтрокаДерева); -// //Счетчик = Счетчик - 1; -// Прервать; -// КонецЕсли; -// -// Если СтрокаСценария.УровеньЛексемы = СтрокаДерева.УровеньЛексемы Тогда -// МассивСтрокДляВставкиКонтекста.Добавить(СтрокаСценария); -// КонецЕсли; -// КонецЦикла; -// ВставитьУзелКонтекста(МассивСтрокДляВставкиКонтекста, СтрокаДерева); -// СтрокиДерева.Удалить(СтрокаДерева); -// Лог.Ошибка("Счетчик до удаления %1, кол-во строк %2", Счетчик, КоличествоСтрок); -// Лог.Ошибка(" до удаления Лексема <%1>, Тело <%2>", СтрокаДерева.Лексема, СтрокаДерева.Тело); -// Счетчик = Счетчик - 1; -// КоличествоСтрок = КоличествоСтрок - 1; -// Лог.Ошибка("Счетчик при удалении %1, кол-во строк %2", Счетчик, КоличествоСтрок); -// СтрокаДереваВрем = СтрокиДерева[Счетчик]; -// Лог.Ошибка(" после удаления Лексема <%1>, Тело <%2>", СтрокаДереваВрем.Лексема, СтрокаДереваВрем.Тело); -// ПоказатьДеревоВРежимеОтладки(СтрокаДереваВрем.Владелец(), " "); -// Иначе -// ВставитьУзлыКонтекстовВУзлыСценариевПодчиненныхКонтексту(СтрокаДерева.Строки); -// КонецЕсли; -// КонецЦикла; -//КонецПроцедуры - Процедура ВставитьУзелКонтекста(Знач МассивСтрокДляВставкиКонтекста, Знач УзелКонтекста) Для каждого СтрокаСценария Из МассивСтрокДляВставкиКонтекста Цикл Лог.Отладка(СтрШаблон("Вставляю контекст для строки <%1>, контекст <%2>", СтрокаСценария.Тело, УзелКонтекста.Тело)); From 42b5a10e23d4987a9f70df8aa9073c7aa3a0a98c Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 31 Jul 2016 17:33:04 +0300 Subject: [PATCH 52/56] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=BE=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B4=D0=BB=D1=8F=20=D1=84=D0=B8?= =?UTF-8?q?=D1=87=20#11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\260\320\275\320\275\321\213\321\205.os" | 18 +- ...0\320\275\320\275\321\213\321\205.feature" | 16 +- lib.config | 1 + src/FileLineReader.os | 58 ++++++ src/gherkin-read.os | 189 +++++++++++++----- 5 files changed, 213 insertions(+), 69 deletions(-) create mode 100644 src/FileLineReader.os diff --git "a/features/core/step_definitions/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.os" "b/features/core/step_definitions/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.os" index e9b1e11..c0b7a6b 100644 --- "a/features/core/step_definitions/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.os" +++ "b/features/core/step_definitions/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.os" @@ -41,17 +41,21 @@ КонецПроцедуры //у переданной таблицы 2 колонки -Процедура УПереданнойТаблицыКолонки(Знач ПарамЧисло1) Экспорт - ВызватьИсключение Новый ИнформацияОбОшибке("Шаг <УПереданнойТаблицыКолонки> не реализован", "Не реализовано."); +Процедура УПереданнойТаблицыКолонки(Знач ОжидаемоеКоличество) Экспорт + Таблица = БДД.ПолучитьИзКонтекста("ТаблицаДанных"); + Ожидаем.Что(Таблица.Колонки).ИмеетДлину(ОжидаемоеКоличество); КонецПроцедуры //у переданной таблицы 2 строки -Процедура УПереданнойТаблицыСтроки(Знач ПарамЧисло1) Экспорт - ВызватьИсключение Новый ИнформацияОбОшибке("Шаг <УПереданнойТаблицыСтроки> не реализован", "Не реализовано."); +Процедура УПереданнойТаблицыСтроки(Знач ОжидаемоеКоличество) Экспорт + Таблица = БДД.ПолучитьИзКонтекста("ТаблицаДанных"); + Ожидаем.Что(Таблица).ИмеетДлину(ОжидаемоеКоличество); КонецПроцедуры //у 1 строки таблицы заданы значения "Ячейка11" и "Ячейка12" -Процедура УСтрокиТаблицыЗаданыЗначенияИ(Знач ПарамЧисло1,Знач ПарамСтрока2,Знач ПарамСтрока3) Экспорт - ВызватьИсключение Новый ИнформацияОбОшибке("Шаг <УСтрокиТаблицыЗаданыЗначенияИ> не реализован", "Не реализовано."); +Процедура УСтрокиТаблицыЗаданыЗначенияИ(Знач НомерСтроки, Знач ОжидаемоеЗначение0, Знач ОжидаемоеЗначение1) Экспорт + Таблица = БДД.ПолучитьИзКонтекста("ТаблицаДанных"); + СтрокаТаблицы = Таблица[НомерСтроки]; + Ожидаем.Что(СтрокаТаблицы[0], "СтрокаТаблицы[0]").Равно(ОжидаемоеЗначение0); + Ожидаем.Что(СтрокаТаблицы[1], "СтрокаТаблицы[1]").Равно(ОжидаемоеЗначение1); КонецПроцедуры - diff --git "a/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" "b/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" index 33be01c..a7d5268 100644 --- "a/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" +++ "b/features/core/\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\224\320\260\320\275\320\275\321\213\321\205.feature" @@ -6,11 +6,11 @@ Сценарий: Проверяю передачу простой таблицы - # Когда я передаю таблицу - # | Ячейка11 | Ячейка12| - # | Ячейка21 | Ячейка22| - # Тогда переданная таблица является типом "ТаблицаЗначений" - # И у переданной таблицы 2 колонки - # И у переданной таблицы 2 строки - # И у 1 строки таблицы заданы значения "Ячейка11" и "Ячейка12" - # И у 2 строки таблицы заданы значения "Ячейка21" и "Ячейка22" \ No newline at end of file + Когда я передаю таблицу + | Ячейка11 | Ячейка12| + | Ячейка21 | Ячейка22| + Тогда переданная таблица является типом "ТаблицаЗначений" + И у переданной таблицы 2 колонки + И у переданной таблицы 2 строки + И у 0 строки таблицы заданы значения "Ячейка11" и "Ячейка12" + И у 1 строки таблицы заданы значения "Ячейка21" и "Ячейка22" \ No newline at end of file diff --git a/lib.config b/lib.config index c20e8bf..3369271 100644 --- a/lib.config +++ b/lib.config @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/src/FileLineReader.os b/src/FileLineReader.os new file mode 100644 index 0000000..34b8943 --- /dev/null +++ b/src/FileLineReader.os @@ -0,0 +1,58 @@ +//---------------------------------------------------------- +//This Source Code Form is subject to the terms of the +//Mozilla Public License, v.2.0. If a copy of the MPL +//was not distributed with this file, You can obtain one +//at http://mozilla.org/MPL/2.0/. +//---------------------------------------------------------- + +////////////////////////////////////////////////////////////////// +// +// Объект-помощник для чтения файла фич +// +////////////////////////////////////////////////////////////////// + +Перем ЧтениеТекста; +Перем КоллекцияСтрок; +Перем ПозицияВКоллекции; + +//////////////////////////////////////////////////////////////////// +//{ Программный интерфейс + +Процедура Инициализировать(Знач ПутьФайла, Знач Кодировка = "UTF-8") Экспорт + КоллекцияСтрок = Новый Массив; + ПозицияВКоллекции = -1; + + ЧтениеТекста = Новый ЧтениеТекста(ПутьФайла, Кодировка); + ПрочитатьТекстВКоллекцию(); +КонецПроцедуры + +Процедура Закрыть() Экспорт + ЧтениеТекста.Закрыть(); +КонецПроцедуры + +Функция ПрочитатьСтроку() Экспорт + ПозицияВКоллекции = ПозицияВКоллекции + 1; + Если ПозицияВКоллекции >= КоллекцияСтрок.Количество() Тогда + Возврат Неопределено; + КонецЕсли; + + ОчереднаяСтрока = КоллекцияСтрок[ПозицияВКоллекции]; + Возврат ОчереднаяСтрока; +КонецФункции // ОчереднаяСтрока() + +Процедура ВернутьсяНаСтрокуНазад() Экспорт + ПозицияВКоллекции = ПозицияВКоллекции - 1; +КонецПроцедуры + +//} + +Процедура ПрочитатьТекстВКоллекцию() + Пока Истина Цикл + ОчереднаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + Если ОчереднаяСтрока = Неопределено Тогда + Прервать; + КонецЕсли; + КоллекцияСтрок.Добавить(ОчереднаяСтрока); + КонецЦикла; + +КонецПроцедуры \ No newline at end of file diff --git a/src/gherkin-read.os b/src/gherkin-read.os index 1358db8..05fce97 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -42,7 +42,8 @@ КонецЕсли; Лог.Отладка("Читаю сценарий "+ФайлСценария.ПолноеИмя); - Фича = Новый ЧтениеТекста(ФайлСценария.ПолноеИмя, "UTF-8"); + Фича = Новый ЧитательСтрокФайла; + Фича.Инициализировать(ФайлСценария.ПолноеИмя); СтруктураФичи = РазобратьТекстФичи(Фича); НайденныеЛексемы = СтруктураФичи.НайденныеЛексемы; @@ -87,6 +88,7 @@ Рез.Вставить("Число", "<ПараметрЧисло>"); Рез.Вставить("Дата", "<ПараметрДата>"); Рез.Вставить("ПараметрДляТаблицы", "<ПараметрДляТаблицы>"); + Рез.Вставить("Таблица", "<Таблица>"); Возврат Новый ФиксированнаяСтруктура(Рез); КонецФункции @@ -194,6 +196,17 @@ Лог.Отладка(" Первый символ строки - это метка. Пропускаю строку"); Продолжить; + ИначеЕсли ПервыйСимвол = ВозможныеТипыНачалаСтроки.Таблица И НЕ ПредыдущиеПараметрыЛексемы.ДалееБудутДополнительныеСтроки Тогда + Лог.Отладка("Очередная строка фичи <"+ОчереднаяСтрока+">"); + + ПредыдущиеПараметрыЛексемы.ЕстьТелоТаблицы = Истина; + ПредыдущиеПараметрыЛексемы.ТелоТаблицы = ПолучитьТелоТаблицыДанных(Фича, ОчереднаяСтрока); + + // ПраваяЧасть = ПредыдущиеПараметрыЛексемы.ПраваяЧасть + ?(ПустаяСтрока(ПредыдущиеПараметрыЛексемы.ПраваяЧасть), "", Символы.ПС); + // ПредыдущиеПараметрыЛексемы.ПраваяЧасть = ПраваяЧасть + ПредыдущиеПараметрыЛексемы.ТелоТаблицы; + Лог.Отладка("Добавляю таблицу данных как часть предыдущей лексемы. Тело <%1>", ПредыдущиеПараметрыЛексемы.ТелоТаблицы); + Продолжить; + ИначеЕсли Лев(ОчереднаяСтрока, ДлинаСтрокиНачалаМногострочногоТекста) = ВозможныеТипыНачалаСтроки.МногострочныйТекст Тогда Лог.Отладка("Очередная строка фичи <"+ОчереднаяСтрока+">"); @@ -201,6 +214,7 @@ ПредыдущиеПараметрыЛексемы.ПраваяЧасть = ПраваяЧасть + ПолучитьМногострочныйТекст(Фича); Лог.Отладка("Добавляю многострочный текст как часть предыдущей лексемы. Тело "+ПредыдущиеПараметрыЛексемы.ПраваяЧасть); Продолжить; + КонецЕсли; Лог.Отладка("Очередная строка фичи <"+ОчереднаяСтрока+">"); @@ -241,6 +255,8 @@ Рез.Вставить("Лексема", Неопределено); Рез.Вставить("ПраваяЧасть", ""); Рез.Вставить("ДалееБудутДополнительныеСтроки", Ложь); + Рез.Вставить("ЕстьТелоТаблицы", Ложь); + Рез.Вставить("ТелоТаблицы", ""); СтрокаДляПоиска = НРег(Строка); Для каждого КлючЗначение Из СоответствиеКлючевыеСлова Цикл @@ -315,17 +331,17 @@ ЕстьФичи = ЗначениеЗаполнено(СтрокиДерева); Если ЕстьФичи Тогда -Лог.Отладка(СтроковыеФункции.ДополнитьСлеваМногострочнуюСтроку(" -| ------------------- Текущее дерево (перед подменой структуры сценария): ------------------- -|", " ")); -ПоказатьДеревоВРежимеОтладки(ДеревоФич, " "); + Лог.Отладка(СтроковыеФункции.ДополнитьСлеваМногострочнуюСтроку(" + | ------------------- Текущее дерево (перед подменой структуры сценария): ------------------- + |", " ")); + ПоказатьДеревоВРежимеОтладки(ДеревоФич, " "); СоздатьНовыеСценарииВУзлахДереваВместоСтруктурыСценария(СтрокиДерева); -Лог.Отладка(СтроковыеФункции.ДополнитьСлеваМногострочнуюСтроку(" -| ------------------- Текущее дерево (перед подменой контекстов): ------------------- -|", " ")); -ПоказатьДеревоВРежимеОтладки(ДеревоФич, " "); + Лог.Отладка(СтроковыеФункции.ДополнитьСлеваМногострочнуюСтроку(" + | ------------------- Текущее дерево (перед подменой контекстов): ------------------- + |", " ")); + ПоказатьДеревоВРежимеОтладки(ДеревоФич, " "); ВставитьУзлыКонтекстовВУзлыСценариевПодчиненныхКонтексту(СтрокиДерева); КонецЕсли; @@ -351,7 +367,7 @@ НайденныеПараметры = Неопределено; ПараметрыДляТаблицы = Неопределено; ЕстьПараметрыДляТаблицы = Ложь; - НоваяПраваяЧасть = ИзвлечьПараметры(ПараметрыОчереднойЛексемы.ПраваяЧасть, НайденныеПараметры, ПараметрыДляТаблицы, ЕстьПараметрыДляТаблицы); + НоваяПраваяЧасть = ИзвлечьПараметры(ПараметрыОчереднойЛексемы, НайденныеПараметры, ПараметрыДляТаблицы, ЕстьПараметрыДляТаблицы); Лог.Отладка("НоваяПраваяЧасть "+НоваяПраваяЧасть); НоваяСтрока = ЗаполнитьУзелДереваФич(СтрокиДерева, ОчереднаяЛексема, ПараметрыОчереднойЛексемы.ПраваяЧасть); @@ -373,20 +389,20 @@ НовыйУровеньЛексемы = УровниЛексем[НоваяЛексема]; Лог.Отладка(СтрШаблон("Проверяю следующую лексему <%1>, Индекс %2, уровень <%3>, верхний уровень %4", - НоваяЛексема, Индекс, НовыйУровеньЛексемы, УровеньЛексемы)); + НоваяЛексема, Индекс, НовыйУровеньЛексемы, УровеньЛексемы)); Если НовыйУровеньЛексемы = УровеньЛексемы Тогда Продолжить; ИначеЕсли НовыйУровеньЛексемы > УровеньЛексемы Тогда // TODO здесь должны быть равнозначные узлы. Например, сценарий/примеры Лог.Отладка(СтрШаблон("Создаю подчиненный узел дерева фич, лексема %1, Индекс %2, уровень %3", - НоваяЛексема, Индекс, НовыйУровеньЛексемы)); + НоваяЛексема, Индекс, НовыйУровеньЛексемы)); ЗаполнитьДеревоФич(НайденныеЛексемы, НоваяСтрока.Строки, Индекс); Иначе Родитель = НоваяСтрока.Родитель; УровеньЛексемыРодителя = Родитель.УровеньЛексемы; Лог.Отладка(СтрШаблон("Уровень следующей лексемы меньше уровня текущей лексемы - |Проверяю уровень родителя <%1>, Индекс %2, уровень <%3>", - Родитель.Лексема, Индекс, УровеньЛексемыРодителя)); + |Проверяю уровень родителя <%1>, Индекс %2, уровень <%3>", + Родитель.Лексема, Индекс, УровеньЛексемыРодителя)); Если НовыйУровеньЛексемы < УровеньЛексемыРодителя Тогда Лог.Отладка("Возвращаюсь на предыдущий уровень дерева фич"); ЗаполнитьДеревоФич(НайденныеЛексемы, Родитель.Строки, Индекс); @@ -420,11 +436,18 @@ Возврат НоваяСтрока; КонецФункции -Функция ИзвлечьПараметры(Знач Тело, НайденныеПараметры, ПараметрыДляТаблицы, ЕстьПараметрыДляТаблицы) +Функция ИзвлечьПараметры(Знач ПараметрыЛексемы, НайденныеПараметры, ПараметрыДляТаблицы, ЕстьПараметрыДляТаблицы) + Тело = ПараметрыЛексемы.ПраваяЧасть; + НайденныеПараметры = СоздатьТаблицуПараметров(); ПараметрыДляТаблицы = СоздатьТаблицуПараметров(); - Тело = ВыделитьПараметрыИзТаблицы(Тело, НайденныеПараметры, ЕстьПараметрыДляТаблицы); + Тело = ВыделитьПараметрыДляПодстановкиТаблицы(Тело, НайденныеПараметры, ЕстьПараметрыДляТаблицы); + + Если ПараметрыЛексемы.ЕстьТелоТаблицы Тогда + Тело = СтрШаблон("%1 %2", Тело, ИзвлечьПараметрТаблица(ПараметрыЛексемы.ТелоТаблицы, НайденныеПараметры)); + Лог.Отладка("Тело после извлечения параметра-таблицы %1", Тело); + КонецЕсли; Тело = ВыделитьПараметрыИзМногострочногоТекста(Тело, НайденныеПараметры); @@ -570,7 +593,7 @@ КонецФункции -Функция ВыделитьПараметрыИзТаблицы(Знач Тело, Параметры, ЕстьПараметрыДляТаблицы) +Функция ВыделитьПараметрыДляПодстановкиТаблицы(Знач Тело, Параметры, ЕстьПараметрыДляТаблицы) РегулярноеВыражение = РегулярныеВыражения.ПараметрДляТаблицы; КоллекцияГруппСовпадений = РегулярноеВыражение.НайтиСовпадения(Тело); ЕстьПараметрыДляТаблицы = КоллекцияГруппСовпадений.Количество() <> 0; @@ -594,7 +617,20 @@ КонецЦикла; Возврат НовоеТело; -КонецФункции // ВыделитьПараметрыИзТаблицы(НовоеТело, Параметры) +КонецФункции // ВыделитьПараметрыДляПодстановкиТаблицы(НовоеТело, Параметры) + +Функция ИзвлечьПараметрТаблица(Знач ТекстТаблицы, Параметры) + Если Лев(ТекстТаблицы, 1) <> ВозможныеТипыНачалаСтроки.Таблица Тогда + Возврат ТекстТаблицы; + КонецЕсли; + Таблица = ПолучитьТаблицу(ТекстТаблицы); + ОписаниеПараметра = ВозможныеКлючиПараметров.Таблица; + Начало = 100000;// чтобы параметр-таблица всегда шел последним в списке параметров + + ДобавитьПараметр(Параметры, ОписаниеПараметра, Таблица, Начало); + + Возврат ОписаниеПараметра; +КонецФункции // ИзвлечьПараметрТаблица(Тело, Параметры) Функция СоздатьТаблицуПараметров() Рез = Новый ТаблицаЗначений; @@ -680,7 +716,9 @@ СтрокаДерева = Элемент.СтрокаДерева; УзелПримеры = НайтиШагПримеры(СтрокаДерева); - ТаблицаПримеров = ПолучитьТаблицуПримеров(УзелПримеры.Тело); + ТаблицаПримеров = ПолучитьТаблицу(УзелПримеры.Тело); + ИспользоватьПервуюСтрокуКакИменаКолонокТаблицы(ТаблицаПримеров); + СтрокаДерева.Строки.Удалить(УзелПримеры); СтрокиДерева.Удалить(СтрокаДерева); @@ -701,53 +739,78 @@ ВызватьИсключение СтрШаблон("Ошибка формата файла-фичи - Для структуры сценария не удалось найти примеры. Название структуры сценария %1", ИсходныйУзел.Тело); КонецФункции // НайтиШагПримеры(Строка) -Функция ПолучитьТаблицуПримеров(Знач ТекстПримеров) +Функция ПолучитьТаблицу(Знач ТекстТаблицы) - ЧислоСтрок = СтрЧислоСтрок(ТекстПримеров); - Ожидаем.Что(ЧислоСтрок, СтрШаблон("Неверное количество строк из таблицы примеров. Текст %1", ТекстПримеров)).Больше(1); + ЧислоСтрок = СтрЧислоСтрок(ТекстТаблицы); + Ожидаем.Что(ЧислоСтрок, СтрШаблон("Количество строк из таблицы должно быть больше 0, а это не так. Текст %1", ТекстТаблицы)).Больше(0); РезТаблица = Новый ТаблицаЗначений; - СтрокаИменКолонокИзПримеров = СтрПолучитьСтроку(ТекстПримеров, 1); - Лог.Отладка(СтрШаблон("Первая СтрокаПримеров %1", СтрокаИменКолонокИзПримеров)); - - МассивИменКолонок = ПолучитьНаборПримеровИзСтрокиПримеров(СтрокаИменКолонокИзПримеров); - Для НомерКолонки = 0 По МассивИменКолонок.Количество() - 1 Цикл - ИмяКолонки = МассивИменКолонок[НомерКолонки]; - Лог.Отладка(СтрШаблон("имя колонки %1 (для подстановки из таблицы) <%2>", НомерКолонки, ИмяКолонки)); - РезТаблица.Колонки.Добавить("К"+НомерКолонки,, ИмяКолонки); + МассивЗначенийПервойСтроки = ПолучитьНаборЗначенийИзТекстовойСтрокиТаблицы(ТекстТаблицы, 1); + Для НомерКолонки = 0 По МассивЗначенийПервойСтроки.Количество() - 1 Цикл + РезТаблица.Колонки.Добавить("К"+НомерКолонки); КонецЦикла; + НоваяСтрока = РезТаблица.Добавить(); + ЗаполнитьСтрокуТаблицы(МассивЗначенийПервойСтроки, НоваяСтрока, 0); + Для НомерСтроки = 2 По ЧислоСтрок Цикл - СтрокаПримеров = СтрПолучитьСтроку(ТекстПримеров, НомерСтроки); - Лог.Отладка(СтрШаблон(" СтрокаПримеров №%2 %1", СтрокаПримеров, НомерСтроки-1)); - МассивЗначений = ПолучитьНаборПримеровИзСтрокиПримеров(СтрокаПримеров); + МассивЗначений = ПолучитьНаборЗначенийИзТекстовойСтрокиТаблицы(ТекстТаблицы, НомерСтроки); Если МассивЗначений = Неопределено Тогда Прервать; КонецЕсли; - Ожидаем.Что(МассивЗначений, СтрШаблон("Неверное количество строк из таблицы примеров. Текст %1", ТекстПримеров)).ИмеетДлину(МассивИменКолонок.Количество()); + Ожидаем.Что(МассивЗначений, СтрШаблон("Получили неверное количество строк из таблицы. Текст %1", ТекстТаблицы)).ИмеетДлину(МассивЗначенийПервойСтроки.Количество()); НоваяСтрока = РезТаблица.Добавить(); - Для к = 0 По МассивЗначений.Количество() - 1 Цикл - ЗначениеПараметра = МассивЗначений[к]; - - //пытаемся привести к одному значению, все значения, кроме строки. Например, число, дата - НайденныеПараметры = СоздатьТаблицуПараметров(); - ВыделитьПростыеЗначенияНеСтроки(ЗначениеПараметра, НайденныеПараметры); - Если НайденныеПараметры.Количество() = 1 Тогда - ЗначениеПараметра = НайденныеПараметры[0].Значение; - КонецЕсли; - - Лог.Отладка(СтрШаблон("номер строки %3, значение из колонки %1 (для подстановки из таблицы) <%2>", к, ЗначениеПараметра, НомерСтроки-1)); - НоваяСтрока[к] = ЗначениеПараметра; - КонецЦикла; + ЗаполнитьСтрокуТаблицы(МассивЗначений, НоваяСтрока, НомерСтроки); КонецЦикла; Возврат РезТаблица; -КонецФункции // ПолучитьТаблицуПримеров(УзелПримеры) +КонецФункции // ПолучитьТаблицу(Тело) + +Функция ПолучитьНаборЗначенийИзТекстовойСтрокиТаблицы(Знач ТекстТаблицы, Знач НомерСтроки) + СтрокаТекстовойТаблицы = СтрПолучитьСтроку(ТекстТаблицы, НомерСтроки); + Если НомерСтроки = 1 Тогда + Лог.Отладка(СтрШаблон("Первая СтрокаПримеров %1", СтрокаТекстовойТаблицы)); + Иначе + Лог.Отладка(СтрШаблон(" СтрокаПримеров №%2 %1", СтрокаТекстовойТаблицы, НомерСтроки-1)); + КонецЕсли; + МассивЗначений = ПолучитьНаборИзСтрокиТаблицы(СтрокаТекстовойТаблицы); + Возврат МассивЗначений; +КонецФункции // ПолучитьНаборЗначенийИзТекстовойСтрокиТаблицы() + +Процедура ЗаполнитьСтрокуТаблицы(Знач МассивЗначений, НоваяСтрока, Знач НомерСтроки) + Для к = 0 По МассивЗначений.Количество() - 1 Цикл + ЗначениеПараметра = МассивЗначений[к]; + + //пытаемся привести к одному значению, все значения, кроме строки. Например, число, дата + НайденныеПараметры = СоздатьТаблицуПараметров(); + ВыделитьПростыеЗначенияНеСтроки(ЗначениеПараметра, НайденныеПараметры); + Если НайденныеПараметры.Количество() = 1 Тогда + ЗначениеПараметра = НайденныеПараметры[0].Значение; + КонецЕсли; + + Лог.Отладка(СтрШаблон("номер строки %3, значение из колонки %1 (для подстановки из таблицы) <%2>", к, ЗначениеПараметра, НомерСтроки-1)); + НоваяСтрока[к] = ЗначениеПараметра; + КонецЦикла; +КонецПроцедуры + +Процедура ИспользоватьПервуюСтрокуКакИменаКолонокТаблицы(Таблица) + Ожидаем.Что(Таблица.Количество(), "Количество строк из таблицы примеров должно быть больше 1, а это не так").Больше(1); -Функция ПолучитьНаборПримеровИзСтрокиПримеров(Знач СтрокаПримеров) + ПерваяСтрока = Таблица[0]; + + Для НомерКолонки = 0 По Таблица.Колонки.Количество() - 1 Цикл + ИмяКолонки = ПерваяСтрока[НомерКолонки]; + Лог.Отладка(СтрШаблон("имя колонки %1 (для подстановки из таблицы) <%2>", НомерКолонки, ИмяКолонки)); + Колонка = Таблица.Колонки[НомерКолонки]; + Колонка.Заголовок = ИмяКолонки; + КонецЦикла; + Таблица.Удалить(0); +КонецПроцедуры // ИспользоватьПервуюСтрокуКакИменаКолонокТаблицы(Таблица) + +Функция ПолучитьНаборИзСтрокиТаблицы(Знач СтрокаТаблицы) РегулярноеВыражение = РегулярныеВыражения.ПараметрТаблицы; - КоллекцияГруппСовпадений = РегулярноеВыражение.НайтиСовпадения(СтрокаПримеров); + КоллекцияГруппСовпадений = РегулярноеВыражение.НайтиСовпадения(СтрокаТаблицы); Если КоллекцияГруппСовпадений.Количество() = 0 Тогда Возврат Неопределено; КонецЕсли; @@ -759,7 +822,7 @@ РезМассив.Добавить(ЗначениеПараметра); КонецЦикла; Возврат РезМассив; -КонецФункции // ПолучитьНаборПримеровИзСтрокиПримеров() +КонецФункции // ПолучитьНаборИзСтрокиТаблицы() Функция СоздатьНовыеСтрокиСценариевСПараметрамиИзПримеров(СтрокиДерева, Знач СчетчикСтрокиВДереве, Знач СтрокаДерева, Знач ТаблицаПримеров) МассивНовыхСтрок = Новый Массив; @@ -789,7 +852,7 @@ ЗначенияПараметров.Вставить(ИмяПараметра, СтрокаТаблицыПримеров[ИмяКолонки]); Лог.Отладка(СтрШаблон("представление колонки <%3>, значение колонки <%2>, ИмяКолонки из таблицы <%1>, тело узла - %4 ", - ИмяКолонки, СтрокаТаблицыПримеров[ИмяКолонки], ИмяПараметра, СтрокаДерева.Тело)); + ИмяКолонки, СтрокаТаблицыПримеров[ИмяКолонки], ИмяПараметра, СтрокаДерева.Тело)); КонецЦикла; Для каждого Параметр Из СтрокаДерева.Параметры Цикл Если Параметр.Тип <> ВозможныеКлючиПараметров.ПараметрДляТаблицы Тогда @@ -801,7 +864,7 @@ СтрокаДерева.Тело = СтрЗаменить(СтрокаДерева.Тело, "<"+ИмяПараметра+">", "<"+Параметр.Значение+">"); Лог.Отладка(СтрШаблон("ИмяПараметра из таблицы <%1>, новое значение <%2>, ЗначенияПараметров[ИмяПараметра] <%3>, тело узла - %4, тип %5 ", - ИмяПараметра, Параметр.Значение, ЗначенияПараметров[ИмяПараметра], СтрокаДерева.Тело, Параметр.Тип)); + ИмяПараметра, Параметр.Значение, ЗначенияПараметров[ИмяПараметра], СтрокаДерева.Тело, Параметр.Тип)); КонецЦикла; КонецЕсли; Для каждого ПодчиненнаяСтрока Из СтрокаДерева.Строки Цикл @@ -923,11 +986,29 @@ КонецФункции // НайтиПозициюПервогоНепробельногоСимвола() +Функция ПолучитьТелоТаблицыДанных(Фича, ОчереднаяСтрока) + Рез = ОчереднаяСтрока; + Пока Истина Цикл + ОчереднаяСтрока = ПолучитьОчереднуюСтрокуФичи(Фича, Ложь); + Если ОчереднаяСтрока = Неопределено Тогда + Прервать; + КонецЕсли; + ОчереднаяСтрока = СокрЛП(ОчереднаяСтрока); + + Если Лев(ОчереднаяСтрока, 1) <> ВозможныеТипыНачалаСтроки.Таблица Тогда + Фича.ВернутьсяНаСтрокуНазад(); + Прервать; + КонецЕсли; + Рез = Рез + Символы.ПС + ОчереднаяСтрока; + КонецЦикла; + Возврат Рез; +КонецФункции // ПолучитьТелоТаблицыДанных(Фича) + Функция ВозможныеТипыНачалаСтроки() Рез = Новый Структура; Рез.Вставить("Комментарий", "#"); Рез.Вставить("Метка", "@"); - Рез.Вставить("Пример", "|"); + Рез.Вставить("Таблица", "|"); Рез.Вставить("ОбычныйТекст", 1); Рез.Вставить("МногострочныйТекст", """"""""); Возврат Новый ФиксированнаяСтруктура(Рез); From 641eb25845121a1bbd6b6a31caeed9f12dc9371e Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 31 Jul 2016 22:47:41 +0300 Subject: [PATCH 53/56] =?UTF-8?q?=D0=94=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3?= =?UTF-8?q?=D0=B0,=20=D0=B2=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D0=BE=D0=BC?= =?UTF-8?q?=20=D0=B5=D1=81=D1=82=D1=8C=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D0=B0=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85,=20=D0=B2?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D0=B8=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D1=81=D1=8F=20=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=88=D0=B0=D0=B3=D0=B0=20=D0=B8=20=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20#11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gherkin-read.os | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/gherkin-read.os b/src/gherkin-read.os index 05fce97..88b912e 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -200,11 +200,9 @@ Лог.Отладка("Очередная строка фичи <"+ОчереднаяСтрока+">"); ПредыдущиеПараметрыЛексемы.ЕстьТелоТаблицы = Истина; - ПредыдущиеПараметрыЛексемы.ТелоТаблицы = ПолучитьТелоТаблицыДанных(Фича, ОчереднаяСтрока); + ПредыдущиеПараметрыЛексемы.ДопТело = ПолучитьТелоТаблицыДанных(Фича, ОчереднаяСтрока); - // ПраваяЧасть = ПредыдущиеПараметрыЛексемы.ПраваяЧасть + ?(ПустаяСтрока(ПредыдущиеПараметрыЛексемы.ПраваяЧасть), "", Символы.ПС); - // ПредыдущиеПараметрыЛексемы.ПраваяЧасть = ПраваяЧасть + ПредыдущиеПараметрыЛексемы.ТелоТаблицы; - Лог.Отладка("Добавляю таблицу данных как часть предыдущей лексемы. Тело <%1>", ПредыдущиеПараметрыЛексемы.ТелоТаблицы); + Лог.Отладка("Добавляю таблицу данных как часть предыдущей лексемы. Тело <%1>", ПредыдущиеПараметрыЛексемы.ДопТело); Продолжить; ИначеЕсли Лев(ОчереднаяСтрока, ДлинаСтрокиНачалаМногострочногоТекста) = ВозможныеТипыНачалаСтроки.МногострочныйТекст Тогда @@ -255,8 +253,8 @@ Рез.Вставить("Лексема", Неопределено); Рез.Вставить("ПраваяЧасть", ""); Рез.Вставить("ДалееБудутДополнительныеСтроки", Ложь); + Рез.Вставить("ДопТело", ""); Рез.Вставить("ЕстьТелоТаблицы", Ложь); - Рез.Вставить("ТелоТаблицы", ""); СтрокаДляПоиска = НРег(Строка); Для каждого КлючЗначение Из СоответствиеКлючевыеСлова Цикл @@ -367,16 +365,20 @@ НайденныеПараметры = Неопределено; ПараметрыДляТаблицы = Неопределено; ЕстьПараметрыДляТаблицы = Ложь; - НоваяПраваяЧасть = ИзвлечьПараметры(ПараметрыОчереднойЛексемы, НайденныеПараметры, ПараметрыДляТаблицы, ЕстьПараметрыДляТаблицы); - Лог.Отладка("НоваяПраваяЧасть "+НоваяПраваяЧасть); + ПраваяЧастьСДобавленнымиКлючамиПараметров = ИзвлечьПараметры(ПараметрыОчереднойЛексемы, НайденныеПараметры, ПараметрыДляТаблицы, ЕстьПараметрыДляТаблицы); + Лог.Отладка("ПраваяЧастьСДобавленнымиКлючамиПараметров "+ПраваяЧастьСДобавленнымиКлючамиПараметров); - НоваяСтрока = ЗаполнитьУзелДереваФич(СтрокиДерева, ОчереднаяЛексема, ПараметрыОчереднойЛексемы.ПраваяЧасть); + ПолнаяПраваяЧасть = ПараметрыОчереднойЛексемы.ПраваяЧасть; + Если Не ПустаяСтрока(ПараметрыОчереднойЛексемы.ДопТело) Тогда + ПолнаяПраваяЧасть = ПолнаяПраваяЧасть + Символы.ПС + ПараметрыОчереднойЛексемы.ДопТело; + КонецЕсли; + НоваяСтрока = ЗаполнитьУзелДереваФич(СтрокиДерева, ОчереднаяЛексема, ПолнаяПраваяЧасть); Лог.Отладка("НоваяСтрока.Лексема <"+НоваяСтрока.Лексема+">"); НоваяСтрока.Параметры = НайденныеПараметры; НоваяСтрока.ПараметрыДляТаблицы = ПараметрыДляТаблицы; НоваяСтрока.ЕстьПараметрыДляТаблицы = ЕстьПараметрыДляТаблицы; НоваяСтрока.ТипШага = ПолучитьТипШагаПоЛексеме(ОчереднаяЛексема); - НоваяСтрока.АдресШага = СформироватьАдресШага(НоваяПраваяЧасть); + НоваяСтрока.АдресШага = СформироватьАдресШага(ПраваяЧастьСДобавленнымиКлючамиПараметров); НоваяСтрока.УровеньЛексемы = УровеньЛексемы; Индекс = Индекс + 1; @@ -445,7 +447,7 @@ Тело = ВыделитьПараметрыДляПодстановкиТаблицы(Тело, НайденныеПараметры, ЕстьПараметрыДляТаблицы); Если ПараметрыЛексемы.ЕстьТелоТаблицы Тогда - Тело = СтрШаблон("%1 %2", Тело, ИзвлечьПараметрТаблица(ПараметрыЛексемы.ТелоТаблицы, НайденныеПараметры)); + Тело = СтрШаблон("%1 %2", Тело, ИзвлечьПараметрТаблица(ПараметрыЛексемы.ДопТело, НайденныеПараметры)); Лог.Отладка("Тело после извлечения параметра-таблицы %1", Тело); КонецЕсли; From 6aafed7f13ac0cffea0dd533bbc23234a97bee82 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 31 Jul 2016 22:55:09 +0300 Subject: [PATCH 54/56] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=B0=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B8=D0=BC=D0=B5=D0=BD=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2-=D1=82=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D1=86=20#11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bdd-generate.os | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bdd-generate.os b/src/bdd-generate.os index 4950f1d..8efce5b 100644 --- a/src/bdd-generate.os +++ b/src/bdd-generate.os @@ -495,6 +495,7 @@ Рез.Вставить(ВозможныеКлючиПараметров.Число, "ПарамЧисло"); Рез.Вставить(ВозможныеКлючиПараметров.Дата, "ПарамДата"); Рез.Вставить(ВозможныеКлючиПараметров.ПараметрДляТаблицы, "Парам"); + Рез.Вставить(ВозможныеКлючиПараметров.Таблица, "ПарамТаблица"); Возврат Рез; КонецФункции // ВозможныеПредставленияТиповПараметров() From 5aa18da40c12fa48ce716024e08ce1219fca1e0c Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 31 Jul 2016 23:23:17 +0300 Subject: [PATCH 55/56] =?UTF-8?q?=D0=A3=D0=B2=D0=B5=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20=D0=BF=D1=80=D0=B8=20=D0=B0=D0=BD=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B5=20=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D1=87=D0=BD=D1=8B=D1=85=20=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=B7=D0=B0=20=D1=81=D1=87=D0=B5=D1=82=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=B5?= =?UTF-8?q?=D1=88=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gherkin-read.os | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gherkin-read.os b/src/gherkin-read.os index 88b912e..69fbd82 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -208,6 +208,8 @@ ИначеЕсли Лев(ОчереднаяСтрока, ДлинаСтрокиНачалаМногострочногоТекста) = ВозможныеТипыНачалаСтроки.МногострочныйТекст Тогда Лог.Отладка("Очередная строка фичи <"+ОчереднаяСтрока+">"); + ПредыдущиеПараметрыЛексемы.ЕстьМногострочнаяСтрока = Истина; + ПраваяЧасть = ПредыдущиеПараметрыЛексемы.ПраваяЧасть + ?(ПустаяСтрока(ПредыдущиеПараметрыЛексемы.ПраваяЧасть), "", Символы.ПС); ПредыдущиеПараметрыЛексемы.ПраваяЧасть = ПраваяЧасть + ПолучитьМногострочныйТекст(Фича); Лог.Отладка("Добавляю многострочный текст как часть предыдущей лексемы. Тело "+ПредыдущиеПараметрыЛексемы.ПраваяЧасть); @@ -255,6 +257,7 @@ Рез.Вставить("ДалееБудутДополнительныеСтроки", Ложь); Рез.Вставить("ДопТело", ""); Рез.Вставить("ЕстьТелоТаблицы", Ложь); + Рез.Вставить("ЕстьМногострочнаяСтрока", Ложь); СтрокаДляПоиска = НРег(Строка); Для каждого КлючЗначение Из СоответствиеКлючевыеСлова Цикл @@ -450,8 +453,9 @@ Тело = СтрШаблон("%1 %2", Тело, ИзвлечьПараметрТаблица(ПараметрыЛексемы.ДопТело, НайденныеПараметры)); Лог.Отладка("Тело после извлечения параметра-таблицы %1", Тело); КонецЕсли; - - Тело = ВыделитьПараметрыИзМногострочногоТекста(Тело, НайденныеПараметры); + Если ПараметрыЛексемы.ЕстьМногострочнаяСтрока Тогда + Тело = ВыделитьПараметрыИзМногострочногоТекста(Тело, НайденныеПараметры); + КонецЕсли; Тело = ВыделитьСтроковыеПараметры(Тело, НайденныеПараметры, "'"); Тело = ВыделитьСтроковыеПараметры(Тело, НайденныеПараметры, """"); From 91990b4b14ee0e4f6b5fc351b933b7e6092821a7 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 31 Jul 2016 23:35:45 +0300 Subject: [PATCH 56/56] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D0=B8=D1=8F=200.?= =?UTF-8?q?9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++---------- src/bdd.os | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b1c1ccd..f8a151e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # 1BDD для OneScript -1bdd - инструмент для выполнения автоматизированных требований/тестов, написанных на обычном, не программном языке. +`1bdd` - инструмент для выполнения автоматизированных требований/тестов, написанных на обычном, не программном языке. -Иными словами, это консольный фреймворк, реализующий BDD для проекта [OneScript](https://github.com/EvilBeaver/OneScript). +Иными словами, это консольный фреймворк, реализующий `BDD` для проекта [OneScript](https://github.com/EvilBeaver/OneScript). Идеи черпаются из проекта [Cucumber](https://cucumber.io). @@ -16,16 +16,12 @@ oscript bdd.os <команда> <параметры команды> [ключи] Возможные команды: [ключи] - Выполняет сценарии BDD для Gherkin-спецификаций - Параметры: - features-path - путь к файлам *.feature. - Можно указывать как каталоги, так и конкретные файлы. - + или exec [ключи] Выполняет сценарии BDD для Gherkin-спецификаций Параметры: features-path - путь к файлам *.feature. - Можно указывать как каталог, так и конкретный файл. + Можно указывать как каталоги, так и конкретные файлы. gen [ключи] Создает заготовки шагов для указанных Gherkin-спецификаций @@ -48,11 +44,11 @@ oscript bdd.os <команда> <параметры команды> [ключи] # Формат файла шагов -Это обычный os-скрипт, который располагает в подкаталоге step_definitions относительно файла фичи. +Это обычный os-скрипт, который располагает в подкаталоге `step_definitions` относительно файла фичи. В этом файле должна быть служебная функция `ПолучитьСписокШагов`, которая возвращает массив всех шагов, заданных в этом скрипте. -Также внутри файла шагов могут располагаться специальные методы-обработчики (хуки) событий ПередЗапускомСценария/ПослеЗапускаСценария +Также внутри файла шагов могут располагаться специальные методы-обработчики (хуки) событий `ПередЗапускомСценария`/`ПослеЗапускаСценария` ## Пример файла шагов diff --git a/src/bdd.os b/src/bdd.os index b8e52e6..a1863b8 100644 --- a/src/bdd.os +++ b/src/bdd.os @@ -19,7 +19,7 @@ Перем СохраненныйТекущийКаталог; Функция Версия() - Возврат "0.8"; + Возврат "0.9"; КонецФункции // Версия() //{ Точка входа в приложение