Основы тестирования программного обеспечения


Особенности интеграционного тестирования для процедурного программирования - часть 2


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

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

  • Плоская или иерархическая модель проекта (например, Рис. 4.2, Рис. 4.3).
  • Граф вызовов.

Если программа P состоит из p модулей, то при интеграции модулей в комплекс фактически получается громоздкая плоская (Рис. 4.2) или более простая - иерархическая (Рис. 4.3) - модель программного проекта. В качестве критерия тестирования на интеграционном уровне обычно используется критерий покрытия ветвей C1. Введем также следующие обозначения:

n - число узлов в графе;
e - число дуг в графе;
q - число бинарных выборов из условий ветвления в графе;
kin - число входов в граф;
kout - число выходов из графов;
kext - число точек входа, которые могут быть вызваны извне.

Тогда сложность интеграционного тестирования всей программы P по критерию C1 может быть выражена формулой [17]:

V(P,C1) = ?V(Modi, C1) - kin +kext = e - n - kext + kout = q + kext, (
Modi
P)

Однако при подобном подходе к построению ГМП разработчик тестового набора неизбежно сталкивается с неприемлемо высокой сложностью тестирования V(P,C) для проектов среднего и большого объема (размером в 105 - 107 строк) [18], что следует из роста топологической сложности управляющего графа по МакКейбу. Таким образом, используя плоскую или иерархическую модель, трудно дать оценку тестированности TV(P,C,T) для всего проекта и оценку зависимости тестированности проекта от тестированности отдельного модуля TV(Modi,C), включенного в этот проект.

Рассмотрим вторую модель сборки модулей в процедурном программировании - граф вызовов. В этой модели в случае интеграционного тестирования учитываются только вызовы модулей в программе. Поэтому из множества M(Modi,C) тестируемых элементов можно исключить те элементы, которые не подвержены влиянию интеграции, т. е. узлы и дуги, не соединенные с вызовами модулей: M(Modi,C') = E'

Nin , где E' = {(ni, nj)
E | ni или nj содержит вызовы модулей}, т.е. E' - подмножество ребер графа модуля, а Nin - "входные" узлы графа [17]. Эта модификация ГМП приводит к получению нового графа - графа вызовов, каждый узел в этом графе представляет модуль (процедуру), а каждая дуга - вызов модуля (процедуры). Для процедурного программирования подобный шаг упрощает графовую модель программного проекта до приемлемого уровня сложности. Таким образом, может быть определена цикломатическая сложность упрощенного графа модуля Modi как V'(Modi,C'), а громоздкая формула, выражающая сложность интеграционного тестирования программного проекта, принимает следующий вид [19]:

V'(P,C1') = ? V'(Modi, C1') - kin +kext

Так, для программы, ГМП которой приведена на Рис. 4.2, для получения графа вызовов из иерархической модели проекта должны быть исключены все дуги, кроме:

  1. Дуги 1-2, содержащей входной узел 1 графа G.
  2. Дуг 2-8, 8-7, 7-10, содержащих вызов модуля G1.
  3. Дуг 2-9, 9-7, 7-10, содержащих вызов модуля G2.

В результате граф вызовов примет вид, показанный на Рис. 5.2, а сложность данного графа по критерию C1' равна:

V'(G,C1') = q + Kext =1+1=2.

V'(Modi,C') также называется в литературе сложностью модульного дизайна (complexity of module design) [19].

Граф вызовов модулей

Рис. 5.2.  Граф вызовов модулей

Сумма сложностей модульного дизайна для всех модулей по критерию С1 или сумма их аналогов для других критериев тестирования, исключая значения модулей самого нижнего уровня, дает сложность интеграционного тестирования для процедурного программирования [20].




- Начало -  - Назад -  



Книжный магазин