Какие методы тестирования белого ящика (White Box) вы знаете?

Ответ

Методы тестирования белого ящика (White Box Testing) основаны на знании внутренней структуры и кода приложения. Основные техники включают:

  • Покрытие операторов (Statement Coverage): Требует выполнения каждого оператора кода хотя бы один раз.
  • Покрытие ветвей (Branch Coverage): Требует прохождения каждой возможной ветви условий (например, if-else, циклов).
  • Покрытие условий (Condition Coverage): Требует проверки всех возможных комбинаций логических подвыражений внутри условий.
  • Покрытие путей (Path Coverage): Анализирует все возможные пути выполнения через блоки кода, что является наиболее полным, но часто непрактичным из-за экспоненциального роста числа путей.
  • Покрытие циклов (Loop Coverage): Фокусируется на корректности работы циклов, проверяя случаи с нулём, одной и несколькими (N) итерациями.

Пример и применение: Рассмотрим простую функцию. Цель тестирования — обеспечить покрытие ветвей и операторов.

def divide(a, b):
    if b != 0:  # Ветвь для проверки (Branch Coverage). Условие `b != 0` (Condition Coverage).
        return a / b  # Оператор для выполнения (Statement Coverage).
    return None  # Альтернативная ветвь и оператор.

Тесты для этой функции должны проверить:

  1. b != 0 (например, divide(10, 2)), чтобы выполнился оператор деления.
  2. b == 0 (например, divide(10, 0)), чтобы проверить ветвь, возвращающую None.
  3. Граничные случаи (например, деление на очень маленькое число, отрицательные значения).

Ответ 18+ 🔞

А, ну это ж про те самые тесты, где ты в код залезаешь, как в холодильник ночью — всё видно, всё твоё, блядь. Не то чёрный ящик, где ты как обезьяна с гранатой: ткнул куда-то — и охуел от результата. Тут ты, сука, сам архитектор этих ебучых условий.

Смотри, основные приёмы, которыми тестировщики мозги себе выносят:

  • Покрытие операторов (Statement Coverage): Надо, чтобы каждая строчка кода, эта жалкая запятая, хотя бы раз отработала. Как будто ты в армии: всех построил, перекличку сделал — чтоб ни один лентяй не проёбался.
  • Покрытие ветвей (Branch Coverage): Тут уже интереснее. Каждую развилку в коде (if-else, всякие while) надо пройти во ВСЕ стороны. Если у тебя if, ты обязан проверить и когда он True, и когда он False. Не проскочил одну ветку — считай, пол-программы не тестировал, мудак.
  • Покрытие условий (Condition Coverage): О, это уже для мазохистов. Внутри одного if (a > 0 and b < 5) надо перебрать все комбинации: a больше нуля и не больше, b меньше пяти и не меньше. Чтобы каждый маленький логический уёбок поработал и так, и эдак.
  • Покрытие путей (Path Coverage): Ну это вообще пиздец, теоретический идеал. Надо протестировать ВСЕ возможные маршруты, которыми программа может от старта до финиша дойти. В любой нетривиальной проге этих путей — овердохуища, экспоненциальный рост, блядь. Красиво на бумаге, но на практике — нихуя нереально.
  • Покрытие циклов (Loop Coverage): Циклы — они как мартышки, могут начудить. Надо их проверить на три ключевых сценария: когда они вообще не крутятся (0 итераций), когда покрутятся один разок, и когда заходят на полную катушку (N итераций). Чтобы не зависли и не наделали делов.

Ну и пример, чтобы не быть пиздаболом:

Вот смотри, функция проще некуда. Но и тут подвох есть, хитрая жопа.

def divide(a, b):
    if b != 0:  # Вот она, развилка, сука! (Branch Coverage). Само условие `b != 0` (Condition Coverage).
        return a / b  # Эту строчку (Statement Coverage) надо заставить выполниться.
    return None  # И эту, блядь, тоже! Альтернативная ветка.

Чтобы не облажаться, тесты должны вот это вот покрыть:

  1. b != 0 (скажем, divide(10, 2)). Цель — заставить код залезть в if и таки поделить одно на другое. Проверяем, что не вылетает и считает правильно.
  2. b == 0 (например, divide(10, 0)). Вот тут весь цимес! Надо убедиться, что программа не пытается делить на ноль (потому что это пиздец и исключение), а вежливо так, по-пацански, возвращает None. Ветка else (которая тут в виде возврата None) обязана быть пройдена.
  3. Ну и граничные случаи, куда ж без них. А что если b не ноль, но охуенно близко к нулю? Или отрицательное? Или a — нихуя себе большое? Проверяй, чувак. Мало ли где ещё собака зарыта.