Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наследование и аннотации 
V
    Опции темы
priam220
Дата 6.7.2010, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



testng/selenium. Есть три очень похожих тестовых класса. Они отличаются одним методом. Достаточно часто вижу как решение этой задачи применение наследования. Но есть два но:
1. Аннотации не наследуются в java ( хотя на практике аннотируемый и наследуемый код продолжает работать, почему-то, при условии если они не дублируются в наследнике).
2. замечания эккеля по поводу приимущества композиции перед наследованием.
В связи с чем у меня возникла такая идея:
Есть  НЕ тестовый класс А, содержащий логику:
Код

class A
{
public gesture1()
{
...
}
public gesture2()
{
...
}
}

 
и тестовые классы B и C:
Код

classB
{
A a = new A();
@Test
public gesture1()
{
a.gesture1();
}
@Test
public gesture2()
{
a.gesture2();
}
@Test
public gesture3()
{
//свой метод
}
}


ну и С такой же как и B только со своим методом . Мне кажется такой подход проще.
Как вы думаете, какую схему реализации применить и почему?


Это сообщение отредактировал(а) powerOn - 7.7.2010, 09:03
PM MAIL   Вверх
powerOn
Дата 7.7.2010, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 1
Всего: 159



Цитата(priam220 @  7.7.2010,  00:05 Найти цитируемый пост)
testng/selenium. Есть три очень похожих тестовых класса. Они отличаются одним методом. Достаточно часто вижу как решение этой задачи применение наследования.


Какой задачи? Каким методом?


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
priam220
Дата 7.7.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



powerOn,  три одинаковые тестовые класса. Почти одинаковые. У них есть одно маленькое различие, скажем в одном ТЕСТОВОМ методе (@Test - тест помеченный такой аннотацией, я называю тестовым). Если ты писал тесты с использованием junit или testng, то должен понимать о чем я.
Для того что бы не дублировать код, часто вижу применение наследования. Очевидно, что задача наследования несколько другая, чем просто спавляться с дублированием кода, особенно становится не понятным его использование при наличии аннотаций. Так же учитывая аргументы предыдущего моего поста, мне интересно, не правильнее ли будет обойтись без наследования, описанным мною в начале способом. 
Очень надеюсь, что понятно, ибо мой творческий талант уже на исходе. )
PM MAIL   Вверх
powerOn
Дата 7.7.2010, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 1
Всего: 159



все зависит от того что за маленькое различие такое. приведи код.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
priam220
Дата 7.7.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



Хм... ну код Вам ничего не даст, он специфичен и может меняться от случая к случаю, смысл же вопроса не в этом.
Пусть, скажем в gesture3() В одном случае (класс B) будет вызов фабрики по созданию объекта с одним набором свойств, а в классе С - с другим. 
Кода нет, как вы понимаете, его я и пытаюсь написать. Не знаю только как лучше.

PM MAIL   Вверх
powerOn
Дата 7.7.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 1
Всего: 159



Цитата(priam220 @  7.7.2010,  13:29 Найти цитируемый пост)
В одном случае (класс B) будет вызов фабрики по созданию объекта с одним набором свойств, а в классе С - с другим. 


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

Такой прием описан в книге Refactoring To Patterns, главу которая содержит описание примера Introduce Polymorphic Creation with Factory Method можно скачать тут.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
priam220
Дата 7.7.2010, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



Спасибо, обязательно прочитаю. А как быть с аннотациями testng, ведь они не должны наследоваться. А это необходимо, скажем при указании зависимостей.
PM MAIL   Вверх
powerOn
Дата 7.7.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 1
Всего: 159



Цитата(priam220 @  7.7.2010,  13:53 Найти цитируемый пост)
А как быть с аннотациями testng, ведь они не должны наследоваться. 


Что значит не должны? Если в базовом классе объявить метод с @Test, то он будет выполнен при запуске тестов дочернего класса.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
priam220
Дата 7.7.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



Точно, не понятно правда почему, ведь аннотации не наследуются в java.
PM MAIL   Вверх
priam220
Дата 7.7.2010, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



кажется я понял о каком паттерне идет речь. Он требует реализации еще одной ветки наследуемой абстракции: интерфейса плюс пара стратегий. Это очень громоздко и не оправдано, мне кажется. Для реализации 3 классов мы получается вводим еще 5! (сам радительский класс, интерфейс(абстрактный класс), плюс реализации абстракций этого интерфеса на все 3 класса). В моем случае, это не оправдано. Но и от дублирования кода хочется избавиться.
PM MAIL   Вверх
powerOn
Дата 7.7.2010, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 1
Всего: 159



еще можно псмотреть Parameters dataproviders, если у вас TestNG



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
priam220
Дата 7.7.2010, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



а... вводом параметра. Гуд, тем более тестинг все таки... Да можно так. Если различие в строке только - то ок, так и делаю. Но тут вот отличается создаваемыми экземплярами, плюс выяснилось что надо кое что еще поменять в потомке, т.е. потребуется много ветвлений. 
а что вы думаете о предложенном мною варианте - без наследования. Спрятать в один класс без всяких аннотаций, и использовать как класс инструментов.  А анноитровать уже те классы, которые мы хотим использовать как потомки ( при выборе наследования)   Чем это плохо? 
И еще хотелось бы услышать дельный совет по поводу аннотаций, действительно. Аннотации не наследуются в java, но последовательность методов работает правильно, следовательно аннотации наследуются. Или я чего то не понимаю?
2 вопроса, хотелось бы услышать 2 ответа.  smile 
PM MAIL   Вверх
powerOn
Дата 7.7.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 1
Всего: 159



Цитата(priam220 @  7.7.2010,  15:13 Найти цитируемый пост)
а что вы думаете о предложенном мною варианте - без наследования. Спрятать в один класс без всяких аннотаций, и использовать как класс инструментов.  А анноитровать уже те классы, которые мы хотим использовать как потомки ( при выборе наследования)   Чем это плохо? 


Думаю, что много дупликации кода, поскольку есть схожесть в вызовах, а разница только в данных. Это похоже на code smell Combinatorial Explosion (тут есть описание).

Добавлено через 6 минут и 51 секунду
Цитата(priam220 @  7.7.2010,  15:13 Найти цитируемый пост)
Аннотации не наследуются в java, но последовательность методов работает правильно, следовательно аннотации наследуются. Или я чего то не понимаю?


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


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
priam220
Дата 7.7.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



я так понял, что для наследования аннотации оная должна содержать мета-аннотацию Inherited, если так то вот это не понятно:

If an Inherited meta-annotation is present on an annotation type declaration....
открываю аннотацию @Test:

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({METHOD, TYPE, CONSTRUCTOR})
public @interface Test {
  /**

я не вижу такой мета-аннотации.

Note that this meta-annotation type has no effect if the annotated type is used to annotate anything other than a class
а если метод? 

Это сообщение отредактировал(а) priam220 - 7.7.2010, 15:22
PM MAIL   Вверх
powerOn
Дата 7.7.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 1
Всего: 159



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


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Design, Quality, Testing | Следующая тема »


 




[ Время генерации скрипта: 0.0619 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.