Особенности интеграционного тестирования для процедурного программирования
Процесс построения набора тестов при структурном тестировании определяется принципом, на котором основывается конструирование Графа Модели Программы (ГМП). От этого зависит множество тестовых путей и генерация тестов, соответствующих тестовым путям.
Первым подходом к разработке программного обеспечения является процедурное (модульное) программирование. Традиционное процедурное программирование предполагает написание исходного кода в императивном (повелительном) стиле, предписывающем определенную последовательность выполнения команд, а также описание программного проекта с помощью функциональной декомпозиции. Такие языки, как Pascal и C, являются императивными. В них порядок исходных строк кода определяет порядок передачи управления, включая последовательное исполнение, выбор условий и повторное исполнение участков программы. Каждый модуль имеет несколько точек входа (при строгом написании кода - одну) и несколько точек выхода (при строгом написании кода - одну). Сложные программные проекты имеют модульно-иерархическое построение [5], и тестирование модулей является начальным шагом процесса тестирования ПО. Построение графовой модели модуля является тривиальной задачей, а тестирование практически всегда проводится по критерию покрытия ветвей C1, т.е. каждая дуга и каждая вершина графа модуля должны содержаться, по крайней мере, в одном из путей тестирования.
Таким образом, M(P,C1) = E Nij , где Е - множество дуг, а Nij - входные вершины ГМП.
Сложность тестирования модуля по критерию С1 выражается уточненной формулой для оценки топологической сложности МакКейба [10]:
V(P,C1) = q + kin, где q - число бинарных выборов для условий ветвления, а kin - число входов графа.
Для интеграционного тестирования наиболее существенным является рассмотрение модели программы, построенной с использованием диаграмм потоков управления. Контролируются также связи через данные, подготавливаемые и используемые другими группами программ при взаимодействии с тестируемой группой. Каждая переменная межмодульного интерфейса проверяется на тождественность описаний во взаимодействующих модулях, а также на соответствие исходным программным спецификациям.
Состав и структура информационных связей реализованной группы модулей проверяются на соответствие спецификации требований этой группы. Все реализованные связи должны быть установлены, упорядочены и обобщены.
При сборке модулей в единый программный комплекс появляется два варианта построения графовой модели проекта:
- Плоская или иерархическая модель проекта (например, Рис. 4.2, Рис. 4.3).
- Граф вызовов.
n - число узлов в графе; |
e - число дуг в графе; |
q - число бинарных выборов из условий ветвления в графе; |
kin - число входов в граф; |
kout - число выходов из графов; |
kext - число точек входа, которые могут быть вызваны извне. |
Тогда сложность интеграционного тестирования всей программы P по критерию C1 может быть выражена формулой [17]:
V(P,C1) = ?V(Modi, C1) - kin +kext = e - n - kext + kout = q + kext, (


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


V'(P,C1') = ? V'(Modi, C1') - kin +kext Так, для программы, ГМП которой приведена на Рис. 4.2, для получения графа вызовов из иерархической модели проекта должны быть исключены все дуги, кроме:
- Дуги 1-2, содержащей входной узел 1 графа G.
- Дуг 2-8, 8-7, 7-10, содержащих вызов модуля G1.
- Дуг 2-9, 9-7, 7-10, содержащих вызов модуля G2.
V'(G,C1') = q + Kext =1+1=2. V'(Modi,C') также называется в литературе сложностью модульного дизайна (complexity of module design) [19].

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