Какие техники тест-дизайна вы применяете для создания тестовых сценариев?

«Какие техники тест-дизайна вы применяете для создания тестовых сценариев?» — вопрос из категории Техники тест-дизайна, который задают на 70% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для эффективного и полного покрытия тестами я применяю следующие основные техники тест-дизайна:

  1. Эквивалентное Разделение (Equivalence Partitioning):

    • Цель: Уменьшить количество тест-кейсов, сгруппировав входные данные в классы, где поведение системы ожидается одинаковым.
    • Пример для поля "Возраст пользователя" (допустимый диапазон: 18-65):
      • Валидный класс: [18, 65] (например, 30)
      • Невалидный класс "меньше": <18 (например, 10)
      • Невалидный класс "больше": >65 (например, 70)
  2. Анализ Граничных Значений (Boundary Value Analysis):

    • Цель: Тестирование на границах классов эквивалентности, где чаще всего возникают ошибки.
    • Пример для того же поля (18-65):
      • Границы валидного класса: 17, 18, 19 и 64, 65, 66.
  3. Таблица Принятия Решений (Decision Table):

    • Цель: Систематически проверить комбинации условий и соответствующих действий.
    • Пример для функции скидки: Зарегистрирован? Сумма > 1000? Ожидаемая скидка
      Да Да 10%
      Да Нет 5%
      Нет Да 5%
      Нет Нет 0%
  4. Попарное Тестирование (Pairwise):

    • Цель: Резко сократить количество комбинаций, тестируя каждую пару значений параметров хотя бы один раз. Эффективно для систем с множеством параметров.

Пример кода на Python (pytest) для проверки граничных значений:

# Функция, которую тестируем
def is_age_valid(age: int) -> bool:
    return 18 <= age <= 65

# Тесты для граничных значений
def test_age_boundary_values():
    # Нижняя граница (минимум, ниже, выше)
    assert not is_age_valid(17)  # Невалидно, ниже минимума
    assert is_age_valid(18)      # Валидно, минимум
    assert is_age_valid(19)      # Валидно, чуть выше минимума

    # Верхняя граница (ниже, максимум, выше)
    assert is_age_valid(64)      # Валидно, чуть ниже максимума
    assert is_age_valid(65)      # Валидно, максимум
    assert not is_age_valid(66)  # Невалидно, выше максимума