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

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

Ответ

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

Тестирование "белого ящика" (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"}
# Внутренняя реализация аутентификации (база данных, хэши) не известна.
Сводная таблица: Критерий Белый ящик Черный ящик
Знание внутренностей Да (код, архитектура) Нет
Уровень тестирования Низкий (модули, интеграция) Высокий (система, приемка)
Критерии проектирования тестов Покрытие кода, пути выполнения Спецификации, требования, сценарии использования
Основная сильная сторона Нахождение логических ошибок, оптимизация кода Проверка соответствия требованиям, пользовательского опыта