← Назад к вопросам
Какие знаешь паттерны тестирования?
2.0 Middle🔥 111 комментариев
#Теория тестирования
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Паттерны тестирования
1. AAA (Arrange-Act-Assert)
Структура каждого теста:
import pytest
from calculator import Calculator
def test_add_positive_numbers():
# Arrange - подготовка данных
calc = Calculator()
# Act - выполнение действия
result = calc.add(2, 3)
# Assert - проверка результата
assert result == 5
Преимущества:
- Четкая структура
- Легко читается
- Предсказуемый формат
2. Page Object Model (POM)
Для UI-тестирования. Каждая страница — отдельный класс с методами.
class LoginPage:
def __init__(self, driver):
self.driver = driver
def enter_username(self, username):
self.driver.find_element("id", "username").send_keys(username)
def enter_password(self, password):
self.driver.find_element("id", "password").send_keys(password)
def click_login(self):
self.driver.find_element("id", "login-btn").click()
def test_valid_login():
login = LoginPage(driver)
login.enter_username("user@test.com")
login.enter_password("pass123")
login.click_login()
assert driver.find_element("id", "welcome").is_displayed()
Преимущества:
- Разделение данных и логики
- Легче поддерживать
- Снижает дублирование
3. Fixture Pattern
Переиспользуемые компоненты для настройки тестов.
import pytest
from database import Database
@pytest.fixture
def db():
database = Database()
database.connect()
yield database # Предоставляем ресурс
database.disconnect() # Очистка
def test_user_creation(db):
user = db.create_user("John", "john@test.com")
assert user.email == "john@test.com"
4. Given-When-Then (BDD)
Поведенческое тестирование (Behavior-Driven Development).
Scenario: User transfers money to another account
Given the user has 1000 rubles in the account
When the user transfers 500 rubles to John
Then the user balance should be 500 rubles
And John should receive 500 rubles
Реализация на Python с behave:
@given("the user has {amount} rubles")
def step_user_has_balance(context, amount):
context.user.balance = int(amount)
@when("the user transfers {amount} rubles to {recipient}")
def step_transfer(context, amount, recipient):
context.user.transfer(recipient, int(amount))
@then("the user balance should be {amount} rubles")
def step_check_balance(context, amount):
assert context.user.balance == int(amount)
5. Data-Driven Testing
Параметризованные тесты с несколькими наборами данных.
import pytest
@pytest.mark.parametrize("input,expected", [
(2, 3, 5),
(-1, 1, 0),
(10, -5, 5),
])
def test_add(a, b, expected):
assert add(a, b) == expected
6. Factory Pattern
Создание сложных объектов для тестов.
class UserFactory:
@staticmethod
def create_admin():
return User(name="Admin", role="admin")
@staticmethod
def create_user():
return User(name="User", role="user")
def test_admin_permissions():
user = UserFactory.create_admin()
assert user.can_delete_users() == True
7. Mock & Stub Pattern
Замена зависимостей при тестировании.
from unittest.mock import Mock, patch
def test_user_service():
# Создаём mock для БД
mock_db = Mock()
mock_db.get_user.return_value = {"id": 1, "name": "John"}
service = UserService(mock_db)
user = service.get_user(1)
assert user["name"] == "John"
mock_db.get_user.assert_called_once_with(1)
8. Test Pyramid
Структура тестов:
△ E2E (UI) - 10%
△ △ Integration - 20%
△ △ △ Unit - 70%
Золотое правило: писать много unit-тестов, среднее количество интеграционных, минимум E2E.
Выбор паттерна
- Unit-тесты → AAA + Fixture
- UI-тесты → Page Object Model
- API-тесты → Given-When-Then или AAA
- Комплексные сценарии → Data-Driven
Для эффективной автоматизации тестирования важно сочетать несколько паттернов в зависимости от контекста.