Ответ
Пирамида тестирования — это концепция, которая описывает оптимальное соотношение различных видов тестов в проекте для достижения высокой скорости обратной связи, надежности и низкой стоимости поддержки.
Она состоит из трех основных уровней:
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
Вот он, красавец, зашёл в систему. Если не зашёл — либо ты криворукий, либо сайт сдох. Волнение ебать!
А главная мысль какая? Чем выше забираешься по этой пирамиде, тем дороже и больнее каждый тест. Поэтому внизу их — овердохуища, быстрых и дешёвых. А наверху — штучно, только самые важные сценарии. А то начнёшь всё через интерфейс гонять — так и с ума сойти недолго, в рот меня чих-пых!