Какие типы автотестов вы писали и какие инструменты использовали?

Ответ

Я разрабатывал автотесты разных уровней абстракции, используя соответствующие инструменты и методологии.

1. Модульные (Unit) тесты

  • Цель: Проверка изолированной логики отдельных функций, методов или классов.
  • Инструменты: JUnit (Java), pytest (Python).
  • Пример (Python/pytest):
    def test_calculate_discount():
    # Проверка стандартного сценария
    assert calculate_discount(100, 10) == 90
    # Проверка граничного случая (скидка больше суммы)
    assert calculate_discount(50, 100) == 0

2. Интеграционные (API) тесты

  • Цель: Проверка взаимодействия между компонентами системы через API.
  • Инструменты: REST Assured (Java), Postman/Newman, requests (Python).
  • Пример (Java/REST Assured):
    @Test
    public void getUser_ReturnsValidUser() {
    given()
        .pathParam("id", 1)
    .when()
        .get("/api/users/{id}")
    .then()
        .statusCode(200)
        .body("name", equalTo("John"))
        .body("active", equalTo(true));
    }

3. UI-тесты (End-to-End)

  • Цель: Автоматизация пользовательских сценариев в веб-интерфейсе.
  • Инструменты: Selenium WebDriver, Cypress.
  • Паттерн: Использовал Page Object Model (POM) для повышения поддерживаемости кода.
  • Пример (Cypress):
    it('Успешный вход в систему', () => {
    cy.visit('/login');
    cy.get('[data-qa="email-input"]').type('user@example.com');
    cy.get('[data-qa="password-input"]').type('securePass123');
    cy.get('[data-qa="submit-btn"]').click();
    cy.url().should('include', '/dashboard');
    cy.contains('Добро пожаловать').should('be.visible');
    });

4. Нагрузочные тесты

  • Цель: Оценка производительности и стабильности системы под нагрузкой.
  • Инструменты: Apache JMeter, k6.
  • Что проверял: Время отклика, пропускную способность, поведение системы при пиковой нагрузке.

Ключевые практики:

  • Следование принципам DRY (Don't Repeat Yourself) и чистого кода.
  • Интеграция тестов в CI/CD пайплайны (Jenkins, GitLab CI) для автоматического прогона.
  • Покрытие тестами критического функционала, интеграционных точек и основных пользовательских потоков.

Ответ 18+ 🔞

А, ну вот, классика жанра, блядь! Сижу, значит, как этот Герасим, под лестницей, только не метлу в руках держу, а пишу эти... как их... автотесты, ёпта. Овердохуища разных уровней, чтобы всю эту движуху проверить от хуя до винта. Слушай сюда, как я это делал, только не "Муму", а по делу.

1. Модульные (Unit) тесты, или "Проверяем один кирпич, а не всю стену"

  • Суть: Берёшь одну мелкую функцию, как ту самую мартышку, и начинаешь её дёргать со всех сторон. Что она вернёт, если на вход дать нормальные цифры? А если пиздец какие? А если вообще хуйню?
  • Чем тыкал: В Питоне — pytest, в Яве — JUnit. Без разницы, главное — изоляция, чтобы одна функция не знала про другую, как Герасим про человеческую речь.
  • Пример, чтобы было понятно, о чём я:
def test_calculate_discount():
    # Нормальный случай, всё по паспорту
    assert calculate_discount(100, 10) == 90
    # А вот сюда подсунули скидку больше самой цены — что будет, бля? Должен ноль вернуть, а не уйти в минус, как лох!
    assert calculate_discount(50, 100) == 0

2. Интеграционные (API) тесты, или "А поговорят ли эти два идиота?"

  • Суть: Тут уже не один кирпич, а два. Один сервис кричит другому через API, а второй должен ответить не "Мууу", а вменяемым JSON'ом. Проверяем, чтобы они друг друга понимали, а не как два глухонемых татарина.
  • Чем стучал: REST Assured, Postman, или на худой конец библиотека requests в Питоне.
  • Пример из жизни:
@Test
public void getUser_ReturnsValidUser() {
    given()
        .pathParam("id", 1)
    .when()
        .get("/api/users/{id}")
    .then()
        .statusCode(200) // Чтобы не 404 или, не дай бог, 500
        .body("name", equalTo("John")) // И зовут его Джон, а не Хуй с горы
        .body("active", equalTo(true)); // И чтоб живой был, а не удалённый
}

3. UI-тесты (End-to-End), или "Заставляем робота тыкать в кнопки, как бабка в смартфоне"

  • Суть: Это уже высший пилотаж, блядь. Полная симуляция пользователя: открыл браузер, нашёл поле, ввёл логин-пароль, тыкнул — вошёл. Всё, что может сделать хитрая жопа пользователя, должен сделать и скрипт.
  • Инструменты казни: Selenium — старый, добрый и местами тормозной, как я после пятницы. Или Cypress — шустрый и модный.
  • Как не сойти с ума: Использовал паттерн Page Object Model (POM). Это чтобы не было в коде "cy.get('#qwerty123 > div:nth-child(5) > a')", а было понятное "LoginPage.submitButton.click()". Иначе поддерживать этот код — чих-пых тебя в сраку, волнение ебать.
  • Кусок кода для наглядности:
it('Успешный вход в систему', () => {
    cy.visit('/login'); // Приехали на страницу
    cy.get('[data-qa="email-input"]').type('user@example.com'); // Вбили почту
    cy.get('[data-qa="password-input"]').type('securePass123'); // Вбили пароль
    cy.get('[data-qa="submit-btn"]').click(); // Тыкнули "Войти"
    cy.url().should('include', '/dashboard'); // Проверили, что нас перекинуло куда надо
    cy.contains('Добро пожаловать').should('be.visible'); // И нас поприветствовали, а не послали нахуй
});

4. Нагрузочные тесты, или "А выдержит ли тачка, если на неё сесть всем отделом?"

  • Суть: Тут уже не про логику, а про жёсткость. Надо понять, сколько пользователей система сможет обслужить, прежде чем скажет "всё, пиздец, я устала" и ляжет.
  • Чем давил: JMeter — монстр с интерфейсом из 90-х, но мощный. Или k6 — помоднее и в коде.
  • Что смотрел: Не упала ли она, блядь, и как быстро отвечает под нагрузкой. Чтобы в продакшене не получилось, как в том анекдоте: "а мы и не думали, что так много народа зайдёт".

А теперь, блядь, самое главное — как я это всё не превращал в помойку:

  • Принцип DRY: Не повторяйся, сука! Выноси общую логику в хелперы, фикстуры, базовые классы. А то будешь как тот Герасим — одно "Муму" на все случаи жизни.
  • CI/CD: Весь этот зоопарк тестов должен бегать сам, по расписанию или после каждого коммита, в дженкинсе или гитлабе. Чтобы не я вручную, как конь, их гонял.
  • Что покрывать: В первую очередь — самый важный, денежный функционал. Потом — места, где системы стыкуются (интеграции). И обязательно — основные сценарии, по которым ходят пользователи. Всё остальное — по остаточному принципу, ибо терпения ноль ебать на покрытие каждой кнопки.

Вот так вот, ёпта. Не "Муму", а целая наука, блядь.