Что такое абстракция в контексте ООП?

Ответ

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

Пример в контексте тестирования: При написании автотестов мы часто используем абстракцию для создания Page Object Model (POM). Сложная логика поиска элементов и взаимодействия с ними скрывается за простыми методами.

// Абстрактный класс или интерфейс, определяющий контракт для страницы
public abstract class BasePage {
    protected WebDriver driver;

    public BasePage(WebDriver driver) {
        this.driver = driver;
    }

    // Абстрактный метод, который должен быть реализован для проверки загрузки конкретной страницы
    public abstract boolean isPageLoaded();

    // Конкретный метод, предоставляющий общую функциональность
    public String getPageTitle() {
        return driver.getTitle();
    }
}

// Конкретная реализация, скрывающая детали локаторов и действий
public class LoginPage extends BasePage {
    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By submitButton = By.id("submit");

    public LoginPage(WebDriver driver) {
        super(driver);
    }

    @Override
    public boolean isPageLoaded() {
        return driver.findElement(submitButton).isDisplayed();
    }

    // Публичный метод — простая абстракция для действия "выполнить вход"
    public HomePage login(String user, String pass) {
        driver.findElement(usernameField).sendKeys(user); // Сложность скрыта
        driver.findElement(passwordField).sendKeys(pass);
        driver.findElement(submitButton).click();
        return new HomePage(driver);
    }
}

Преимущества для QA-инженера:

  • Упрощение тестов: Тестовые сценарии становятся читаемыми: loginPage.login("user", "pass").
  • Устойчивость к изменениям: Если изменится локатор поля username, правку нужно внести только в одном месте — в классе LoginPage.
  • Переиспользование кода: Общая логика (например, ожидание элемента) выносится в базовый класс.
  • Четкое разделение ответственности: Тест-код занимается бизнес-сценариями, а Page Object — техническим взаимодействием с UI.

Ответ 18+ 🔞

Слушай, а вот абстракция — это вообще, блядь, гениальная штука, если в двух словах. Представь себе кофеварку. Тебе же похуй, как там внутри шестерёнки крутятся и вода кипит? Ты просто жмёшь кнопку «эспрессо» и получаешь результат. Вот программисты так же делают: они всю эту ебаную сложность прячут внутрь, а наружу торчит только удобная ручка, за которую можно дёрнуть.

Вот смотри, как это в наших тестах выстреливает (Page Object Model, ёпта):

// Это типа общий договор для всех страниц. "Ребята, у кого будет страница — обязан сказать, загрузилась ли она".
public abstract class BasePage {
    protected WebDriver driver;

    public BasePage(WebDriver driver) {
        this.driver = driver;
    }

    // Вот этот метод — абстрактный, то есть пустой. Каждая страница сама решит, как понять, что она загрузилась.
    public abstract boolean isPageLoaded();

    // А это уже готовая фишка, можно пользоваться.
    public String getPageTitle() {
        return driver.getTitle();
    }
}

// А вот конкретная страница логина. Вся её подноготная — внутри.
public class LoginPage extends BasePage {
    // Вот эти локаторы — наше всё. Но они спрятаны, чтоб их нихуя не трогали.
    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By submitButton = By.id("submit");

    public LoginPage(WebDriver driver) {
        super(driver);
    }

    @Override
    public boolean isPageLoaded() {
        // Проверяем по своей логике. Никто извне об этом не знает и знать не должен.
        return driver.findElement(submitButton).isDisplayed();
    }

    // И вот, блядь, магия! Вся хуйня с поиском полей и кликами — внутри этого метода.
    // Снаружи тебе дают одну команду: "залогинься".
    public HomePage login(String user, String pass) {
        driver.findElement(usernameField).sendKeys(user); // Сложность? Съехала нахуй.
        driver.findElement(passwordField).sendKeys(pass);
        driver.findElement(submitButton).click();
        return new HomePage(driver); // И поехали дальше.
    }
}

И что мы, сука, с этого имеем, как тестировщики?

  • Тесты читаются как сказка. Вместо кучи непонятного кода пишешь loginPage.login("user", "pass"). Красота, ядрёна вошь! Любой новый чувак в проекте сразу въезжает, что происходит.
  • Жизнь после рефакторинга. Дизайнеры проснулись утром и передвинули кнопку, поменяв ей id. Раньше бы пришлось бегать по всем тестам и менять локатор. А теперь? Пизда рулю! Идёшь в один-единственный класс LoginPage, правишь там одну строчку — и все тесты снова работают. Доверия ебать ноль к дизайнерам, но жить можно.
  • Не изобретаем велосипед. Всё общее (например, ожидание элемента) можно засунуть в базовый класс, и все страницы этим будут пользоваться. Никакого копипаста, один раз написал — и ебись оно конём.
  • Чёткие границы. Твой тест-код теперь думает только о сценариях: «залогиниться, добавить товар в корзину». А вся техническая муть — поиск элементов, ожидания — это головная боль Page Object'а. Каждый занимается своим делом, и всем хорошо.

Вот и вся абстракция, чувак. Не городить овердохуища кода где попало, а прятать сложность за простыми командами. Как будто у тебя есть раб-программист внутри кода, который делает всю грязную работу, а ты только отдаёшь приказы. Удобно, блядь.

Видео-ответы