Skip to content

Commit

Permalink
Добавлена параметризация тестов через аннотации (#44)
Browse files Browse the repository at this point in the history
* Параметрические тесты

* Бамп версии

* Замечания по ревью
  • Loading branch information
EvilBeaver authored Nov 8, 2023
1 parent fab1a56 commit 2443ac2
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 6 deletions.
108 changes: 104 additions & 4 deletions src/Классы/testrunner.os
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,7 @@
ТестыПеред = Новый Массив;
ТестыПеред.Добавить(ДополнительныйШаг);

ТестыПеред = ПрочитатьТестовыеСлучаиОбъектаИзАннотаций(ОписаниеТеста.ТестОбъект, СтрокаАннотации);
ТестыПеред = НайтиАннотированныеМетоды(ОписаниеТеста.ТестОбъект, СтрокаАннотации);

Если ТестыПеред = Неопределено Тогда
ТестыПеред = Новый Массив;
Expand Down Expand Up @@ -859,7 +859,7 @@
КонецФункции

Функция ВывестиОшибкуВыполненияТеста(СостояниеВыполнения, ПредставлениеОшибки, ОписаниеТеста, ТекстОшибки, ИнфоОшибки)
ИмяМетода = ОписаниеТеста.ИмяМетода;
ИмяМетода = ?(ЗначениеЗаполнено(ОписаниеТеста.Представление), ОписаниеТеста.Представление, ОписаниеТеста.ИмяМетода);

сообщение = ?(ПредставлениеОшибки = "", "", ПредставлениеОшибки + Символы.ПС) +
"Тест: <" + ИмяМетода + ">" + Символы.ПС +
Expand Down Expand Up @@ -1207,7 +1207,7 @@
Возврат МассивТестовыхСлучаев;
КонецЕсли;

МассивТестовыхСлучаев = ПрочитатьТестовыеСлучаиОбъектаИзАннотаций(ТестОбъект, "тест");
МассивТестовыхСлучаев = НайтиАннотированныеТесты(ТестОбъект);

Возврат МассивТестовыхСлучаев;
КонецФункции
Expand Down Expand Up @@ -1256,7 +1256,7 @@
// Возвращаемое значение:
// Массив - массив строк-имен методов тестового сценария
//
Функция ПрочитатьТестовыеСлучаиОбъектаИзАннотаций(Знач ТестОбъект, Аннотация)
Функция НайтиАннотированныеМетоды(Знач ТестОбъект, Аннотация)

ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(ТестОбъект);
Если ТаблицаМетодов.Колонки.Найти("Аннотации") = Неопределено Тогда
Expand All @@ -1277,6 +1277,106 @@
Возврат МассивТестовыхСлучаев;
КонецФункции

Функция НайтиАннотированныеТесты(Знач ТестОбъект)

ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(ТестОбъект);
Если ТаблицаМетодов.Колонки.Найти("Аннотации") = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;

ИмяАннотацииТест = "тест";
МассивТестовыхСлучаев = Новый Массив;
Для Каждого МетодКласса Из ТаблицаМетодов Цикл

Если МетодКласса.Аннотации = Неопределено Тогда
Продолжить;
КонецЕсли;

ЭтоТест = ЕстьАннотация(МетодКласса.Аннотации, ИмяАннотацииТест);

Если ЭтоТест Тогда
ТестовыеСлучаи = ОписаниеТестаПоАннотации(
МетодКласса.Имя,
МетодКласса.КоличествоПараметров,
МетодКласса.Аннотации);

Если ТипЗнч(ТестовыеСлучаи) = Тип("Строка") Тогда
МассивТестовыхСлучаев.Добавить(ТестовыеСлучаи);
Иначе
Для Каждого Случай Из ТестовыеСлучаи Цикл
МассивТестовыхСлучаев.Добавить(Случай);
КонецЦикла;
КонецЕсли;
КонецЕсли;

КонецЦикла;

Возврат МассивТестовыхСлучаев;

КонецФункции

Функция НайтиАннотации(Знач Таблица, Знач ИмяАннотации)
Результат = Новый Массив;
Для Каждого СтрАннотация Из Таблица Цикл
Если ВРег(СтрАннотация.Имя) = ВРег(ИмяАннотации) Тогда
Результат.Добавить(СтрАннотация);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции

Функция ЕстьАннотация(Знач Таблица, Знач ИмяАннотации)
Возврат НайтиАннотации(Таблица, ИмяАннотации).Количество() <> 0;
КонецФункции

Функция ОписаниеТестаПоАннотации(Знач ИмяМетода, Знач КоличествоПараметров, Знач Аннотации)

ИмяАннотацииПараметры = "параметры";
СтрокиАннотаций = НайтиАннотации(Аннотации, ИмяАннотацииПараметры);
Если СтрокиАннотаций.Количество() = 0 Тогда
Возврат ИмяМетода; // не параметризованный тест
КонецЕсли;

ТестовыеСлучаи = Новый Массив;
Для Каждого ВариантТеста Из СтрокиАннотаций Цикл

ПараметрыАннотации = ВариантТеста.Параметры;
Если Не ПараметрыАннотации.Количество() Тогда
ВызватьИсключение СтрШаблон("Неверное применение аннотации %1 на методе %2. Не заданы параметры",
ИмяАннотацииПараметры,
ИмяМетода);
КонецЕсли;

Если ПараметрыАннотации.Количество() <> КоличествоПараметров Тогда
ВызватьИсключение СтрШаблон("Неверное применение аннотации %1 на методе %2. Не совпадает число параметров в методе и в аннотации",
ИмяАннотацииПараметры,
ИмяМетода);
КонецЕсли;

ЗначенияПараметров = Новый Массив;
Для Каждого Параметр Из ПараметрыАннотации Цикл
Если Параметр.Имя <> Неопределено Тогда
// Тут можно сделать что-то типа method-source, но не сегодня
ВызватьИсключение СтрШаблон("Неверное применение аннотации %1 на методе %2. Ожидаются параметры-значения, без имен",
ИмяАннотацииПараметры,
ИмяМетода);
КонецЕсли;

ЗначенияПараметров.Добавить(Параметр.Значение);
КонецЦикла;

Случай = Новый Структура("ИмяТеста,Параметры,Представление",
ИмяМетода,
ЗначенияПараметров,
СтрШаблон("%1(%2)", ИмяМетода, СтрСоединить(ЗначенияПараметров, ","))
);
ТестовыеСлучаи.Добавить(Случай);
КонецЦикла;

Возврат ТестовыеСлучаи;

КонецФункции

Процедура ДополнитьМассивПоАннотациям(ВхМассив, ТестовыйСлучай, ИмяАннотация)

Если ТестовыйСлучай.Аннотации = Неопределено Тогда
Expand Down
2 changes: 1 addition & 1 deletion src/Модули/Константы_1testrunner.os
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

///////////////////////////////////////////////////////////////

ВерсияПродукта = "1.8.0";
ВерсияПродукта = "1.9.0";
11 changes: 10 additions & 1 deletion tests/fixtures/annotation.os
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,21 @@
Ожидаем.Что(Счетчик.Количество()).Равно(2);
КонецПроцедуры


&тесТ
Процедура ТестДолжен_ПроверитьВерсиюЕщеРаз() Экспорт
Утверждения.ПроверитьРавенство("0.1", Версия());
КонецПроцедуры

&Тест
&Параметры(1, 2, Ложь)
&Параметры(1, 1, Истина)
&Параметры("10", "10", Истина)
&Параметры(65465, "10", Ложь)
Процедура ТестДолжен_ВыполнитьсяСПараметрами(ПервоеЗначение, ВтороеЗначение, Ожидание) Экспорт
Результат = (ПервоеЗначение = ВтороеЗначение);
Утверждения.ПроверитьРавенство(Ожидание, Результат);
КонецПроцедуры

Функция Версия()
Возврат "0.1";
КонецФункции

0 comments on commit 2443ac2

Please sign in to comment.