Чёрный и белый ящик
Два взгляда на систему: снаружи по поведению и изнутри по устройству кода.
Чёрный ящик — тестирование по поведению, без знания внутреннего устройства; белый ящик — тестирование с опорой на структуру кода (ветки, условия, пути).
Два взгляда
| Аспект | Чёрный ящик | Белый ящик |
| Что знаем | Только вход и выход | Внутренний код |
| На что опираемся | Требования, спецификацию | Ветви, условия, пути выполнения |
| Кто чаще делает | 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 не случайны — они закрывают все ветви.
Что выбрать
Это не «или-или». Чёрный ящик гарантирует, что система делает нужное; белый ящик гарантирует, что вся логика проверена. Зрелые команды используют оба: думают о требованиях (чёрный) и следят за покрытием ветвей (белый). Есть и «серый ящик» — частичное знание устройства.
Итог
- Чёрный ящик — по поведению и требованиям, без знания кода.
- Белый ящик — по структуре кода, с покрытием всех ветвей.
- Лучшие наборы тестов сочетают оба взгляда.