![]() |
|
Модераторы: LSD |
![]()
|
|
| priam220 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: нет Всего: 8 |
testng/selenium. Есть три очень похожих тестовых класса. Они отличаются одним методом. Достаточно часто вижу как решение этой задачи применение наследования. Но есть два но:
1. Аннотации не наследуются в java ( хотя на практике аннотируемый и наследуемый код продолжает работать, почему-то, при условии если они не дублируются в наследнике). 2. замечания эккеля по поводу приимущества композиции перед наследованием. В связи с чем у меня возникла такая идея: Есть НЕ тестовый класс А, содержащий логику:
и тестовые классы B и C:
ну и С такой же как и B только со своим методом . Мне кажется такой подход проще. Как вы думаете, какую схему реализации применить и почему? Это сообщение отредактировал(а) powerOn - 7.7.2010, 09:03 |
||||
|
|||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 1 Всего: 159 |
||||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: нет Всего: 8 |
powerOn, три одинаковые тестовые класса. Почти одинаковые. У них есть одно маленькое различие, скажем в одном ТЕСТОВОМ методе (@Test - тест помеченный такой аннотацией, я называю тестовым). Если ты писал тесты с использованием junit или testng, то должен понимать о чем я.
Для того что бы не дублировать код, часто вижу применение наследования. Очевидно, что задача наследования несколько другая, чем просто спавляться с дублированием кода, особенно становится не понятным его использование при наличии аннотаций. Так же учитывая аргументы предыдущего моего поста, мне интересно, не правильнее ли будет обойтись без наследования, описанным мною в начале способом. Очень надеюсь, что понятно, ибо мой творческий талант уже на исходе. ) |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 1 Всего: 159 |
все зависит от того что за маленькое различие такое. приведи код.
|
|||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: нет Всего: 8 |
Хм... ну код Вам ничего не даст, он специфичен и может меняться от случая к случаю, смысл же вопроса не в этом.
Пусть, скажем в gesture3() В одном случае (класс B) будет вызов фабрики по созданию объекта с одним набором свойств, а в классе С - с другим. Кода нет, как вы понимаете, его я и пытаюсь написать. Не знаю только как лучше. |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 1 Всего: 159 |
В таком случае имеет смысл применить наследование. Создать базовый абстрактный класс у которого будет поле (или геттер) с фабрикой и тесты. Все наследники при инициализации установят свой экземпляр фабрики в поле предка. Тесты из парента будут вызваны прикаждом выполнении наследника и будут использовать экземпляр фабрики зависимый от наследника. Такой прием описан в книге Refactoring To Patterns, главу которая содержит описание примера Introduce Polymorphic Creation with Factory Method можно скачать тут. |
|||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: нет Всего: 8 |
Спасибо, обязательно прочитаю. А как быть с аннотациями testng, ведь они не должны наследоваться. А это необходимо, скажем при указании зависимостей.
|
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 1 Всего: 159 |
||||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: нет Всего: 8 |
Точно, не понятно правда почему, ведь аннотации не наследуются в java.
|
|||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: нет Всего: 8 |
кажется я понял о каком паттерне идет речь. Он требует реализации еще одной ветки наследуемой абстракции: интерфейса плюс пара стратегий. Это очень громоздко и не оправдано, мне кажется. Для реализации 3 классов мы получается вводим еще 5! (сам радительский класс, интерфейс(абстрактный класс), плюс реализации абстракций этого интерфеса на все 3 класса). В моем случае, это не оправдано. Но и от дублирования кода хочется избавиться.
|
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 1 Всего: 159 |
||||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: нет Всего: 8 |
а... вводом параметра. Гуд, тем более тестинг все таки... Да можно так. Если различие в строке только - то ок, так и делаю. Но тут вот отличается создаваемыми экземплярами, плюс выяснилось что надо кое что еще поменять в потомке, т.е. потребуется много ветвлений.
а что вы думаете о предложенном мною варианте - без наследования. Спрятать в один класс без всяких аннотаций, и использовать как класс инструментов. А анноитровать уже те классы, которые мы хотим использовать как потомки ( при выборе наследования) Чем это плохо? И еще хотелось бы услышать дельный совет по поводу аннотаций, действительно. Аннотации не наследуются в java, но последовательность методов работает правильно, следовательно аннотации наследуются. Или я чего то не понимаю? 2 вопроса, хотелось бы услышать 2 ответа. |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 1 Всего: 159 |
Думаю, что много дупликации кода, поскольку есть схожесть в вызовах, а разница только в данных. Это похоже на code smell Combinatorial Explosion (тут есть описание). Добавлено через 6 минут и 51 секунду
Аннотации могут быть наследованны. Т.е. информация о ней может быть взята из метода суперкласса. |
|||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 1 Всего: 159 |
возможно такая фишка контролируется логикой TestNG фреймверка. Т.е. он умеет анализировать всю иерархию, для поиска тестовых методов.
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Design, Quality, Testing | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |