xUnitFor1C icon indicating copy to clipboard operation
xUnitFor1C copied to clipboard

При загрузке тестов/получении списка тестов тестам недоступен контекст тестового фреймворка

Open artbear opened this issue 10 years ago • 41 comments

При загрузке тестов/получении списка тестов тестам недоступен контекст тестового фреймворка Т.е. при вызове ПолучитьСписокТестов при загрузке теста нет возможности обратиться к методам юТест и к методам плагинов.

А это бывает крайне полезно. Например, в некоторых моих тестах используется этот функционал, т.к. в 3.Х ПолучитьСписокТестов(КонтекстЯдра) выполнял роль инициализации. Уверен, что и у других пользователей есть подобные примеры.

Поэтому предлагаю добавить этот функционал и в 4.0

Вижу варианты: 1 При загрузке тестов всегда вызывать Инициализация(КонтекстЯдраПараметр)

2 Все-таки подумать о совместимости со старыми тестами и использовать ПолучитьСписокТестов(КонтекстЯдра) как и в 3.0, а Инициализация(КонтекстЯдраПараметр) сделать необязательным при наличии ПолучитьСписокТестов(КонтекстЯдра)

ИМХО в этом случае никаких старых тестов переделывать не нужно и 4.0 взлетит сразу :) А в документации укажем только новый вариант Инициализация(КонтекстЯдраПараметр) и ПолучитьСписокТестов()

@wizi4d что скажешь?

artbear avatar Nov 16 '15 17:11 artbear

Я не совсем понял. Зачем при получении списка тестов контекст ядра? Расшифруй пожалуйста свое "удобно", желательно в конкретных кейсах.

20:25, Пн, 16.11.2015, Artur Ayukhanov [email protected]:

Assigned #557 https://github.com/xDrivenDevelopment/xUnitFor1C/issues/557 to @wizi4d https://github.com/wizi4d.

— Reply to this email directly or view it on GitHub https://github.com/xDrivenDevelopment/xUnitFor1C/issues/557#event-465682623 .

wizi4d avatar Nov 17 '15 06:11 wizi4d

Совместимость в любом случае не взлетит, потому что ассерты и генерация данных - плагины и требуют изменения кода тестов.

9:49, Вт, 17.11.2015, Evgeniy Pavlyuk [email protected]:

Я не совсем понял. Зачем при получении списка тестов контекст ядра? Расшифруй пожалуйста свое "удобно", желательно в конкретных кейсах.

20:25, Пн, 16.11.2015, Artur Ayukhanov [email protected]:

Assigned #557 https://github.com/xDrivenDevelopment/xUnitFor1C/issues/557 to @wizi4d https://github.com/wizi4d.

— Reply to this email directly or view it on GitHub https://github.com/xDrivenDevelopment/xUnitFor1C/issues/557#event-465682623 .

wizi4d avatar Nov 17 '15 06:11 wizi4d

+1 к карме за обратную совместимость.

16 ноября 2015 г., 20:16 пользователь Artur Ayukhanov < [email protected]> написал:

При создании тестов тестам недоступен контекст тестового фреймворка Т.е. при вызове ПолучитьСписокТестов при загрузке теста нет возможности обратиться к методам юТест и к методам плагинов.

А это бывает крайне полезно. В некоторых моих тестах используется этот функционал, т.к. в 3.Х ПолучитьСписокТестов(КонтекстЯдра) выполнял роль инициализации.

Поэтому предлагаю добавить этот функционал и в 4.0

Вижу варианты: 1 При загрузке тестов всегда вызывать Инициализация(КонтекстЯдраПараметр)

2 Все-таки подумать о совместимости со старыми тестами и использовать ПолучитьСписокТестов(КонтекстЯдра) как и в 3.0, а Инициализация(КонтекстЯдраПараметр) сделать необязательным при наличии ПолучитьСписокТестов(КонтекстЯдра)

ИМХО в этом случае никаких старых тестов переделывать не нужно и 4.0 взлетит сразу :) А в документации укажем только новый вариант Инициализация(КонтекстЯдраПараметр) и ПолучитьСписокТестов()

@wizi4d https://github.com/wizi4d что скажешь?

— Reply to this email directly or view it on GitHub https://github.com/xDrivenDevelopment/xUnitFor1C/issues/557.

З повагою Сосна Євген, mailto:[email protected] skype:shenjasosna +380933897103

pumbaEO avatar Nov 17 '15 07:11 pumbaEO

1 При получении списка тестов контекст ядра нужен для возможности работы с ядром :) Фреймворк это же просто запускалка тестов, но и набор полезных функций/плагинов. А плагины нужны на этапе создания списка тестов Например, у меня есть тесты, в которых список тестов получается в зависимости от метаданных конфигурации. И еще вопрос - зачем нам плагины, которые можно вызывать только для непосредственного тестирования ? работа в режиме получения списка тестирования это также работа во фреймворке.

2 Инициализация должна выполняться всегда.

artbear avatar Nov 17 '15 07:11 artbear

Давайте по порядку.

Все-таки подумать о совместимости со старыми тестами

Обратной совместимости все равно не получится достичь, потому что раньше был всего 1 контекст юТест, теперь же контексты ядра, утверждений и генерации данных это 3 разных контекста, которые в одну переменную ну никак не впихнуть.

При получении списка тестов контекст ядра нужен для возможности работы с ядром

  1. Я просил конкретные кейсы, а получаю абстрактные утверждения, что это просто нужно. Давай cформулируем пользовательскую историю по шаблону "Как X Я хочу Y Чтобы Z". Как ты понимаешь, мне очень интересно то, чему будет равен Z.
  2. Прошу принять во внимание, что я по максимуму следую принципу единой обязанности. Пока же я вижу, что есть попытка этот принцип нарушить.

wizi4d avatar Nov 18 '15 08:11 wizi4d

Я думаю о хотя бы частичной обратной совместимости при переходе на 4.0 Сейчас при переходе на 4.0 очень серьезная потеря совместимости. Очень много тестов придется менять, только у меня под 2 тысячи тестов, сто с лишним файлов тестов :( Хочется как-то облегчить процесс перехода на 4.0, нужно поддержать своих пользователей и упростить им переход. Иначе может сложиться ситуация, что народ останется на 3.Х :(

Поэтому я решил заняться конвертером тестов из 3.Х в 4

artbear avatar Nov 18 '15 08:11 artbear

Конвертер дело хорошее. Правда с этой темой никак не связан :smile: Если живых кейсов нет либо они приведут к нарушению принципа единой обязанности, то предлагаю задачу закрыть.

wizi4d avatar Nov 18 '15 09:11 wizi4d

По получению списка тестов и контексту ядра В новом варианте (4х) у теста получается 2 состояния - работа в режиме тестирования и работа в режиме получения списка тестов. Код инициализации этих состояний разный :( в одном случае вызывается Инициализация, в другом нет. Почему так? я в первую очередь против этого

artbear avatar Nov 18 '15 10:11 artbear

Ты меня не понял, я не призываю нарушить принцип единой обязанности. Каждый метод выполняет свою функцию - Инициализация инициализирует тест, ПолучитьСписокТестов получает список. Я против двойного входа по созданию тестов, когда в одном случае вызывается Инициализация, в другом нет.

artbear avatar Nov 18 '15 10:11 artbear

Никаких режимов тестирования и получения списка тестов нет. Есть просто метод получения списка тестов. Инъекция зависимости может быть осуществлена через параметр, если это реально нужно, но я не представляю ситуацию, когда для получения списка тестов может понадобиться прям контекст ядра. Инъекция зависимости должна быть строго в соответствии с требуемой абстракцией, например, как сделано в новом интерфейсе по получению списка тестов.

wizi4d avatar Nov 18 '15 11:11 wizi4d

По кругу ходим :disappointed: Давай cформулируем пользовательскую историю по шаблону "Как X Я хочу Y Чтобы Z" Я даже начну, чтобы помочь.

КАК пользователь xUnitFor1C Я ХОЧУ чтобы всегда вызывался метод Инициализация у тестовой обработки ЧТОБЫ ...

Собственно чтобы что?

wizi4d avatar Nov 18 '15 11:11 wizi4d

Конечно, ходим:(

Чтобы в коде теста ВСЕГДА иметь доступ ко всей мощи фреймворка xUnitFor1C

artbear avatar Nov 18 '15 11:11 artbear

Есть игра в 5 "Почему?", я ее превращу в 5 "Чтобы что?" :smile:

КАК пользователь xUnitFor1C Я ХОЧУ при получении списка тестов иметь доступ ко всей мощи xUnitFor1C ЧТОБЫ ... что?

wizi4d avatar Nov 18 '15 13:11 wizi4d

У меня кейсов нет, и пока не придумывается ни одного. Артур написал, цитирую: "Например, в некоторых моих тестах используется этот функционал...". Артур, можешь описать кейс по одному из существующих тестов (лучше по трем)? Сейчас пока более понятна позиция Евгения.

rsyuzyov avatar Nov 18 '15 14:11 rsyuzyov

Еще одна попытка :(

У фреймворка есть куча полезных методов. при получении списка тестов в моих тестах используются утверждения + методы получения информации из базы данных, например, ПолучитьЭлементыМетаданногоПоОтбору или ПолучитьКоличествоЭлементовСправочникаПоОтбору

я люблю защитное программирование и утверждения использую часто. Отсутствие доступа к утверждениям из-за отсутствия контекст фреймворка меня сильно напрягает, тем более, что сейчас это искусственное ограничение.

ЗЫ начинает надоедать это бессмысленное перекидывание мячика туда/обратно :(

artbear avatar Nov 19 '15 06:11 artbear

Последнее предложение - добавляем параметр КонтекстЯдраПараметр в ПолучитьСписокТестов() и ЗаполнитьНаборТестов(Набор)

artbear avatar Nov 19 '15 06:11 artbear

Ты по прежнему не отвечаешь на прямой вопрос, "зачем тебе это?". Реальный кейс так и не описываешь.

В каких случаях ты используешь то, что описал? А именно:

  • Когда тебе нужны утверждения при получении списка тестов?
  • Когда тебе нужны какие-то специфические методы ядра или плагинов? (btw приведенных тобой методов в новой версии фреймворка нет, по крайней мере я их туда не добавлял)
  • Не нарушает ли это принцип единой обязанности?

wizi4d avatar Nov 19 '15 07:11 wizi4d

Важно!!! Я хочу понять, какая цель/потребность у того, что ты просишь сделать. Когда станет понятна цель, будем думать, как ее достичь.

Пока же это как в классических проблемах с заказчиками, когда они проходят с готовыми решениями, но не озвучивают своей цели/потребности.

wizi4d avatar Nov 19 '15 07:11 wizi4d

я люблю защитное программирование и утверждения использую часто. Отсутствие доступа к утверждениям из-за отсутствия контекст фреймворка меня сильно напрягает, тем более, что сейчас это искусственное ограничение.

Вот этого мало?

Слишком конкретный кейс я не хочу приводить, т.к. мы уйдем в детали реализации этого конкретного кейса и наверняка будут приведены обходные пути.

Далее я планирую выносить в плагины различные полезные общие методы для тестов, некий аналог библиотек. И вот эти общие методы/объекты должны быть доступны тестам на всех стадиях работы.

artbear avatar Nov 19 '15 07:11 artbear

Я понимаю, что 1С это не ООП в чистом виде. Но то, что ты хочешь - это сильное нарушение принципов SOLID.

wizi4d avatar Nov 19 '15 08:11 wizi4d

Ой, а можно я, можно я?! тянет руку

  1. Я хочу обратную совместимость в рамках "зафигачил старый тест и забыл" 1.1 - сейчас такая возможность есть, через необязательный параметр метода ПолучитьСписокТестов()
  2. Сейчас Инициализация и ПолучитьСписокТестов вызываются для одного и того же экземпляра обработки или для разных? Если Инициализация предшествует вызову ПолучитьСписок, то что мешает сохранить контекст ядра в переменную, а в получить список - его заюзать?
  3. Версия 4.0 не должна ничего передавать в ПолучитьСписокТестов, здесь я солидарен с @wizi4d. Это зло и пагубный путь. Говнокод только и ищет момент, когда будут допущены послабления контрактов, после чего хлынет рекой.

EvilBeaver avatar Nov 19 '15 15:11 EvilBeaver

@EvilBeaver я в первую очередь думаю о совместимости и программном интерфейсе.

1 и 3 у тебя противоречат друг другу :(

2 Инициализация сейчас вызывается только после запуска тестов на выполнение. в момент загрузки тестов (получения списка тестов) не вызывается.

Фишка в чем - ПолучитьСписокТестов не вызывается при запуске тестов на выполнение, т.к. дерево тестов сформировано заранее.

Мы как раз обозначаем, что тесты должны реализовать 2 разных публичных интерфейса для выполнения тестирования. Один интерфейс это загрузка тестов, второй - выполнение тестов. за работу в этих состояниях отвечают разные наборы методов. За загрузку отвечают ПолучитьСписокТестов или ЗаполнитьНаборТестов За выполнение - Инициализация, метод теста, ПередЗапускомТеста/ПослеЗапускаТеста и прочее.

В обоих случаях в методы инициализации разного поведения мы передаем контекст ядра для того, чтобы тесты могли полноценно пользоваться методами/объектами фреймворка тестирования.

ИМХО С точки зрения ООП и принципов проектирования все нормально.

artbear avatar Nov 19 '15 15:11 artbear

@artbear ничего у меня не противоречит. Это желания.

КАК пользователь xUnitFor1C Я ХОЧУ при переходе на версию 4 минимально доработать существующие тесты ЧТОБЫ не тратить время на кардинальную переработку

Ты же хочешь нарушить интерфейсы между модулями только потому, что у тебя ассерты стояли в методе получения списка и ты теперь не хочешь там ничего рефакторить.

В то же время, я склоняюсь к тому, чтобы метод Инициализировать вызывался не только перед прогоном тестов, но и вообще, при каждом создании экземпляра обработки со стороны ядра. Ну или пусть это будут два разных метода, но смысл такой, что предварительная инициализация - не такая уж плохая идея. Пусть, например (мысли вслух), будет событие "ПриСозданииОбработкиЯдром(КонтекстЯдра)"... ну или как-то там так... А?

EvilBeaver avatar Nov 19 '15 16:11 EvilBeaver

@EvilBeaver да, это один из двух путей, который я и предлагаю. Но мне немного не нравится, что здесь код Инициализации будет выполняться дважды - при загрузке тестов и при выполнении тестов. Я вижу, что код инициализации соответствует конструктору теста, который вызывается.

Меня на текущий момент устроит любой из 2х вариантов.

artbear avatar Nov 19 '15 16:11 artbear

КАК пользователь xUnitFor1C Я ХОЧУ при переходе на версию 4 минимально доработать существующие тесты ЧТОБЫ не тратить время на кардинальную переработку Ты же хочешь нарушить интерфейсы между модулями только потому, что у тебя ассерты стояли в методе получения списка и ты теперь не хочешь там ничего рефакторить.

Зря ты на меня наезжаешь, я как раз и думаю о совместимости. Я даже начал делать конвертер тестов 3.Х на 4 #518

artbear avatar Nov 19 '15 16:11 artbear

@artbear я не наезжаю, но я против поспешных решений. И я против того, чтобы в ПолучитьСписокТестов что либо передавалось, т.к. этот метод совсем про другое. У него другая ответственность ( @wizi4d ) Не надо его перегружать дополнительными смыслами.

EvilBeaver avatar Nov 19 '15 19:11 EvilBeaver

Я выше писал, что помню о договоренности вызывать Инициализацию всегда при создании объекта, неважно, в какой момент это происходит. Женя не хочет этого делать.

artbear avatar Nov 19 '15 20:11 artbear

@EvilBeaver

Сейчас Инициализация и ПолучитьСписокТестов вызываются для одного и того же экземпляра обработки или для разных? Если Инициализация предшествует вызову ПолучитьСписок, то что мешает сохранить контекст ядра в переменную, а в получить список - его заюзать?

Экземпляры разные.

Теперь для всех. Для бОльшего понимания, как все работает.

Наличие метода Инициализация обязательно для любых тестовых обработок, метод вызывается ядром, перед выполнением теста. О любых других методах ядро ничего не знает и знать не должно. Все остальное - требование конкретных загрузчиков. Так, метод ПолучитьСписокТестов - требование к программному интерфейсу тестовых обработок от загрузчика файлов для формирования дерева тестов.

Из этого следует, что это методы разных интерфейсов.

@artbear

Я выше писал, что помню о договоренности вызывать Инициализацию всегда при создании объекта, неважно, в какой момент это происходит. Женя не хочет этого делать.

Утверждение в корне не верно. Прежде чем хоть что-то делать, я всегда задаю вопрос "Чтобы что?", ты же меня знаешь. Это позволяет избежать ненужной работы. Я хочу понимать, какую цель/потребность ты преследуешь созданием этой задачи. Ты ведь не просто так это все затеял. Ну а пока цели не понятны, смысла предпринимать хоть какие-то телодвижения не вижу.

wizi4d avatar Nov 20 '15 07:11 wizi4d

Переливание из пустого в порожнее надоело.

artbear avatar Nov 20 '15 07:11 artbear

Можно и я выскажу свое имхо в таком интересном и драматичном обсуждении? Должен предупредить, что xUnitFor1C я не пользуюсь, как там все устроено, практически не знаю, и рассуждаю только исходя из прочитанного в этом обсуждении. Как мне кажется, основная проблема в том, что вы пытаетесь натянуть принципы ООП на разработку, написанную на языке, ООП не поддерживающем. Как я понимаю, тест у вас - это внешняя обработка, к которой вы хотите относится как к классу в ООП. Но у класса должны быть конструкторы/деструкторы. И как мне показалось из обсуждения, метод Инициализация() и является своеобразным конструктором. По крайней мере, имхо, @artbear к этому методу относится именно так. А вот @wizi4d относит этот метод всего лишь к одному из интерфейсов. Как мне думается, всякие конкретные загрузчики не должны создавать сами объект внешней обработки, они должны вызывать некий метод ядра для получения объекта теста, а внутри этого метода ядра должна создаваться внешняя обработка и вызываться Инициализация(). Образно говоря, загрузчики не должны сами делать malloc(), они должны делать new.

awa15 avatar Nov 20 '15 08:11 awa15