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

Ответ

Эти подходы различаются уровнем знания тестировщиком внутреннего устройства тестируемой системы (SUT).

Подход Знание внутренней структуры Уровень тестирования Примеры техник/видов тестирования
Белый ящик (White-box) Полное. Доступен исходный код, архитектура, базы данных. Низкий (модули, компоненты). Модульное тестирование, анализ покрытия кода (statement, branch), статический анализ. Тестировщик знает, как работает система.
Серый ящик (Gray-box) Частичное. Известны архитектура, схемы БД, логи, но нет прямого доступа к коду. Средний (интеграция, система). Интеграционное тестирование, тестирование API, тестирование на основе моделей. Тестировщик знает, что делает система и частично как.
Черный ящик (Black-box) Отсутствует. Система рассматривается как «черный ящик» с известными входами и ожидаемыми выходами. Высокий (система, приемка). Функциональное, нефункциональное (нагрузочное, UX), приемочное тестирование. Тестировщик знает только что должна делать система.

Практический пример для веб-приложения:

  • Белый ящик: Разработчик пишет юнит-тест для функции расчёта скидки, проверяя все ветви условия if-else.
  • Серый ящик: QA-инженер тестирует интеграцию сервиса оплаты с основным приложением через API, анализируя логи и ответы промежуточных сервисов.
  • Черный ящик: QA-инженер проверяет сценарий «Пользователь добавляет товар в корзину и оформляет заказ» через UI, не вникая в реализацию бизнес-логики.

Ответ 18+ 🔞

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

Представь, что у тебя есть машина. Вот прям новенькая, блестит.

Чёрный ящик — это когда ты просто водитель. Садишься, хуяк ключом, нажимаешь педаль — она едет. Поворачиваешь руль — она туда. Ты нихуя не знаешь, что там под капотом творится: карбюратор там, инжектор, или там гномики с вёслами сидят. Твоя задача — проверить, довозит ли она тебя из точки А в точку Б, не отваливаются ли колёса по дороге, и греется ли сиденье, как обещали. Ты знаешь ЧТО она должна делать, но понятия не имеешь КАК. Это и есть чёрный ящик. Функциональщина, приемка, юзабилити — вся эта хуйня.

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

Белый ящик — это уже полный раздолбайство на уровне инженера-двигателиста. Ты разбираешь весь движок до винтика, у тебя есть все чертежи, схемы и доступ к мозгам. Ты смотришь на исходный код и говоришь: «Ага, вот тут у тебя условие на 156-й строке, и если передать сюда null, то будет NullPointerException, пидарас шерстяной». Это уровень юнит-тестов, которые пишет сам разработчик, проверяя каждую ветку if-else, каждую функцию по отдельности. Знание внутренностей — полное, овердохуища.

Простой пример, чтобы вообще ни у кого вопросов не осталось:

Допустим, есть сайт, где ты вводишь два числа, а он тебе сумму выдает.

  • Чёрный ящик: Ты открыл браузер, вбил 2 и 3, нажал «Посчитать». Получил 5 — ок. Вбил -1 и 999 — получил 998 — ок. Вбил "банан" и 5 — получил ошибку «Введите число» — тоже ок. Ты про код не думаешь вообще.
  • Серый ящик: Ты через Postman шлёшь POST-запрос на /api/sum с телом {"a": 2, "b": 3}. Сервер отвечает тебе {"result": 5}. А потом ты шлёшь {"a": 9999999999, "b": 9999999999} и смотришь, не сломается ли он, и не напишет ли что-нибудь интересное в лог. Ты уже видишь «швы» системы.
  • Белый ящик: Ты открываешь файл sum_service.js и видишь функцию:
    function sum(a, b) {
    return a + b; // Вот эта строчка
    }

    И ты пишешь тест, который проверяет, что sum(2, 3) возвращает 5. А потом ещё тест, который проверяет, что если передать строки, то функция кинет ошибку. Ты тестируешь реализацию, а не фичу.

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