Що таке ООП?
ООП (Об’єктно-орієнтоване програмування) – це підхід у програмуванні, де програма моделюється у вигляді об’єктів, що мають стан (поля) та поведінку (методи).
💡 Основна ідея ООП – це інкапсуляція, наслідування, поліморфізм і абстракція, що допомагає створювати масштабовані, зручні в підтримці та розширенні програми.
🔹 Основні принципи ООП
1️⃣ Інкапсуляція (Encapsulation)
Приховування деталей реалізації об’єкта та контроль доступу до його даних через геттери/сеттери.
✅ Переваги:
✔️ Забезпечує безпеку даних.
✔️ Контролює зміни стану об’єкта.
📌 Приклад в Java (Page Object + Selenide)
javaCopyEditpublic class LoginPage {
private SelenideElement usernameField = $("#username");
private SelenideElement passwordField = $("#password");
private SelenideElement loginButton = $("#login");
// Методи для взаємодії (контроль доступу)
public LoginPage enterUsername(String username) {
usernameField.setValue(username);
return this;
}
public LoginPage enterPassword(String password) {
passwordField.setValue(password);
return this;
}
public void clickLogin() {
loginButton.click();
}
}
🔹 Тут поля usernameField
, passwordField
, loginButton
приховані (private), і доступ до них можливий лише через методи (enterUsername()
, enterPassword()
, clickLogin()
).
2️⃣ Наслідування (Inheritance)
Створення нового класу на основі існуючого, що дозволяє використовувати його методи без дублювання коду.
✅ Переваги:
✔️ Уникає дублювання коду.
✔️ Розширює функціональність без зміни існуючих класів.
📌 Приклад в Java (Базовий Page Object + Наслідування)
javaCopyEdit// Базовий клас для всіх сторінок
public class BasePage {
public void openPage(String url) {
Selenide.open(url);
}
}
// Наслідуваний клас для сторінки логіна
public class LoginPage extends BasePage {
private SelenideElement usernameField = $("#username");
private SelenideElement passwordField = $("#password");
private SelenideElement loginButton = $("#login");
public LoginPage enterUsername(String username) {
usernameField.setValue(username);
return this;
}
public LoginPage enterPassword(String password) {
passwordField.setValue(password);
return this;
}
public void clickLogin() {
loginButton.click();
}
}
// Використання
LoginPage loginPage = new LoginPage();
loginPage.openPage("https://example.com/login"); // Метод з батьківського класу
loginPage.enterUsername("admin").enterPassword("12345").clickLogin();
🔹 Клас LoginPage
наслідує BasePage
та отримує можливість відкривати сторінки (openPage()
) без дублювання коду.
3️⃣ Поліморфізм (Polymorphism)
Однаковий інтерфейс – різна реалізація. Використовується для спрощення коду та зменшення залежностей.
✅ Переваги:
✔️ Дозволяє використовувати один і той самий метод для різних типів об’єктів.
✔️ Покращує масштабованість коду.
📌 Приклад: Оверрайдінг (Method Overriding)
javaCopyEdit// Базовий клас
public class BaseTest {
public void runTest() {
System.out.println("Running base test...");
}
}
// Дочірній клас перевизначає метод
public class UIAutomationTest extends BaseTest {
@Override
public void runTest() {
System.out.println("Running UI test using Selenide...");
}
}
public class APITest extends BaseTest {
@Override
public void runTest() {
System.out.println("Running API test using RestAssured...");
}
}
// Використання
BaseTest test1 = new UIAutomationTest();
BaseTest test2 = new APITest();
test1.runTest(); // "Running UI test using Selenide..."
test2.runTest(); // "Running API test using RestAssured..."
🔹 Метод runTest()
викликається для різних об’єктів (UIAutomationTest
, APITest
), але результат – різний.
4️⃣ Абстракція (Abstraction)
Приховує складність реалізації, залишаючи лише необхідні методи для взаємодії.
✅ Переваги:
✔️ Полегшує використання коду, приховуючи деталі реалізації.
✔️ Зменшує залежність між модулями.
📌 Приклад: Абстрактний клас Page Object
javaCopyEditpublic abstract class BasePage {
public abstract void openPage(); // Абстрактний метод без реалізації
public void waitForElement(SelenideElement element) {
element.shouldBe(Condition.visible);
}
}
// Наслідуваний клас, що реалізує openPage()
public class LoginPage extends BasePage {
private SelenideElement usernameField = $("#username");
private SelenideElement passwordField = $("#password");
private SelenideElement loginButton = $("#login");
@Override
public void openPage() {
Selenide.open("https://example.com/login");
}
public void login(String username, String password) {
usernameField.setValue(username);
passwordField.setValue(password);
loginButton.click();
}
}
// Використання
LoginPage loginPage = new LoginPage();
loginPage.openPage();
loginPage.login("admin", "password123");
🔹 Клас BasePage
містить абстрактний метод openPage()
, який обов’язково потрібно реалізувати у дочірніх класах.
🔥 Висновки
Принцип | Що робить? | Приклад у Java/Selenide |
---|---|---|
Інкапсуляція | Ховає внутрішню логіку, обмежує доступ до даних | private поля, public геттери/сеттери в Page Object |
Наслідування | Дочірній клас наслідує методи батьківського | LoginPage наслідує BasePage |
Поліморфізм | Один метод – різна поведінка | Перевизначення runTest() в UIAutomationTest |
Абстракція | Приховує складність реалізації | Абстрактний клас BasePage |
☝️ ООП у Java/Selenide допомагає створювати гнучкі та підтримувані автоматизовані тести! 🚀