ООП - парадигма программирования, где программа строится как набор взаимодействующих объектов, содержащих данные (поля) и методы для их обработки.
Сокрытие внутренней реализации и предоставление контролируемого доступа через интерфейс.
Пример из тестирования:
public class LoginPage {
private String username; // приватное поле
// публичный метод для доступа
public void setUsername(String username) {
if(username.length() >= 5) {
this.username = username;
}
}
}
Польза для QA: Можно тестировать только публичные методы, не зная внутренней реализации.
Создание новых классов на основе существующих с возможностью переопределения или расширения функционала.
Пример:
class BaseTest {
void setup() { /* общая настройка */ }
}
class LoginTest extends BaseTest {
@Override
void setup() {
super.setup(); // вызов родительского метода
// доп. настройка для тестов логина
}
}
Польза для QA: Уменьшает дублирование кода в автотестах.
Возможность объектов с одинаковым интерфейсом иметь разную реализацию.
Пример:
interface WebElement {
void click();
}
class Button implements WebElement {
public void click() { /* клик по кнопке */ }
}
class Link implements WebElement {
public void click() { /* клик по ссылке */ }
}
Польза для QA: Один тест может работать с разными элементами, реализующими один интерфейс.
Выделение существенных характеристик объекта и игнорирование несущественных.
Пример:
abstract class TestCase {
abstract void executeTest(); // абстрактный метод
void logResult() { /* общая реализация */ }
}
class LoginTestCase extends TestCase {
void executeTest() { /* конкретная реализация */ }
}
Польза для QA: Позволяет создавать шаблоны тестов.
Класс должен иметь только одну причину для изменений.
Пример: Отдельный класс для работы с базой данных в тестах.
Классы должны быть открыты для расширения, но закрыты для модификации.
Пример: Базовый класс теста, который можно расширять, но не изменять.
Подтипы должны быть заменяемыми для своих базовых типов.
Пример: Все PageObject должны корректно работать с базовым классом страницы.
Много специализированных интерфейсов лучше одного универсального.
Пример: Раздельные интерфейсы для работы с разными типами элементов.
Зависимость от абстракций, а не от конкретных реализаций.
Пример: Внедрение драйвера браузера через конструктор.
// Абстракция
abstract class TestData {
abstract String generate();
}
// Инкапсуляция
class UserData extends TestData {
private String username;
public UserData(String username) {
this.username = username;
}
// Полиморфизм
@Override
String generate() {
return "user_" + username;
}
}
// Наследование
class AdminUserData extends UserData {
AdminUserData(String username) {
super(username);
}
@Override
String generate() {
return "admin_" + super.generate();
}
}
ООП в QA помогает:
Основные принципы:
Понимание ООП критично для: