В чем разница между тестированием «белого ящика» и «черного ящика»?

Ответ

Различие основано на уровне знания внутреннего устройства тестируемой системы.

Тестирование "белого ящика" (White-box / Structural Testing)

Тестировщик имеет доступ к исходному коду и внутренней структуре. Тесты проектируются на основе анализа логики, путей выполнения и структуры кода.

  • Цель: Проверить корректность внутренней логики, покрыть код (ветви, условия, пути).
  • Кто выполняет: Разработчики, инженеры по автоматизации.
  • Примеры: Модульное (unit), интеграционное тестирование, анализ покрытия кода.

Пример модульного теста (Python):

def calculate_discount(price, is_member):
    if is_member and price > 100:  # Ветвь 1
        return price * 0.9
    elif is_member:                # Ветвь 2
        return price * 0.95
    else:                          # Ветвь 3
        return price

# White-box тест, знающий о внутренних условиях
def test_calculate_discount():
    # Проверяем все ветви логики
    assert calculate_discount(150, True) == 135   # Ветвь 1
    assert calculate_discount(50, True) == 47.5   # Ветвь 2
    assert calculate_discount(100, False) == 100  # Ветвь 3

Тестирование "черного ящика" (Black-box / Functional Testing)

Тестировщик не знает внутреннего устройства. Система рассматривается как "черный ящик", тесты строятся на основе спецификаций, требований и интерфейсов.

  • Цель: Проверить соответствие функциональным требованиям, корректность работы с точки зрения пользователя.
  • Кто выполняет: Тестировщики, аналитики.
  • Примеры: Функциональное, приемочное (UAT), системное тестирование.

Пример теста "черного ящика" для API:

# Тестировщик знает только спецификацию API:
# "POST /api/login должен вернуть токен при корректных учетных данных"
POST /api/login HTTP/1.1
Content-Type: application/json

{"username": "test", "password": "secret"}

# Ожидаемый ответ (проверяется только выход):
HTTP/1.1 200 OK
{"token": "some_jwt_token"}
# Внутренняя реализация аутентификации (база данных, хэши) не известна.
Сводная таблица: Критерий Белый ящик Черный ящик
Знание внутренностей Да (код, архитектура) Нет
Уровень тестирования Низкий (модули, интеграция) Высокий (система, приемка)
Критерии проектирования тестов Покрытие кода, пути выполнения Спецификации, требования, сценарии использования
Основная сильная сторона Нахождение логических ошибок, оптимизация кода Проверка соответствия требованиям, пользовательского опыта

Ответ 18+ 🔞

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

Представь себе, блядь, два подхода к разбору полётов твоего свеженаписанного говнокода.

Тестирование "белого ящика" (White-box) Это когда ты, сука, залезаешь внутрь движка, как хирург-извращенец. У тебя есть доступ ко всему: к исходникам, к этим твоим кривым условиям if, к циклам, которые могут зациклиться нахуй. Ты смотришь на код и думаешь: "Ага, щас я тебя, мудень, проверю по всем веткам, чтобы ни одна else не осталась непротестированной, блядь!"

  • Смысл: Убедиться, что внутренняя логика не ебёт мозг и работает как часы. Проверить ВСЕ пути, даже те, до которых пользователю, как до Луны.
  • Кто этим страдает: Ты сам, разработчик, или твой коллега-автоматизатор, который тоже в теме.
  • Примеры: Модульные тесты (unit), интеграционные — вся эта низкоуровневая движуха.

Вот, смотри, пример белого ящика на Python:

def calculate_discount(price, is_member):
    if is_member and price > 100:  # Ветвь 1
        return price * 0.9
    elif is_member:                # Ветвь 2
        return price * 0.95
    else:                          # Ветвь 3
        return price

# Белый ящик: мы ВИДИМ эти три ветки и долбим по каждой!
def test_calculate_discount():
    assert calculate_discount(150, True) == 135   # Бьём по первой ветке
    assert calculate_discount(50, True) == 47.5   # Ловим вторую
    assert calculate_discount(100, False) == 100  # И добиваем третью

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

  • Смысл: Убедиться, что эта штука в принципе работает для пользователя, а не только для твоего продвинутого IDE.
  • Кто этим занимается: Тестировщики, аналитики, иногда сами заказчики (и тогда начинается ад, блядь).
  • Примеры: Функциональное тестирование, приемочное (UAT), когда заказчик говорит "ой, а можно вот так?".

Пример чёрного ящика для какого-нибудь API:

// Тестировщик видит только интерфейс: "Эй, API, прими логин и пароль, отдай токен!"
// А как ты там внутри пароль хэшируешь — ему похуй, это твои проблемы.
POST /api/login HTTP/1.1
Content-Type: application/json

{"username": "test", "password": "secret"}

// И он ждёт ЧЁТКО ЭТОТ ОТВЕТ:
HTTP/1.1 200 OK
{"token": "some_jwt_token"}
// Всё! Никаких подробностей про "белый ящик", только вход и выход.

Короче, сводка для тех, кто в танке:

Критерий Белый ящик Чёрный ящик
Видишь внутренности? Да, как свои грязные носки. Нет, как чужую жену в душе.
Уровень Низкий, под капотом. Высокий, с точки зрения юзверя.
От чего пляшем? От кода, его веток и условий. От требований, ТЗ и сценариев использования.
Сильная сторона Найти логические косяки, проверить ВСЁ. Убедиться, что фича в принципе работает как задумано.

Вот и вся разница, ёпта. Один ковыряется в кишках, другой щупает снаружи. И оба, блядь, нужны, чтобы твой продукт не развалился на первом же юзере, который нажмёт не ту кнопку.