Рекомендация: Проект тестирования
Эта рекомендация посвящена планированию и разработке тестов.
Взаимосвязи
Основное описание

Объяснение

Ясное понимание пожеланий пользователя по работе программного обеспечения позволяет наилучшим образом спроектировать программное обеспечение для пользователя. Тестовые наборы отражают требования, которые необходимо проверить. Собственно проверка требований может выполняться другим способом и другими людьми. Например, проверка работоспособности и производительности программного обеспечения может быть выполнена в автоматизированных тестах, проверка последовательности выключения системы может быть выполнена вручную, а исследования продаж и рынка (в том, что относится к продукту) можно выполнить, сравнив продажи продукта и его конкурирующих продуктов.

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

Создание тестового набора важно по нескольким причинам.

  • Тестовые наборы составляют основание для проектирования и разработки сценариев тестирования.
  • Объем тестирования обычно пропорционален числу тестовых наборов. Чем больше тестовых наборов, тем большей будет достоверность тестирования, поскольку каждый тестовый набор отвечает различному сценарию, условию или потоку выполнения продукта.
  • Основным показателем полноты теста является полнота охвата требований, которая зависит от числа сформулированных и реализованных тестовых наборов. Конечно, если вы выполнили и проверили 95 процентов критических тестовых наборов, то это совсем не одно и то же, что 95 процентов тестов, которые еще предстоит выполнить.
  • Масштаб тестирования можно считать пропорциональным числу тестовых наборов. При правильной структуре тестовых наборов можно точнее оценить время, которое потребуется для выполнения последующих этапов цикла тестирования.
  • Варианты проектирования и разработки тестов и требуемые для тестирования ресурсы также зависят от числа и сложности тестовых наборов.

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

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

Создание тестового набора для полнофункционального тестирования

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

Тестирование методом прозрачного ящика

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

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

  • Каждое булевское выражение может иметь значение true или false. Например, (a<3) OR (b>4) сводится к четырем вариантам true или false
  • Каждый бесконечный цикл должен быть выполнен ноль, один и более раз.

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

Пример:

Предположим, что мы выполняем структурный тест функции member класса Set of Integers. Тест, выполняемый с помощью бинарного поиска, проверяет, входит ли в набор заданное целое число.

Диаграмма, описанная в тексте.

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

Теоретически полный тест операции предполагает, что тестовый набор должен пройти все сочетания путей в коде. В функции member есть три пути в цикле while. Тестовый набор может пройти цикл несколько раз или ни одного раза. Если цикл не проходится в тестовом наборе, то в коде будет только один путь. Если цикл проходится один раз, то - три пути. Если два раза - то шесть путей и т.д. Таким образом, полное число путей будет 1+3+6+12+24+48+..., то есть слишком большое число сочетаний, которым невозможно управлять. Поэтому необходимо ограничиться подмножеством всех путей. В этом примере два тестовые набора позволяют проверить, что все операторы выполняются хотя бы один раз. В одном из тестовых наборов можно задать Set of Integers = {1,5,7,8,11} и t = 3 как данные теста. В другом тестовом наборе можно задать Set of Integers = {1,5,7,8,11} и t = 8.

За дополнительной информацией обратитесь к разделу Методика: полнофункциональное тестирование.

Тестирование методом черного ящика

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

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

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

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

Тестовые наборы, основанные на входных аргументах

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

  • Обычные значения из каждого эквивалентного набора.
  • Граничные значения из каждого эквивалентного набора.
  • Внешние значения.
  • Недопустимые значения.

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

Тестовые наборы, основанные на выходных аргументах

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

  • Обычные значения из каждого эквивалентного набора.
  • Граничные значения из каждого эквивалентного набора.
  • Внешние значения.
  • Недопустимые значения.

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

Если объект работает по-разному в зависимости от состояния, в котором он находится, то следует использовать таблицу состояний, подобную показанной на рисунке.

Диаграмма, описанная в тексте.

Таблица состояния для тестирования. Она позволяет протестировать все сочетания состояний и воздействий.

За дополнительной информацией обратитесь к разделу Методика: полнофункциональное тестирование.