Какой у вас опыт программирования на Java в контексте автоматизации тестирования?

«Какой у вас опыт программирования на Java в контексте автоматизации тестирования?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Имею опыт разработки фреймворков и набора автотестов на Java для веб и API.

Стек и практики:

  • Фреймворки: JUnit 5, TestNG (для управления жизненным циклом тестов, параметризации, отчетности).
  • Веб-автоматизация: Selenium WebDriver 4 с использованием паттерна Page Object Model (POM) и его улучшенной версии Page Factory для инициализации элементов.
  • API-тестирование: RestAssured для написания читаемых и лаконичных тестов REST API.
  • Сборка и зависимости: Maven, Gradle.
  • Логирование: SLF4J с Logback.
  • Принципы: DRY, SOLID (для построения устойчивой структуры фреймворка).

Пример теста с использованием POM, TestNG и RestAssured:

1. Page Object (LoginPage.java):

public class LoginPage {
    @FindBy(id = "username") private WebElement usernameField;
    @FindBy(id = "password") private WebElement passwordField;
    @FindBy(css = "button[type='submit']") private WebElement loginButton;
    @FindBy(className = "error-message") private WebElement errorMessage;

    public LoginPage(WebDriver driver) {
        PageFactory.initElements(driver, this);
    }

    public void login(String username, String password) {
        usernameField.sendKeys(username);
        passwordField.sendKeys(password);
        loginButton.click();
    }

    public String getErrorMessage() {
        return errorMessage.getText();
    }
}

2. API тест с RestAssured (AuthApiTest.java):

import io.restassured.RestAssured;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.*;

public class AuthApiTest {
    @Test
    public void testSuccessfulLoginReturnsToken() {
        given()
            .contentType(ContentType.JSON)
            .body("{"login": "user", "password": "pass123"}")
        .when()
            .post("/api/v1/auth/login")
        .then()
            .statusCode(200)
            .body("token", notNullValue())
            .body("token.length()", greaterThan(10));
    }
}

3. Интеграционный тест (LoginTest.java):

public class LoginTest {
    WebDriver driver;
    LoginPage loginPage;

    @BeforeMethod
    public void setUp() {
        driver = new ChromeDriver();
        driver.get("https://app.example.com");
        loginPage = new LoginPage(driver);
    }

    @Test
    public void testUserCanLoginWithValidCredentials() {
        loginPage.login("standard_user", "secret_sauce");
        // Предполагается, что после логина происходит редирект на главную
        Assert.assertEquals(driver.getCurrentUrl(), "https://app.example.com/inventory.html");
    }

    @AfterMethod
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }
}

Такой подход обеспечивает чистоту, поддерживаемость кода и позволяет эффективно покрывать тестами функциональность приложения.