Что включает в себя white-box тестирование и как оно применяется на практике?

«Что включает в себя white-box тестирование и как оно применяется на практике?» — вопрос из категории Основы тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

White-box (или структурное) тестирование — это метод, при котором тестировщик анализирует внутреннюю структуру и логику кода для разработки тестовых сценариев. Основная цель — достижение высокого покрытия кода и проверка всех возможных путей выполнения.

Ключевые практики и методы:

  1. Анализ покрытия кода (Code Coverage):

    • Покрытие операторов (Statement Coverage): Проверка, был ли выполнен каждый строковый оператор.
    • Покрытие ветвей (Branch Coverage): Проверка всех возможных ветвей условий (if/else, case).
    • Покрытие путей (Path Coverage): Проверка всех возможных уникальных путей выполнения через блок кода (наиболее полное, но часто избыточное).
    • Инструменты анализа: JaCoCo (Java), coverage.py (Python), Istanbul (JavaScript).
  2. Юнит-тестирование как основа: Написание модульных тестов для проверки отдельных функций или методов с знанием их внутренней реализации. Пример на 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)
  3. Тестирование граничных условий и сложной логики: Фокус на значениях на границах допустимых диапазонов (например, 0, MAX_INT, пустые строки, null) и сложных условных конструкциях.

  4. Статический анализ кода: Использование инструментов вроде SonarQube, ESLint, Pylint для автоматического поиска потенциальных ошибок, "запахов кода" (code smells) и уязвимостей безопасности без запуска программы.

Итог: White-box тестирование позволяет создавать целенаправленные и эффективные тесты, которые проверяют не только ожидаемое поведение, но и корректность внутренней реализации, обработку ошибок и все ветвления алгоритма.