Ответ
Абстракция — это принцип объектно-ориентированного программирования, который позволяет скрывать сложную внутреннюю реализацию объекта, предоставляя пользователю (другому коду) только его существенные характеристики и поведение через четко определенный интерфейс.
Пример в контексте тестирования: При написании автотестов мы часто используем абстракцию для создания 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'а. Каждый занимается своим делом, и всем хорошо.
Вот и вся абстракция, чувак. Не городить овердохуища кода где попало, а прятать сложность за простыми командами. Как будто у тебя есть раб-программист внутри кода, который делает всю грязную работу, а ты только отдаёшь приказы. Удобно, блядь.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶