Файл: Технология раработки програмного обеспечения УП.pdf

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

 

 
 

126 

ключения.

 

Первое

 

 

патологическая

 

ситуация,

 

когда

 

програм-

ма

 

не

 

имеет

 

решений.

 

Второе

 

встречается

 

в

 

программах

 

или

 

подпрограммах

 

с

 

несколькими

 

точками

 

входа;

 

данный

 

оператор

 

может

 

быть

 

выполнен

 

только

 

в

 

том

 

случае,

 

если

 

выполнение

 

программы

 

начинается

 

с

 

соответствующей

 

точки

 

входа.

 

Так

 

как

 

покрытие

 

операторов

 

считается

 

необходимым

 

условием,

 

по-

крытие

 

решений,

 

которое

 

представляется

 

более

 

сильным

 

крите-

рием,

 

должно

 

включать

 

покрытие

 

операторов.

 

Следовательно,

 

покрытие

 

решений

 

требует,

 

чтобы

 

каждое

 

решение

 

имело

 

ре-

зультатом

 

значение

 

истина

 

или

 

ложь

 

и

 

при

 

этом

 

каждый

 

опе-

ратор

 

выполнялся

 

бы,

 

по

 

крайней

 

мере,

 

один

 

раз.

 

Альтернатив-

ный

 

и

 

более

 

легкий

 

способ

 

выражения

 

этого

 

требования

 

состоит

 

в

 

том,

 

чтобы

 

каждое

 

решение

 

имело

 

результатом

 

значение

 

исти-

на

 

или

 

ложь

 

и

 

что

 

каждой

 

точке

 

входа

 

должно

 

быть

 

передано

 

управление

 

при

 

вызове

 

программы,

 

по

 

крайней

 

мере,

 

один

 

раз.

 

Изложенное

 

выше

 

предполагает

 

только

 

двузначные

 

ре-

шения

 

или

 

переходы

 

и

 

должно

 

быть

 

модифицировано

 

для

 

про-

грамм,

 

содержащих

 

многозначные

 

решения.

 

Примерами

 

таких

 

программ

 

являются:

 

 

программы

 

на

 

PL/1,

 

включающие

 

операторы

 

SELECT

 

(CASE)

 

или

 

операторы

 

GO

 

TO,

 

использующие

 

метку-

переменную;

 

 

программы

 

на

 

Фортране

 

с

 

вычисляемыми

 

операторами

 

GO

 

TO

 

или

 

операторами

 

GO

 

TO

 

по

 

предписанию;

 

 

программы

 

на

 

Бейсике

 

с

 

вычисляемыми

 

операторами

 

ON

 

 

GOTO,

 

ON

 

 

GOSUB;

 

 

программы

 

на

 

Коболе,

 

содержащие

 

операторы

 

GO

 

TO

 

вместе

 

с

 

ALTER

 

или

 

операторы

 

GO

 

ТО

 

 

DEPENDING

 

 

ON;

 

 

программы

 

на

 

Паскале,

 

использующие

 

операторы

 

CASE;

 

 

программы

 

на

 

языке

 

Си,

 

использующие

 

операторы

 

SWITCH

 

 

CASE;

 

 

любые

 

программы

 

с

 

арифметическими

 

операторами

 

IF.

 

Критерием

 

для

 

них

 

является

 

выполнение

 

каждого

 

воз-

можного

 

результата

 

всех

 

решений,

 

по

 

крайней

 

мере,

 

один

 

раз

 

и

 


background image

 

 

 
 

127 

передача

 

управления

 

при

 

вызове

 

программы

 

или

 

подпрограммы

 

каждой

 

точке

 

входа,

 

по

 

крайней

 

мере,

 

один

 

раз.

 

В

 

программе,

 

представленной

 

на

 

рис.

 

6.5,

 

покрытие

 

ре-

шений

 

может

 

быть

 

выполнено

 

двумя

 

тестами,

 

покрывающими

 

либо

 

пути

 

асе

 

и

 

abd,

 

либо

 

пути

 

acd

 

и

 

аbе.

 

Если

 

мы

 

выбираем

 

последнее

 

альтернативное

 

покрытие,

 

то

 

входами

 

двух

 

тестов

 

являются

 

A

 

=

 

3,

 

B

 

=

 

0,

 

X

 

=

 

3

 

и

 

A

 

=

 

2,

 

B

 

=

 

1,

 

X

 

=

 

1.

 

Покрытие

 

решений

 

 

более

 

сильный

 

критерий,

 

чем

 

по-

крытие

 

операторов,

 

но

 

и

 

он

 

имеет

 

свои

 

недостатки.

 

Например,

 

путь,

 

где

 

Х

 

не

 

изменяется

 

(если

 

выбрано

 

первое

 

альтернативное

 

покрытие),

 

будет

 

проверен

 

с

 

вероятностью

 

50 %.

 

Если

 

во

 

вто-

ром

 

решении

 

существует

 

ошибка

 

(например,

 

Х<1

 

вместо

 

Х>1),

 

то

 

ошибка

 

не

 

будет

 

обнаружена

 

двумя

 

тестами

 

предыдущего

 

примера.

 

6.4.1.3 Покрытие условий 

Лучшим

 

критерием

 

по

 

сравнению

 

с

 

предыдущим

 

является

 

покрытие

 

условий.

 

В

 

этом

 

случае

 

записывают

 

число

 

тестов,

 

достаточное

 

для

 

того,

 

чтобы

 

все

 

возможные

 

результаты

 

каждо-

го

 

условия

 

в

 

решении

 

выполнялись,

 

по

 

крайней

 

мере,

 

один

 

раз.

 

Поскольку,

 

как

 

и

 

при

 

покрытии

 

решений,

 

это

 

покрытие

 

не

 

все-

гда

 

приводит

 

к

 

выполнению

 

каждого

 

оператора,

 

к

 

критерию

 

требуется

 

дополнение,

 

которое

 

заключается

 

в

 

том,

 

что

 

каждой

 

точке

 

входа

 

в

 

программу

 

или

 

подпрограмму,

 

а

 

также

 

ON-едини

-

цам

 

должно

 

быть

 

передано

 

управление

 

при

 

вызове,

 

по

 

крайней

 

мере,

 

один

 

раз.

 

Например,

 

оператор

 

цикла

 

в

 

языке

 

Фортран

 

DO 

К=0 ТО 50 WHILE (J+K<QUEST); 

или

 

его

 

аналог

 

на

 

языке

 

Си

 

for(K=0; K<=50 && J+K<QUEST; K++) 

содержит

 

два

 

условия:

 

К

 

меньше

 

или

 

равно

 

50

 

и

 

J+K

 

меньше,

 

чем

 

QUEST.

 

Следовательно,

 

здесь

 

требуются

 

тесты

 

для

 

ситуа-

ций

 

K

≤50,

 

K>50

 

(т.е.

 

выполнение

 

последней

 

итерации

 

цикла),

 

J+K<QUEST

 

и

 

J+K

QUEST.

 

Программа

 (

рис.

 

6.5)

 

имеет

 

четыре

 

условия:

 

А

 

>

 

1,

 

В

 

=

 

0,

 

А

 

=

 

2

 

и

 

X

 

>

 

1.

 

Следовательно,

 

требуется

 

достаточное

 

число

 

тес-

тов,

 

такое,

 

чтобы

 

реализовать

 

ситуации,

 

где

 

A

 

>

 

1,

 

A

 

 

1,

 

B

 

=

 

0

 

и

  


background image

 

 

 
 

128 

B

 

 

0

 

в

 

точке

 

a

 

и

 

A

 

=

 

2,

 

A

 

 

2

 

и

 

X

 

>

 

1

 

в

 

точке

 

b.

 

Тесты,

 

удовле-

творяющие

 

критерию

 

покрытия

 

условий,

 

и

 

соответствующие

 

им

 

пути:

 

 

1.

 

A

 

=

 

2,

 

В

 

=

 

0,

 

Х

 

=

 

4

 

 

ace.

 

 

2.

 

А

 

=

 

1,

 

B

 

=

 

1,

 

Х

 

=

 

1

 

 

abd.

 

Заметим,

 

что

 

хотя

 

аналогичное

 

число

 

тестов

 

для

 

этого

 

примера

 

уже

 

было

 

создано,

 

покрытие

 

условий

 

обычно

 

лучше

 

покрытия

 

решений,

 

поскольку

 

оно

 

может

 

(но

 

не

 

всегда)

 

вы-

звать

 

выполнение

 

решений

 

в

 

условиях,

 

не

 

реализуемых

 

при

 

пе-

рекрытии

 

решений.

 

Например,

 

рассмотренные

 

выше

 

операторы

 

представляют

 

собой

 

двузначный

 

переход

 

(либо

 

выполняется

 

тело

 

цикла,

 

либо

 

выход

 

из

 

цикла).

 

Если

 

использовать

 

тестиро-

вание

 

решений,

 

то

 

достаточно

 

выполнить

 

цикл

 

при

 

изменении

 

K

 

от

 

0

 

до

 

51

 

без

 

проверки

 

случая,

 

когда

 

второе

 

условие

 

ложно.

 

Однако

 

при

 

критерии

 

покрытия

 

условий

 

необходим

 

тест,

 

кото-

рый

 

реализовал

 

бы

 

результат

 

«ложь»

 

условия

 

J+K<QUEST.

 

Хотя

 

применение

 

критерия

 

покрытия

 

условий

 

на

 

первый

 

взгляд

 

удовлетворяет

 

критерию

 

покрытия

 

решений,

 

это

 

не

 

все-

гда

 

так.

 

Если

 

тестируется

 

решение

 

IF

 

(A&B),

 

то

 

при

 

критерии

 

покрытия

 

условий

 

требовались

 

бы

 

два

 

теста

 

 

A

 

есть

 

истина,

 

B

 

есть

 

ложь

 

и

 

A

 

есть

 

ложь,

 

B

 

есть

 

истина.

 

Но

 

в

 

этом

 

случае

 

не

 

выполнялось

 

бы

 

THEN-предложение

 

оператора

 

IF.

 

Тесты

 

кри-

терия

 

покрытия

 

условий

 

для

 

ранее

 

рассмотренного

 

примера

 

по-

крывают

 

результаты

 

всех

 

решений,

 

но

 

это

 

только

 

случайное

 

совпадение.

 

Например,

 

два

 

альтернативных

 

теста

 

 

1.

 

A

 

=

 

1,

 

В

 

=

 

0,

 

Х

 

=

 

3

 

 

2.

 

А

 

=

 

2,

 

В

 

=

 

1,

 

Х

 

=

 

1

 

покрывают

 

результаты

 

всех

 

условий,

 

но

 

только

 

два

 

из

 

четырех

 

результатов

 

решений

 

(они

 

оба

 

покрывают

 

путь

 

abe

 

и,

 

следова-

тельно,

 

не

 

выполняют

 

результат

 

истина

 

первого

 

решения

 

и

 

ре-

зультат

 

ложь

 

второго

 

решения).

 

6.4.1.4 Покрытие решений/условий 

Очевидным

 

следствием

 

из

 

этой

 

дилеммы

 

является

 

крите-

рий,

 

названный

 

покрытием

 

решений/условий.

 

Он

 

требует

 

такого

 

достаточного

 

набора

 

тестов,

 

чтобы

 

все

 

возможные

 

результаты

 


background image

 

 

 
 

129 

каждого

 

условия

 

в

 

решении

 

выполнялись,

 

по

 

крайней

 

мере,

 

один

 

раз,

 

все

 

результаты

 

каждого

 

решения

 

выполнялись,

 

по

 

крайней

 

мере,

 

один

 

раз

 

и

 

каждой

 

точке

 

входа

 

передавалось

 

управление,

 

по

 

крайней

 

мере,

 

один

 

раз.

 

Недостатком

 

критерия

 

покрытия

 

решений/условий

 

явля-

ется

 

невозможность

 

его

 

применения

 

для

 

выполнения

 

всех

 

ре-

зультатов

 

всех

 

условий;

 

часто

 

подобное

 

выполнение

 

имеет

 

ме-

сто

 

вследствие

 

того,

 

что

 

определенные

 

условия

 

скрыты

 

други-

ми

 

условиями.

 

В

 

качестве

 

примера

 

рассмотрим

 

приведенную

 

на

 

рис.

 

6.6

 

схему

 

передач

 

управления

 

в

 

машинном

 

коде

 

програм-

мы

 

на  рис.

 

6.5.

 

Многоусловные

 

решения

 

исходной

 

программы

 

здесь

 

разбиты

 

на

 

отдельные

 

решения

 

и

 

переходы,

 

поскольку

 

большинство

 

машин

 

не

 

имеет

 

команд,

 

реализующих

 

решения

 

с

 

многими

 

исходами.

 

Наиболее

 

полное

 

покрытие

 

тестами

 

в

 

этом

 

случае

 

осуществляется

 

таким

 

образом,

 

чтобы

 

выполнялись

 

все

 

возможные

 

результаты

 

каждого

 

простого

 

решения.

 

Два

 

предыдущих

 

теста

 

критерия

 

покрытия

 

решений

 

не

 

выполняют

 

этого.

 

Они

 

недостаточны

 

для

 

выполнения

 

результа-

та

 

«ложь»

 

решения

 

Н

 

и

 

результата

 

«истина»

 

решения

 

К.

 

Набор

 

тестов

 

для

 

критерия

 

покрытия

 

условий

 

такой

 

программы

 

также

 

является

 

неполным

 

 

два

 

теста

 

(которые

 

случайно

 

удовлетво-

ряют

 

также

 

и

 

критерию

 

покрытия

 

решений/условий)

 

не

 

вызы-

вают

 

выполнения

 

результата

 

«ложь»

 

решения

 

I

 

и

 

результата

 

«истина»

 

решения

 

К.

 

Причина

 

этого

 

заключается

 

в

 

том,

 

что,

 

как

 

показано

 

на

 

рис.

 

6.6,

 

результаты

 

условий

 

в

 

выражениях

 

и

 

и

 

или

 

могут

 

скры-

вать

 

и

 

блокировать

 

действие

 

других

 

условий.

 

Например,

 

если

 

условие

 

и

 

есть

 

ложь,

 

то

 

никакое

 

из

 

последующих

 

условий

 

в

 

выражении

 

не

 

будет

 

выполнено.

 

Аналогично,

 

если

 

условие

 

или

 

есть

 

истина,

 

то

 

никакое

 

из

 

последующих

 

условий

 

не

 

будет

 

вы-

полнено.

 

Следовательно,

 

критерии

 

покрытия

 

условий

 

и

 

покры-

тия

 

решений/условий

 

недостаточно

 

чувствительны

 

к

 

ошибкам

 

в

 

логических

 

выражениях.

 


background image

 

 

 
 

130 

 

Рис.

 

6.6

 

 

Машинный

 

код

 

программы,

 

изображенной

 

на

 

рис.

 

6.5

 

6.4.1.5 Комбинаторное покрытие условий 

Критерием,

 

который

 

решает

 

эти

 

и

 

некоторые

 

другие

 

про-

блемы,

 

является

 

комбинаторное

 

покрытие

 

условий.

 

Он

 

требует

 

создания

 

такого

 

числа

 

тестов,

 

чтобы

 

все

 

возможные

 

комбина-

ции

 

результатов

 

условия

 

в

 

каждом

 

решении

 

и

 

во

 

всех

 

точках

 

входа

 

выполнялись,

 

по

 

крайней

 

мере,

 

один

 

раз.

 

Например,

 

в

 

приведенной

 

ниже

 

последовательности

 

операторов

 

существуют

 

четыре

 

ситуации,

 

которые

 

должны

 

быть

 

протестированы:

 

NOTFOUND = ’1’ 

В; 

/* 

поиск в таблице */ 

DO I=1 

ТО TABSIZE WHILE (NOTFOUND); 

 /* 

последовательность операторов, реализующая 

    

процедуру поиска */ 

END; 
 

A

 > 

1

 

X

 = 

X/A

 

No

 

Yes

 

B

 = 

0

 

Yes

 

No

 

A

 = 

2

 

X

 > 

1

 

X

 = 

X

 + 

1

 

No

 

No

 

Yes

 

Yes