Приведите примеры применения техник тест-дизайна на практике.

Ответ

Техники тест-дизайна используются для систематического создания эффективных тестовых случаев. Вот практические примеры их применения:

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

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

    • Задача: То же поле "Возраст" ([18, 65]).
    • Применение: Тестируем значения на границах и рядом с ними:
      • 17 (нижняя граница -1) → ошибка.
      • 18 (нижняя граница) → успех.
      • 19 (нижняя граница +1) → успех.
      • 64 (верхняя граница -1) → успех.
      • 65 (верхняя граница) → успех.
      • 66 (верхняя граница +1) → ошибка.
  3. Попарное тестирование (Pairwise Testing):

    • Задача: Фильтр товаров с параметрами: Цена (низкая, средняя, высокая), Бренд (A, B), Наличие (есть, нет).
    • Применение: Вместо 3x2x2=12 комбинаций, инструмент (например, AllPairs) генерирует набор, где каждая пара значений встречается хотя бы раз. Это резко сокращает число тестов.
  4. Таблица решений (Decision Table):

    • Задача: Логика начисления скидки: Скидка 10% дается, если (Постоянный клиент ИЛИ Сумма > 1000) И Не было возвратов.
    • Применение: Строим таблицу, покрывающую все комбинации условий (T/F) и проверяем итоговое действие (дать/не дать скидку).

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

def test_add_to_cart_quantity_boundaries():
    product_id = 123
    # Граничные и невалидные значения
    test_cases = [
        (0, False),   # Невалидно: 0
        (1, True),    # Нижняя валидная граница
        (99, True),   # Верхняя валидная граница
        (100, False)  # Невалидно: 100
    ]
    for quantity, should_succeed in test_cases:
        result = add_to_cart(product_id, quantity)
        assert result.success == should_succeed

Ответ 18+ 🔞

А, ну вот, смотри, классика жанра, блядь! Техники тест-дизайна. Это ж как священное писание для тестировщика, который не хочет тыкать пальцем в небо, как слепой котёнок. Сейчас разложу по полочкам, но с приправами.

Эквивалентное разбиение, ёпта! Суть проще пареной репы, но мозги экономит — овердохуища. Берёшь, например, поле «Возраст». От 18 до 65, ясен пень. Ну и что, ты будешь вбивать все числа от 18 до 65? Да ты с ума сошёл! Берёшь и делишь всё это безобразие на три кучки:

  • Нормальная кучка (валидная): от 18 до 65. Берёшь ОДНО число оттуда, хоть 30. Если работает — значит, и для 22, и для 59, в теории, должно пахать.
  • Кучка «маловато будет»: всё, что меньше 18. Херачишь туда 17. Ожидаешь, что система скажет «иди отсюда, сопляк».
  • Кучка «переборщил, дед»: всё, что больше 65. Суёшь 66. Ждёшь, что тебе вежливо намекнут на дверь.

Всё! Три теста вместо сорока восьми. Гениально и просто, как тапок.

Анализ граничных значений — это когда ты подкрадываешься к этим самым границам, как хитрая жопа, и начинаешь их дёргать. Тот же возраст, [18, 65]. Ты не просто проверяешь 18 и 65. Ты проверяешь, что система не споткнётся на самом пороге!

  • 17 (нижняя граница -1) — должен быть пиздец, ошибка.
  • 18 (сама граница) — должно быть «добро пожаловать».
  • 19 (граница +1) — тоже ок.
  • Потом бежишь к другому краю: 64 (ок), 65 (ок), 66 (пиздец). Вот тут-то и вылазят самые сочные баги, когда система думает, что 65 — это уже перебор, а 18 — ещё рановато. Классика!

Попарное тестирование — это вообще магия, чтобы не ебаться со всеми комбинациями. Смотри, есть фильтр товаров: Цена (низкая, средняя, высокая), Бренд (А, Б), Наличие (есть, нет). Если перемножить, получается 3 2 2 = 12 комбинаций. Не так много, скажешь ты. А если параметров 10 по 5 значений каждый? Твои тесты будут идти до второго пришествия. А тут приходит попарное тестирование и говорит: «Расслабься, чувак. Нам не нужно ВСЕ комбинации. Нам нужно, чтобы каждая ПАРА значений (низкая цена + бренд А, низкая цена + наличие нет и т.д.) встретилась хотя бы раз в одном из тестов». И специальные инструменты (AllPairs, Pict) генерируют этот укороченный набор. Волшебство, блядь! Баги ловятся, а времени тратится в разы меньше.

Таблица решений — это для любителей чёткой логики, когда в условиях столько «И», «ИЛИ» и «НЕ», что голова идёт кругом. Допустим, скидка 10% даётся, если (Постоянный клиент ИЛИ Сумма > 1000) И Не было возвратов. Вместо того чтобы в уме дергать эти условия, ты рисуешь табличку. Все возможные состояния (клиент постоянный? да/нет. Сумма >1000? да/нет. Возвраты были? да/нет.) и для каждой строчки пишешь — дать скидку или нет. Получается наглядная картина всех бизнес-правил. И когда менеджер прибегает с криком «А вот в этом странном случае скидка не проставилась!», ты просто открываешь таблицу и показываешь: «Смотри, жопа с ручками, по нашим же правилам тут её и не должно быть!».

Ну и куда же без примерчика кода, чтобы не быть голословным. Вот, смотри, как можно проверить границы для добавления в корзину:

def test_add_to_cart_quantity_boundaries():
    product_id = 123
    # Берём граничные и заведомо неправильные значения
    test_cases = [
        (0, False),   # Нельзя добавить ноль штук, блядь! Ожидаем фейл.
        (1, True),    # Один — вот нижняя рабочая граница. Должно быть ок.
        (99, True),   # Девяносто девять — верхняя рабочая граница (допустим). Тоже ок.
        (100, False)  # Сто — уже перебор, система должна сказать «не, столько не влезет».
    ]
    for quantity, should_succeed in test_cases:
        result = add_to_cart(product_id, quantity)
        assert result.success == should_succeed

Вот так вот, не шаманством, а системным подходом, и находятся самые интересные косяки. А то ведь можно всю жизнь кликать «30, 30, 30» и думать, что всё работает.