Тестирование «черного», «белого» и «серого ящика»

🔥 Важное для QA-специалистов! 🔥
В QaRocks ты найдешь туториалы, задачи и полезные книги, которых нет в открытом доступе. Уже более 14.000 подписчиков – будь среди нас! Заходи к нам в телеграм канал QaRocks

Тестирование ПО можно разделить на три основных типа: тестирование «черного ящика», «белого ящика» и «серого ящика».

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

В этой статье мы рассмотрим все три метода, их преимущества, недостатки и ключевые отличия.

Содержание:

Что такое тестирование «черного ящика»?

Тестирование методом «черного ящика» фокусируется на внешнем поведении ПО на уровне интерфейса, не требуя знания его внутреннего устройства.

Это означает, что тестировщикам не нужно работать с кодом, алгоритмами или другими техническими деталями.

Они оценивают ПО с точки зрения пользователя, не вникая в процессы, происходящие внутри системы.

Это все равно, что рассматривать ПО как «черный ящик», где важны только входные данные и выходные данные, а не внутренние механизмы работы приложения.

Почему тестирование черного ящика настолько эффективно?

Потому что позволяет имитировать реальный пользовательский опыт. Этот метод помогает выявить проблемы с удобством использования, ошибки в дизайне и другие нюансы, которые могут негативно сказаться на взаимодействии пользователя с программой.

Тестирование методом «черного ящика» применяет ряд методик, среди которых:

  • Эквивалентное разделение — целью такого разделения является уменьшение общего объема тестирования, сохраняя при этом его эффективность, поскольку предполагается, что обработка одного элемента из каждой группы (или раздела) будет представлять обработку всех элементов этой группы.
  • Анализ граничных значений — техника проверки поведения системы на крайних (граничных) значениях входных данных.
  • Таблица принятия решений — создает таблицы входных данных и проверяет, как система реагирует на различные их комбинации.
  • Тестирование перехода состояний — анализирует поведение приложения при изменении входных значений.
  • Попарное тестирование — обеспечивает полное тестовое покрытие, при котором тест-кейсы создаются таким образом, чтобы выполнить все возможные отдельные комбинации каждой пары входных параметров.

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

Тестирование «черного ящика» помогает выявить внешние проблемы в ПО — те, с которыми непосредственно сталкиваются конечные пользователи.

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

Что такое тестирование «белого ящика»?

Тестирование «черного ящика» дает общее представление о работе ПО, но не раскрывает его внутреннюю структуру кода.

Именно здесь на помощь приходит тестирование «белого ящика».

Этот подход позволяет тестировщикам заглянуть внутрь системы, изучая каждый ее аспект: код, инфраструктуру и интеграции.

Такой уровень проверки позволяет тестировщикам получить полное представление о том, как ПО выполняет свои функции.

Именно поэтому тестирование методом «белого ящика» сосредоточено на выявлении следующих ключевых проблем:

  • Уязвимости безопасности
  • Ошибки в логике работы кода
  • Несоответствие ожидаемым результатам
  • Ошибки в циклах
  • Анализ потока данных (Data Flow Testing, DFT)

Для достижения этой цели в тестировании «белого ящика» используются несколько ключевых методик.

Во-первых, покрытие операторов гарантирует, что каждое выражение в коде выполняется и тестируется хотя бы один раз.

Таким образом, этот метод помогает выявить: неиспользуемые операторы; ветки кода, которые никогда не выполняются; “мертвый код”, оставшийся от предыдущих версий программы.

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

Например, код на изображении ниже содержит три условные ветки (A, C и D) и одну безусловную (B).

При покрытии ветвей тестировщики выявляют все возможные условные и безусловные ветвления и пытаются выполнить их все.

Наконец, покрытие путей использует набор тестовых сценариев для проверки всех возможных путей выполнения программы.

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

Что такое тестирование «серого ящика»?

Тестирование методом «серого ящика» — это сочетание методов «черного» и «белого ящика».

Этот подход позволяет тестировщикам анализировать ПО как с точки зрения пользователя, так и с частичным доступом к его внутреннему коду.

Таким образом, тестировщики должны иметь некоторое представление о внутренних механизмах системы, но не настолько глубокое, как при тестировании «белого ящика».

В дополнение к этому они также тестируют сквозные (end-to-end) функции и пользовательские сценарии.

Существует четыре основных метода, которые можно использовать при тестировании «серого ящика»:

  • Матрица тестирования (Matrix testing) — анализирует все переменные в ПО и оценивает их уровень риска. Этот метод помогает выявить неиспользуемые или неоптимизированные переменные.
  • Регрессионное тестирование (Regression testing) — проверяет, не вызвали ли внесенные изменения или исправления багов новые ошибки в системе.
  • Шаблонное тестирование (Pattern testing) — выявляет повторяющиеся дефекты и использует данные об ошибках, чтобы предотвратить их повторное появление в новом коде.
  • Тестирование на основе ортогональных массивов (Orthogonal array testing) — помогает оптимизировать количество и качество тестов, сбалансировать покрытие и усилия. Особенно полезно при ограниченном количестве входных данных, когда их слишком много или они слишком сложны для полного тестирования.

В зависимости от этапа тестирования и особенностей ПО, можно комбинировать эти техники, чтобы выявить все потенциальные проблемы.

В целом, тестирование методом «серого ящика» обеспечивает более широкое покрытие и снижает вероятность появления ошибок, которые могут быть упущены при других методах тестирования.

Различия между «черным», «белым» и «серым» ящиком

В предыдущих разделах мы рассмотрели три различных метода тестирования ПО: тестирование по методу черного ящика, белого ящика и серого ящика.

Давайте теперь разберемся, чем они отличаются друг от друга.

Тестирование «черного ящика» — это метод тестирования, ориентированный на конечного пользователя. Он проверяет интерфейс, пользовательский опыт и функциональные аспекты ПО.

Его также называют функциональным тестированием или тестированием «закрытого ящика», поскольку тестировщику не нужно знать внутреннее устройство системы.

Например, если вы разрабатываете приложение для организации мероприятий, вам необходимо протестировать такие аспекты, как дизайн пользовательского интерфейса, удобство использования и функции онлайн-регистрации.

При этом не требуется знание кода или алгоритмов платформы.

Именно поэтому тестирование «черного ящика» чаще всего выполняют специалисты по обеспечению качества (QA) и конечные пользователи, хотя разработчики также могут участвовать в этом процессе.

С другой стороны, тестирование «белого ящика» является эффективным методом выявления уязвимостей в безопасности, ошибок потока данных и дефектов в менее очевидных сценариях работы.

Этот подход также называют структурным, прозрачным или тестированием «открытого ящика», так как тестировщик имеет доступ к внутреннему устройству системы.

Допустим, вы тестируете видеоигру. Чтобы обеспечить оптимальную производительность и точный рендеринг графики, вам потребуется применить тестирование «белого ящика».

Это означает, что вам нужно погрузиться в код и получить полное представление о взаимодействии различных компонентов игры.

Поскольку тестирование «белого ящика» проводится на уровне исходного кода продукта, тестировщик должен хорошо разбираться в языках программирования, используемых в разработке игры, а также знать принципы безопасного кодирования.

Именно поэтому эффективно выполнить тестирование «белого ящика» может только разработчик, который разбирается в коде и архитектуре тестируемого ПО.

Наконец, в тестировании «серого ящика» тестировщик должен иметь ограниченные знания в программировании.

Однако, поскольку внутреннее функционирование системы частично видно тестировщику, этот тип тестирования часто называют полупрозрачным кодированием.

Тестирование «серого ящика» часто применяется для выявления уязвимостей в безопасности приложения. Тестировщики действуют как пользователи, пытаясь взломать или использовать продукт (метод «чёрного ящика»).

При этом дополнительная информация о внутренней работе системы помогает сфокусироваться на наиболее уязвимых компонентах (метод «белого ящика»).

Например, если бы вы тестировали приложение для доставки еды, вам бы потребовалось использовать тестирование «серого ящика». Оно помогло бы убедиться, что платформа работает корректно, пользователи могут оформлять заказы без проблем, а также что система правильно интегрируется с платёжными шлюзами и API Google Maps.

Для этого нужно понимать, как работает код, но не обязательно быть экспертом во внутренних механизмах ПО.

Именно поэтому разработчики, QA-специалисты и даже продвинутые пользователи могут выполнять тестирование «серого ящика».

Единственное требование — понимание структуры ПО и наличие достаточных технических навыков, чтобы представлять, как оно функционирует.

Разбираясь в различиях между этими методами, вы сможете выбрать оптимальный подход для вашего проекта или конкретного этапа разработки, а также гарантировать стабильную работу ПО.

Когда следует использовать тестирование «чёрного ящика»?

Существует множество ситуаций, когда тестирование «чёрного ящика» оказывается полезным, но есть три основных типа тестирования, где оно проявляет себя наиболее эффективно: функциональное тестирование, нефункциональное тестирование и регрессионное тестирование.

Функциональное тестирование  — это самый распространённый вид тестирования «чёрного ящика».

Оно используется для проверки того, насколько корректно выполняются функции ПО, моделируя действия пользователя через интерфейс.

Например, это может включать проверку кнопок «Назад»  и «Далее»  , чтобы узнать, переносят ли они пользователей назад или вперед по содержимому приложения при нажатии.

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

В то время как функциональное тестирование проверяет, обладает ли ПО необходимыми функциями и возможностями, нефункциональное тестирование  идет дальше.

Оно может проверять такие аспекты, как производительность, масштабируемость, удобство использования и другие характеристики, которые не определяют, что продукт должен уметь делать, а то, насколько хорошо он работает на практике.

Вот почему оно может обнаружить, работает ли ПО без сбоев, например, в таких ситуациях:

  • Пользователям легко понять, как им пользоваться
  • Совместимо с различными устройствами, размерами экранов и браузерами.
  • Оно защищен от угроз безопасности.
  • Хорошо работает при высоких нагрузках

Регрессионное тестирование  — еще один эффективный способ применения тестирования методом «чёрного ящика».

Оно проверяет, сохраняет ли новая версия ПО ту же функциональность, что и предыдущая версия, как показано на изображении ниже.

Это может относиться как к функциональным, так и к нефункциональным аспектам ПО (например, сбои в работе функции, которая в остальном работает плавно, или медленное время загрузки).

В заключение следует отметить, что тестирование «чёрного ящика» является важнейшим методом обеспечения надлежащей работы ПО.

Проводя его, вы сможете выявить потенциальные проблемы на ранней стадии и обеспечить пользователям наилучший опыт.

Когда следует использовать тестирование «белого ящика»?

Тестирование «белого ящика» изучает внутреннюю структуру кода, а не ограничивается лишь проверкой его внешней функциональности.

Это означает, что можно обнаружить ошибки, которые могут привести к сбоям или другим техническим дефектам, а также выявить проблемы безопасности, которые могут сделать ПО уязвимым для внешних атак.

Эта форма тестирования может использоваться в различных случаях, таких как:

  • Unit-тестирование
  • Мутационное тестирование
  • Тестирование на утечки памяти
  • Тестирование на проникновение (пентест) методом «белого ящика»

Unit-тестирование — это самая базовая форма тестирования ПО, поскольку оно проводится разработчиками в процессе написания кода.

Написание и тестирование небольших фрагментов кода облегчает выявление проблем на ранних этапах жизненного цикла разработки ПО.

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

Тестирование на утечки памяти  — еще один важный аспект тестирования методом «белого ящика»,  поскольку утечки памяти могут привести к замедлению работы ПО.

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

Наконец, существует метод «белого ящика» для тестирования на проникновение, где этичные хакеры атакуют код с разных направлений, пытаясь выявить потенциальные угрозы безопасности.

Они просматривают исходный код, подробную информацию о сети и логи сервера.

Как видите, подход «белого ящика» очень тщательный, более подробный, чем другие два типа тестирования.

Однако, оценивая каждую строку кода, вы получаете детальный анализ общей стабильности продукта, что оправдывает себя в долгосрочной перспективе.

Когда следует использовать тестирование «серого ящика»?

Тестирование «серого ящика» стремится найти баланс между тщательностью тестирования «белого ящика» и практичностью тестирования «черного ящика».

Таким образом, это может помочь выявить проблемы, которые могли быть упущены при других типах тестирования.

Вот несколько ситуаций, когда тестирование методом «серого ящика» может быть особенно полезным:

  • Тестирование API или сторонних интеграций
  • Интеграционное тестирование новых функций, добавленных в систему
  • Тестирование на проникновение методом «серого ящика» для выявления уязвимостей безопасности

Во-первых, сторонние системы или API могут стать серьезным препятствием, поскольку вам может быть отказано в полном доступе к исходному коду или внутренней архитектуре этих систем.

Сочетая подходы «черного» и «белого ящика», тестирование «серого ящика» позволяет проверять их снаружи, при этом получая представление о том, что происходит внутри.

Кроме того, если вы добавляете новую функцию в существующую кодовую базу, вы можете не до конца понимать, как этот модуль будет интегрироваться с другими модулями кода.

Используя интеграционное тестирование по методу «серого ящика», вы можете протестировать новую функцию изолированно, а также проверить ее влияние на всю систему.

Не менее важной задачей является выявление уязвимостей безопасности.

С помощью тестирования на проникновение по методу «серого ящика» вы можете проверить потенциальные уязвимости как изнутри, так и снаружи системы, что в конечном итоге позволяет обнаружить больше угроз безопасности.

Как видите, тестирование методом «серого ящика» — это мощный инструмент в вашем арсенале тестирования, который можно использовать для устранения тех скрытых багов, которые могут ускользнуть от обнаружения другими методами.

Заключение

Теперь вы знаете три различных способа тестирования ПО. 

Помните, что все эти методы жизненно важны для процесса тестирования ПО, но главное знать, когда использовать каждый из них.

Тестирование методом «черного ящика» больше подходит для проверки функциональности ПО, а тестирование методом «белого ящика» лучше всего использовать, когда нужно проверить, все ли пути кода охвачены.

Тестирование методом «серого ящика» занимает промежуточное положение, когда необходимо проверить как внутренние, так и внешние аспекты программного обеспечения.

Перевод статьи «Black box vs white box vs grey box testing».

🔥 Какой была ваша первая зарплата в QA и как вы искали первую работу? 

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Читать в телеграм

1 комментарий к “Тестирование «черного», «белого» и «серого ящика»”

  1. Пингбэк: Большой учебник по тестированию

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *