Предикаты проектирования
Предикаты проектирования — это метод, изобретенный Томасом Маккейбом. [1] количественно оценить сложность интеграции двух единиц программного обеспечения. Каждому из четырех типов предикатов проектирования соответствует рейтинг сложности интеграции. Для фрагментов кода, в которых применяется более одного предиката проектирования, оценки сложности интеграции могут быть объединены.
Сумма сложности интеграции для единицы кода плюс один представляет собой максимальное количество тестовых примеров, необходимых для полной реализации интеграции. Хотя инженер по тестированию обычно может уменьшить это, охватывая как можно больше ранее обнаруженных предикатов проектирования в каждом новом тесте. Кроме того, некоторые комбинации предикатов проектирования могут быть логически невозможными.
Типы звонков
[ редактировать ]Безусловный вызов
[ редактировать ]Модуль A всегда вызывает модуль B. Его сложность интегрирования равна 0. Например:
unitA::functionA() { unitB->functionB(); }
Условный вызов
[ редактировать ]Модуль A может вызывать или не вызывать модуль B. Эта интеграция имеет сложность 1 и требует двух тестов: один вызывает B, а другой нет.
unitA::functionA() { if (condition) unitB->functionB(); }
Взаимоисключающий условный вызов
[ редактировать ]языка программирования Это похоже на оператор переключения . Модуль A вызывает ровно один из нескольких возможных модулей. Сложность интеграции равна n - 1, где n — количество возможных единиц вызова.
unitA::functionA() { switch (condition) { case 1: unitB->functionB(); break; case 2: unitC->functionC(); break; ... default: unitN->functionN(); break; } }
Итеративный вызов
[ редактировать ]При итеративном вызове модуль A вызывает модуль B хотя бы один раз, а может быть и больше. Эта интеграция имеет сложность 1. Она также требует двух тестов: один, который вызывает модуль B один раз, и один тест, который вызывает его более одного раза.
unitA::functionA() { do { unitB->functionB(); } while (condition); }
Объединение вызовов
[ редактировать ]Любая конкретная интеграция может объединять несколько типов вызовов. Например, подразделение А может позвонить или не позвонить подразделению Б; и если да, то он может вызвать его один или несколько раз. Эта интеграция объединяет условный вызов со сложностью интеграции 1 и итеративный вызов со сложностью интеграции 1. Общая сложность интеграции составляет 2.
unitA::functionA() { if (someNumber > 0) { for ( i = 0 ; i < someNumber ; i++ ) { unitB->functionB(); } } }
Количество тестов
[ редактировать ]Этот раздел может сбивать с толку или быть неясным для читателей . В частности, как метрика сложности каким-либо образом связана с количеством тестов. ( Май 2014 г. ) |
Поскольку количество необходимых тестов равно общей сложности интеграции плюс один, для этой интеграции потребуется 3 теста. В одном, где someNumber не больше 0, модуль B не вызывается. В другом случае, где someNumber равен 1, модуль B вызывается один раз. И в финале someNumber больше 1, модуль B вызывается более одного раза.
Ссылки
[ редактировать ]- ^ Маккейб, Томас Дж.; Батлер, Чарльз В. (12 декабря 1989 г.). «Измерение и тестирование сложности конструкции» . Коммуникации АКМ . 32 (12): 1415–1425. дои : 10.1145/76380.76382 . S2CID 14112936 .