← Назад к вопросам

Какие знаешь паттерны тестирования?

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

Для эффективной автоматизации тестирования важно сочетать несколько паттернов в зависимости от контекста.

Какие знаешь паттерны тестирования? | PrepBro