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

Как создавал проверки классом эквивалентности

1.0 Junior🔥 101 комментариев
#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Применение метода классов эквивалентности для создания проверок

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

1. Анализ входных данных и условий

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

Пример для поля "Возраст пользователя" в форме регистрации:

  • Тип данных: целое положительное число.
  • Ограничения: от 18 до 100 лет.
  • Особые условия: значение 18 — минимальный допустимый возраст, 100 — максимальный.

2. Разделение на классы эквивалентности

На основе анализа я разделяю все возможные значения каждого параметра на классы эквивалентности. Ключевое правило: значения внутри одного класса должны вызывать одинаковую реакцию системы, а значения из разных классов — разную.

Для поля "Возраст" создаются следующие классы:

  • Допустимый класс: значения от 18 до 100 (например, 25).
  • Недопустимый класс 1: значения меньше 18 (например, 17).
  • Недопустимый класс 2: значения больше 100 (например, 101).
  • Недопустимый класс 3: некорректный тип данных (например, строка "двадцать").
# Пример структуры классов эквивалентности в коде теста
age_equivalence_classes = {
    "valid": {"min": 18, "max": 100, "example": 25},
    "invalid_underage": {"min": 0, "max": 17, "example": 17},
    "invalid_overage": {"min": 101, "max": None, "example": 101},
    "invalid_type": {"examples": ["abc", None, 18.5]}
}

3. Выбор тестовых значений

Для каждого класса эквивалентности я выбираю репрезентативные тестовые значения. Это включает:

  • Одно значение из каждого допустимого класса (обычно среднее в диапазоне).
  • Одно значение из каждого недопустимого класса (граничные и типичные случаи).
  • Особое внимание к граничным значениям (Boundary Value Analysis), которые часто дополняют классы эквивалентности.

Для нашего примера:

  • Допустимый класс: 25 (среднее значение) + граничные 18 и 100.
  • Недопустимый класс 1: 17 (граничное) + 0 (крайний случай).
  • Недопустимый класс 2: 101 (граничное).
  • Недопустимый класс 3: строка "18" (некорректный тип).

4. Формулировка тестовых случаев и проверок

На основе выбранных значений я формулирую конкретные тестовые случаи. Каждый тест-кейс включает:

  • Предусловия (начальное состояние системы).
  • Входные данные (выбранное значение из класса).
  • Действия (шаги выполнения теста).
  • Ожидаемый результат (реакция системы).
  • Постусловия (финальное состояние).

Проверки строятся вокруг ожидаемых результатов. Например:

  • Для допустимого значения: система принимает данные, регистрация успешна.
  • Для недопустимых значений: система отображает ошибку, данные не принимаются.
// Пример проверки в unit-тесте (Java)
@Test
public void testAgeValidation_ValidClass() {
    UserRegistrationService service = new UserRegistrationService();
    boolean result = service.validateAge(25);
    assertTrue(result, "Допустимый возраст 25 должен быть принят");
}

@Test
public void testAgeValidation_InvalidClass() {
    UserRegistrationService service = new UserRegistrationService();
    boolean result = service.validateAge(17);
    assertFalse(result, "Недопустимый возраст 17 должен быть отвергнут");
}

5. Комбинация классов для сложных сценариев

Для функций с несколькими параметрами я использую комбинацию классов эквивалентности. Часто применяю принципы:

  • Покрытие каждого параметра отдельно (как описано выше).
  • Комбинация критических классов (например, допустимый возраст + недопустимый email).
  • Использование таблиц комбинаций для систематизации.

6. Интеграция в тестовые сценарии и автоматизацию

Созданные проверки я интегрирую в:

  • Мануальные тест-кейсы в системах управления тестированием (TestRail, Zephyr).
  • Автоматизированные тесты (на Python, Java, JavaScript).
  • Параметризованные тесты для эффективного покрытия классов.
# Параметризованный тест в pytest
import pytest

@pytest.mark.parametrize("age, expected_result", [
    (25, True),   # допустимый класс
    (18, True),   # граничное допустимое
    (100, True),  # граничное допустимое
    (17, False),  # недопустимый класс 1
    (101, False), # недопустимый класс 2
    ("abc", False) # недопустимый класс 3
])
def test_age_validation(age, expected_result):
    result = validate_age(age)
    assert result == expected_result

7. Регулярный ревизий и обновление

Классы эквивалентности не статичны. Я регулярно пересматриваю и корректирую их на основе:

  • Изменений требований.
  • Новых дефектов и граничных случаев.
  • Результатов тестирования и анализа покрытия.

Этот систематический подход позволяет минимизировать количество тестов при максимизации покрытия, эффективно находить дефекты и создавать структурированную, поддерживаемую тестовую базу. Ключевое преимущество — возможность логически обосновать выбор тестовых данных и избежать хаотичного, интуитивного тестирования.

Как создавал проверки классом эквивалентности | PrepBro