Что такое принцип DRY?

«Что такое принцип DRY?» — вопрос из категории SOLID и принципы программирования, который задают на 35% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DRY (Don't Repeat Yourself) — это принцип разработки, направленный на снижение дублирования логики в коде. Основная идея: каждая часть знания или логики должна иметь единственное, однозначное представление в системе.

Почему DRY критически важен в тестировании? Дублирование в тестах приводит к:

  1. Хрупкости: Изменение в одном месте (например, селектора элемента или шага логина) требует правок во множестве тестов.
  2. Усложнению поддержки: Большой объем повторяющегося кода сложнее читать и обновлять.
  3. Увеличению времени на написание тестов.

Как я применяю DRY в тестовом коде:

  • Вынос общих шагов в методы-хелперы или утилитные классы.

    // Вместо дублирования логина в каждом тесте:
    public class AuthHelper {
        public static void login(WebDriver driver, String user, String pass) {
            driver.findElement(By.id("user")).sendKeys(user);
            driver.findElement(By.id("pass")).sendKeys(pass);
            driver.findElement(By.id("login-btn")).click();
        }
    }
    // Использование в тесте:
    AuthHelper.login(driver, "standard_user", "secret_sauce");
  • Использование фикстур (в Pytest) или @BeforeMethod (в TestNG) для предварительной настройки тестового окружения.

    # pytest фикстура для драйвера
    import pytest
    from selenium import webdriver
    
    @pytest.fixture(scope="function")
    def browser():
        driver = webdriver.Chrome()
        driver.get(BASE_URL)
        yield driver
        driver.quit()
    
    # Тест использует фикстуру, не создавая драйвер сам
    def test_search(browser):
        browser.find_element(By.NAME, "q").send_keys("Selenium")
  • Применение Page Object Model, который сам по себе является реализацией DRY, так как локаторы и базовые действия с элементами страницы описаны в одном месте.

  • Параметризация тестов для запуска одного тестового метода с разными наборами данных.

    @Test
    @Parameters({"admin, admin123, true", "user, wrongpass, false"})
    public void testLoginParametrized(String username, String password, boolean expectedSuccess) {
        loginPage.login(username, password);
        Assert.assertEquals(loginPage.isLoginSuccessful(), expectedSuccess);
    }

Следование DRY делает тестовую кодобазу чище, стабильнее и значительно упрощает ее масштабирование.

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