Ответ
Эти подходы различаются уровнем знания тестировщиком внутреннего устройства тестируемой системы (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. А потом ещё тест, который проверяет, что если передать строки, то функция кинет ошибку. Ты тестируешь реализацию, а не фичу.
Вот и вся разница, ёпта. Чёрный — снаружи, серый — в прихожую заглянул, белый — разобрал весь дом по кирпичику и каждый проверил на прочность.