Предикаты проектирования - Design predicates

Предикаты проектирования - это метод, изобретенный Томасом МакКейбом,[1] для количественной оценки сложности интеграции двух единиц программного обеспечения. Каждому из четырех типов предикатов проекта соответствует рейтинг сложности интеграции. Для фрагментов кода, которые применяют более одного предиката проектирования, оценки сложности интеграции можно объединить.

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

Типы звонков

Безусловный вызов

Блок A всегда вызывает блок B. Его сложность интеграции равна 0. Например:

unitA :: functionA () {unitB-> functionB ();}

Условный вызов

Модуль A может вызывать или не вызывать модуль B. Эта интеграция имеет сложность 1 и требует двух тестов: один, который вызывает B, а другой - нет.

unitA :: functionA () {if (условие) unitB-> functionB ();}

Взаимоисключающий условный вызов

Это похоже на язык программирования оператор переключения. Юнит А вызывает ровно один из нескольких возможных юнитов. Сложность интеграции n - 1, где n - количество возможных единиц для вызова.

unitA :: functionA () {переключатель (условие) {случай 1: unitB-> functionB (); перемена; случай 2: unitC-> functionC (); перемена; ... по умолчанию: unitN-> functionN (); перемена; }}

Итеративный вызов

В итеративном вызове модуль A вызывает модуль B хотя бы один раз, но может и больше. Эта интеграция имеет сложность 1. Для нее также требуются два теста: один, который вызывает модуль B один раз, и один тест, который вызывает его более одного раза.

unitA :: functionA () {делать {unitB-> functionB (); } while (условие);}

Объединение вызовов

Любая конкретная интеграция может сочетать несколько типов вызовов. Например, блок A может или не может вызывать блок B; и если это так, он может вызвать его один или несколько раз. Эта интеграция сочетает в себе условный вызов со сложностью интеграции 1 и итеративный вызов со сложностью интеграции 1. Общая сложность интеграции составляет 2.

unitA :: functionA () {if (someNumber> 0) {for (i = 0; i  functionB (); }}}

Количество тестов

Поскольку количество необходимых тестов равно общей сложности интеграции плюс один, для этой интеграции потребуется 3 теста. В одном, где someNumber не больше 0, блок B не вызывается. В другом случае, где someNumber равно 1, модуль B вызывается один раз. И в финале someNumber больше 1, блок B вызывается более одного раза.

Рекомендации

  1. ^ МакКейб, Томас Дж .; Батлер, Чарльз В. (12 декабря 1989 г.). «Измерение и испытание сложности конструкции». Коммуникации ACM. 32 (12): 1415–1425. Дои:10.1145/76380.76382.

Смотрите также