Ответ
White-box (или структурное) тестирование — это метод, при котором тестировщик анализирует внутреннюю структуру и логику кода для разработки тестовых сценариев. Основная цель — достижение высокого покрытия кода и проверка всех возможных путей выполнения.
Ключевые практики и методы:
-
Анализ покрытия кода (Code Coverage):
- Покрытие операторов (Statement Coverage): Проверка, был ли выполнен каждый строковый оператор.
- Покрытие ветвей (Branch Coverage): Проверка всех возможных ветвей условий (if/else, case).
- Покрытие путей (Path Coverage): Проверка всех возможных уникальных путей выполнения через блок кода (наиболее полное, но часто избыточное).
- Инструменты анализа: JaCoCo (Java), coverage.py (Python), Istanbul (JavaScript).
-
Юнит-тестирование как основа: Написание модульных тестов для проверки отдельных функций или методов с знанием их внутренней реализации. Пример на Python (pytest):
def calculate_discount(price, is_member): """Применяет скидку 10% для участников.""" if not isinstance(price, (int, float)) or price < 0: raise ValueError("Price must be a non-negative number.") if is_member: return price * 0.9 return price # Тест на корректный расчет скидки (happy path) def test_discount_for_member(): assert calculate_discount(100, True) == 90 # Тест на отсутствие скидки (другая ветвь логики) def test_no_discount_for_non_member(): assert calculate_discount(100, False) == 100 # Тест на обработку некорректных входных данных (проверка исключений) def test_invalid_price_raises_error(): with pytest.raises(ValueError): calculate_discount(-50, True) -
Тестирование граничных условий и сложной логики: Фокус на значениях на границах допустимых диапазонов (например,
0,MAX_INT, пустые строки,null) и сложных условных конструкциях. -
Статический анализ кода: Использование инструментов вроде SonarQube, ESLint, Pylint для автоматического поиска потенциальных ошибок, "запахов кода" (code smells) и уязвимостей безопасности без запуска программы.
Итог: White-box тестирование позволяет создавать целенаправленные и эффективные тесты, которые проверяют не только ожидаемое поведение, но и корректность внутренней реализации, обработку ошибок и все ветвления алгоритма.