Что такое пирамида тестирования и из каких уровней она состоит

Ответ

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

Она состоит из трех основных уровней:

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

Находятся в основании пирамиды, их должно быть больше всего.

  • Что проверяют: Изолированные компоненты системы — функции, методы или классы.
  • Характеристики: Очень быстрые, дешевые в написании и поддержке, не зависят от внешних систем (БД, API).
# test_calculator.py
def add(a, b):
    return a + b

def test_add():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0

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

Средний уровень пирамиды. Их меньше, чем unit-тестов.

  • Что проверяют: Взаимодействие нескольких компонентов системы. Например, связку «код приложения → база данных» или «сервис А → сервис Б».
  • Характеристики: Медленнее и сложнее в настройке, чем unit-тесты, так как требуют окружения (например, тестовой БД).
# test_user_repository.py
# Используется фикстура db_session для работы с тестовой БД
def test_create_user(db_session):
    repo = UserRepository(db_session)
    user = repo.create(name="test_user", email="test@example.com")
    assert user.id is not None
    assert repo.get_by_email("test@example.com") is not None

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

Вершина пирамиды, их должно быть меньше всего.

  • Что проверяют: Полные пользовательские сценарии от начала до конца через графический интерфейс (или API), имитируя действия реального пользователя.
  • Характеристики: Самые медленные, дорогие в поддержке и хрупкие (часто ломаются из-за изменений в UI).
# test_login_flow.py (псевдокод с Selenium)
from selenium.webdriver.common.by import By

def test_successful_login(driver):
    driver.get("https://example.com/login")
    driver.find_element(By.ID, "username").send_keys("user")
    driver.find_element(By.ID, "password").send_keys("pass")
    driver.find_element(By.ID, "submit").click()
    assert "/dashboard" in driver.current_url

Основной принцип: Чем выше уровень теста в пирамиде, тем он медленнее, дороже и сложнее, поэтому таких тестов должно быть меньше.

Ответ 18+ 🔞

А, пирамида тестирования! Ну это ж классика, блядь, как «Муму» Тургенева, только про код, а не про собак. Сейчас разжую, как для распиздяев.

Представь себе, что ты строишь дом. Нельзя же сразу крышу мастерить, ебать мои старые костыли! Сначала кирпичи проверяешь, потом стены, а уж потом — целый этаж. Так и тут.

Вот смотри, три слоя, как в торте, только невкусный, зато полезный.

1. Юнит-тесты (внизу, их дохуя) Это проверка каждого кирпичика по отдельности. Функция там, метод, класс — одиноко, в вакууме. Быстро, дёшево, нихуя не ломается. Пишешь и спишь спокойно.

# test_calculator.py
def add(a, b):
    return a + b

def test_add():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0

Вот, видишь? Сложили два плюс три — получили пять. Если не пять, значит, ты мудак, иди чини. Всё просто, как три копейки.

2. Интеграционные тесты (посередине, их поменьше) А вот тут начинается магия, блядь. Проверяем, как эти кирпичики друг с другом дружат. Например, твой код полез в базу данных что-то записать. А база-то живая, сука! Надо поднять тестовую, настроить, потом всё почистить. Медленнее уже, заморочек больше.

# test_user_repository.py
def test_create_user(db_session):
    repo = UserRepository(db_session)
    user = repo.create(name="test_user", email="test@example.com")
    assert user.id is not None
    assert repo.get_by_email("test@example.com") is not None

Создали юзера, проверили, что он в базе засветился. Если нет — пидарас шерстяной, где-то косяк в соединении.

3. E2E-тесты (наверху, их совсем чуть-чуть) Это уже, ёпта, высший пилотаж. Полный сценарий, как будто реальный пользователь пришёл. Открыл браузер, тыкнул в кнопку, ввёл логин-пароль, увидел результат. Медленные, как черепаха в сиропе, хрупкие, как хрустальная ваза твоей бабушки. Любое изменение в интерфейсе — и нихуя, все тесты посыпались.

# test_login_flow.py
from selenium.webdriver.common.by import By

def test_successful_login(driver):
    driver.get("https://example.com/login")
    driver.find_element(By.ID, "username").send_keys("user")
    driver.find_element(By.ID, "password").send_keys("pass")
    driver.find_element(By.ID, "submit").click()
    assert "/dashboard" in driver.current_url

Вот он, красавец, зашёл в систему. Если не зашёл — либо ты криворукий, либо сайт сдох. Волнение ебать!

А главная мысль какая? Чем выше забираешься по этой пирамиде, тем дороже и больнее каждый тест. Поэтому внизу их — овердохуища, быстрых и дешёвых. А наверху — штучно, только самые важные сценарии. А то начнёшь всё через интерфейс гонять — так и с ума сойти недолго, в рот меня чих-пых!