Чёрный и белый ящик

Два взгляда на систему: снаружи по поведению и изнутри по устройству кода.

Чёрный ящик — тестирование по поведению, без знания внутреннего устройства; белый ящик — тестирование с опорой на структуру кода (ветки, условия, пути).

Два взгляда

АспектЧёрный ящикБелый ящик
Что знаемТолько вход и выходВнутренний код
На что опираемсяТребования, спецификациюВетви, условия, пути выполнения
Кто чаще делаетQA, пользовательРазработчик
Сильная сторонаПроверяет «то, что нужно»Покрывает все ветви логики

Чёрный ящик: проверяем поведение

Нас не волнует, как устроена функция внутри. Мы знаем: «на вход год — на выход високосный он или нет». Проверяем по правилу из требований.

def is_leap(year):
    """Високосный ли год (григорианский календарь)."""
    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)


# Чёрный ящик: судим только по входу и выходу
assert is_leap(2024) is True    # делится на 4
assert is_leap(2023) is False   # не делится на 4
assert is_leap(1900) is False   # век, не делится на 400
assert is_leap(2000) is True    # делится на 400
print("Чёрный ящик: поведение совпадает с требованиями")

Вывод:

Чёрный ящик: поведение совпадает с требованиями

Белый ящик: проверяем все ветви

При белом ящике мы смотрим в код и осознанно подбираем входы, чтобы пройти каждую ветку условия. В is_leap четыре содержательных пути (делится/не делится на 4, на 100, на 400) — и каждый стоит покрыть тестом. Это и сделано выше: входы 2024/2023/1900/2000 не случайны — они закрывают все ветви.

Что выбрать

Это не «или-или». Чёрный ящик гарантирует, что система делает нужное; белый ящик гарантирует, что вся логика проверена. Зрелые команды используют оба: думают о требованиях (чёрный) и следят за покрытием ветвей (белый). Есть и «серый ящик» — частичное знание устройства.

Итог

  • Чёрный ящик — по поведению и требованиям, без знания кода.
  • Белый ящик — по структуре кода, с покрытием всех ветвей.
  • Лучшие наборы тестов сочетают оба взгляда.
Проверьте себя
1. Что характеризует тестирование чёрного ящика?
AОпору на внутренний код и ветви
BПроверку только по входу и выходу, без знания устройства
CОбязательное знание языка реализации
DТолько ручное выполнение
2. На что опирается белый ящик?
AТолько на спецификацию
BНа структуру кода: ветви, условия, пути выполнения
CНа отзывы пользователей
DНа скорость работы
3. Как соотносятся два подхода на практике?
AНужно выбрать ровно один
BИх сочетают: чёрный проверяет нужность поведения, белый — покрытие логики
CБелый ящик всегда лучше
DЧёрный ящик устарел
Поддержать проект