Как правильно выбрать сделать, чтобы исключить дублирование кода?
тесты пишутся под Java c Webdrver2
Задача: пройтись по определенным страницам доступные только залогиненым пользователям (Wishlist, Checkout, страницы в My Account и др.) и сделать их скриншоты.
По тех страницах, которые доступны не залогиненым пользователям - нет проблем, так как использую один класс, читаю список URL-ов из файла обхожу в цикле и делаю скрины . Но вот как только использую Webdriver для входа пользователя возникает проблема, так как для каждой страницы использую отдельный класс. Можно конечно это все замутить в одном классе. Но хочется красиво и думаю это будет часто встречаться в дальнейшем.
1 вариант: пишу тест для снятия скиншота для страницы Wishlist, где использую инициализацию драйвера:
profile.addExtension(new File(ff_extension));
driver = new FirefoxDriver(new FirefoxBinary(new File(ff_path)), profile);
и еще функцию снятия скриншота, и еще всякие переменные. И так должен делать для каждой страницы: Wishlist, MyOrders, MyAddress и др. Код повторяется. При смене переменных, функций, инициализаций - большая вероятность не до смотреть, не все поменять, короче - геморрой.
2 вариант: создаю абстрактный класс Base в котором описываю все повторяющиеся функции, переменные, т.е. избегаю дублирование кода и как следствие - уменьшение риска возникновения ошибок. Создаю класс Login - наследую от Base. Создаю класс Wishlist - наследуя от Login. Создаю класс MyOrders - наследуя от Login. В классе RunTests создаю:
WishlistPage wList = new WishlistPage();
который наследует все методы от Base и Login, а вот медоды из класса MyOrders - не наследуются.
Конечно есть выход: Login - наследовать от Base, Login от Base, Wishlist от Login, MyOrders от Wishlist, MyAddress от MyOrders....
и в классе RunTests создавать:
MyAddress myAddr = new MyAddress();
и уже в нем все методы наследованы. Но это как-то не комильфо.
Как вы поступаете в таком случае. Я думаю такие примеры возникают у каждого и часто. Хочется писать не как прийдется, а как правильно.