Ответ
Имею опыт разработки фреймворков и набора автотестов на 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();
}
}
}
Такой подход обеспечивает чистоту, поддерживаемость кода и позволяет эффективно покрывать тестами функциональность приложения.