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

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

 
 

91

При

таком

подходе

обнаружение

всех

ошибок

в

програм-

ме

является

критерием

исчерпывающего

входного

тестирова-

ния.

Последнее

может

быть

достигнуто,

если

в

качестве

тесто-

вых

наборов

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

все

возможные

наборы

входных

дан-

ных.

Поэтому

для

тестирования

даже

небольшой

программы

требуется

бесконечное

число

тестов.

Как

пример

можно

при-

вести

задачу

о

треугольниках.

Даны

три

числа

A,

B

и

C.

Тре-

буется

определить,

могут

ли

эти

числа

являться

длинами

сторон

треугольника,

и

если

да,

то

является

ли

этот

треугольник

пря-

моугольным,

равнобедренным

или

равносторонним.

Очевидно,

что

если

A,

B

и

C

являются

вещественными

числами,

то

имеет-

ся

бесконечное

количество

комбинаций

их

значений.

Если

такое

испытание

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

сложным,

то

еще

сложнее

создать

исчерпывающий

тест

для

большой

программы.

Образно

говоря,

число

тестов

можно

оценить

«числом,

боль-

шим,

чем

бесконечность».

Из

изложенного

следует,

что

построение

исчерпывающе-

го

входного

теста

невозможно.

Это

подтверждается

двумя

ар-

гументами:

во-первых,

нельзя

создать

тест,

гарантирующий

от-

сутствие

ошибок;

во-вторых,

разработка

таких

тестов

противо-

речит

экономическим

требованиям.

Поскольку

исчерпывающее

тестирование

исключается,

нашей

целью

должна

стать

макси-

мизация

результативности

капиталовложений

в

тестирование

(иными

словами,

максимизация

числа

ошибок,

обнаруживае-

мых

одним

тестом).

Для

этого

мы

можем

рассматривать

внут-

реннюю

структуру

программы

и

делать

некоторые

разумные,

но,

конечно,

не

обладающие

полной

гарантией

достоверности

предположения.

6.2.2 Тестирование программы как белого ящика 

Стратегия

белого

ящика,

или

стратегия

тестирования,

управляемого

логикой

программы,

позволяет

исследовать

внут-

реннюю

структуру

программы.

В

этом

случае

тестирующий

получает

тестовые

данные

путем

анализа

логики

программы


background image

 
 

92

сожалению,

здесь

часто

не

используется

спецификация

про-

граммы).

Сравним

способ

построения

тестов

при

данной

стратегии

с

исчерпывающим

входным

тестированием

стратегии

черного

ящика.

Непосвященному

может

показаться,

что

достаточно

по-

строить

такой

набор

тестов,

в

котором

каждый

оператор

испол-

няется

хотя

бы

один

раз;

нетрудно

показать,

что

это

неверно.

Не

вдаваясь

в детали,

укажем

лишь,

что

исчерпывающему

вход-

ному

тестированию

может

быть

поставлено

в

соответствие

ис-

черпывающее

  

тестирование

маршрутов.

Подразумевается,

что

программа

проверена

полностью,

если

с

помощью

тестов

уда-

ется

осуществить

выполнение

этой

программы

по

всем

возмож-

ным

маршрутам

ее

потока

(графа)

передач

управления.

Последнее

утверждение

имеет

два

слабых

пункта.

Один

из

них

состоит

в

том,

что

число

не

повторяющих

друг

друга

маршрутов

в

программе

астрономическое.

Чтобы

убедиться

в

этом,

рассмотрим

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

на

рис.

6.1

граф

передач

управления

простейшей

программы.

Каждая

вершина

или

кру-

жок

обозначают

участок

программы,

содержащий

последова-

тельность

линейных

операторов,

которая

может

заканчиваться

оператором

ветвления.

Дуги,

оканчивающиеся

стрелками,

соот-

ветствуют

передачам

управления.

По-видимому,

граф

описыва-

ет

программу

из

10–20

операторов,

включая

цикл

DO,

который

исполняется

не

менее

20

раз.

Внутри

цикла

имеется

несколько

операторов

IF.

Для

того,

чтобы

определять

число

неповторяю-

щихся

маршрутов

при

исполнении

программы,

подсчитаем

число

неповторяющихся

маршрутов

из

точки

A

в

B

в

предпо-

ложении,

что

все

приказы

взаимно

независимы.

Это

число

вы-

числяется

как

сумма

5

20

+

5

19

+

 … 

+

5

1

=

100

триллионов,

где

            

5

число

путей

внутри

цикла.

Приведем

такой

пример:

если

допустить,

что

на

составление

каждого

теста

мы

тратим

пять

минут,

то

для

построения

набора

тестов

нам

потребуется

при-

мерно

один

миллиард

лет.


background image

 
 

93

Рис.

6.1

Граф

передач

управления

небольшой

программы

Второй

слабый

пункт

утверждения

заключается

в

том,

что,

хотя

исчерпывающее

тестирование

маршрутов

является

полным

тестом

и

хотя

каждый

маршрут

программы

может

быть

проверен,

сама

программа

может

содержать

ошибки.

Это

объ-

ясняется

следующим

образом.

Во-первых,

исчерпывающее

тес-

тирование

маршрутов

не

может

дать

гарантии

того,

что

про-

грамма

соответствует

описанию.

Например,

вместо

требуемой

программы

сортировки

по

возрастанию

случайно

была

написа-

на

программа

сортировки

по

убыванию.

В

этом

случае

ценность

тестирования

маршрутов

невелика,

поскольку

после

тестирова-

ния

в

программе

окажется

одна

ошибка,

т.е.

программа

неверна.

Во-вторых,

программа

может

быть

неверной

в

силу

того,

что

пропущены

некоторые

маршруты.

Исчерпывающее

тестирова-

ние

маршрутов

не

обнаружит

их

отсутствия.

В-третьих,

исчер-

пывающее

тестирование

маршрутов

не

может

обнаружить

оши-

бок,

появление

которых

зависит

от

обрабатываемых

данных.

≤ 20 

раз 


background image

 
 

94

Существует

множество

примеров

таких

ошибок.

Приведем

один

из

них.

Допустим,

в

программе

необходимо

выполнить

сравнение

двух

чисел

на

сходимость,

т.е.

определить,

является

ли

разность

между

двумя

числами

меньше

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

оп-

ределенного

числа.

Может

быть

написано

выражение

IF ((A – B) < EPSILON)… 

Безусловно,

оно

содержит

ошибку,

поскольку

необходимо

выполнить

сравнение

абсолютных

величин.

Однако

обнаруже-

ние

этой

ошибки

зависит

от

значений,

использованных

для

A

и

B,

и

ошибка

не

обязательно

будет

обнаружена

просто

путем

исполнения

каждого

маршрута.

В

заключение

отметим,

что,

хотя

исчерпывающее

входное

тестирование

предпочтительнее

исчерпывающего

тестирования

маршрутов,

ни

то,

ни

другое

не

могут

стать

полезными

страте-

гиями,

потому

что

оба

они

нереализуемы.

Возможно,

поэтому

реальным

путем,

который

позволит

создать

хорошую,

но,

ко-

нечно,

не

абсолютную

стратегию,

является

сочетание

тестиро-

вания

программы

и

как

черного,

и

как

белого

ящиков.

Этот

во-

прос

обсуждается

в

п.

6.4.

6.2.3 Принципы тестирования 

Сформулируем

основные

принципы

тестирования,

ис-

пользуя

главную

предпосылку

настоящего

раздела

о

том,

что

наиболее

важными

в

тестировании

программ

являются

вопросы

психологии.

Эти

принципы

интересны

тем,

что

в

основном

они

интуитивно

ясны,

но,

в

то

же

время,

на

них

часто

не

обращают

должного

внимания.

Описание

предполагаемых

значений

выходных

данных

или

результатов

должно

быть

необходимой

частью

тестового

набора.

Нарушение

этого

очевидного

принципа

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

од-

ну

из

наиболее

распространенных

ошибок.

Ошибочные,

но

правдоподобные

результаты

могут

быть

признаны

правильны-

ми,

если

результаты

теста

не

были

заранее

определены.

Здесь

мы

сталкиваемся

с

явлением

психологии:

мы

видим

то,

что

мы

хотим

увидеть.

Другими

словами,

несмотря

на

то,

что

тестиро-

вание

по

определению

деструктивный

процесс,

есть

подсоз-


background image

 
 

95

нательное

желание

видеть

корректный

результат.

Один

из

спо-

собов

борьбы

с

этим

состоит

в

поощрении

детального

анализа

выходных

переменных

заранее

при

разработке

теста.

Поэтому

тест

должен

включать

две

компоненты:

описание

входных

дан-

ных

и

описание

точного

и

корректного

результата,

соответст-

вующего

набору

входных

данных.

Необходимость

этого

подчеркивал

логик

Копи:

«Пробле-

ма

может

быть

охарактеризована

как

факт

или

группа

фактов,

которые

не

имеют

приемлемого

объяснения,

кажутся

необыч-

ными

или

которые

не

удается

подогнать

под

наши

представле-

ния

или

предположения.

Очевидно,

что

если

что-нибудь

под-

вергается

сомнению,

то

об

этом

должна

иметься

какая-то

пред-

варительная

информация.

Если

нет

предположений,

то

не

мо-

жет

быть

и

неожиданных

результатов».

Следует

избегать

тестирования

программы

ее

автором.

Этот

принцип

следует

из

обсуждавшихся

ранее

положе-

ний,

которые

определяют

тестирование

как

деструктивный

про-

цесс.

После

выполнения

конструктивной

части,

при

проектиро-

вании

и

написании

программы

трудно

быстро

течение

одного

дня)

перестроиться

на

деструктивный

образ

мышления.

Многие,

кому

приходилось

самому

делать

дома

ремонт,

знают,

что

про-

цесс

обрывания

старых

обоев

(деструктивный

процесс)

нелегок,

но

он

просто

невыносим,

если

не

кто-то

другой,

а

вы

сами

пер-

воначально

их

наклеивали.

Вот

так

же

и

большинство

програм-

мистов

не

могут

эффективно

тестировать

свои

программы,

по-

тому

что

им

трудно

демонстрировать

собственные

ошибки.

В

дополнение

к

этой

психологической

проблеме

следует

отметить

еще

одну,

не

менее

важную:

программа

может

содер-

жать

ошибки,

связанные

с

неверным

пониманием

постановки

или

описания

задачи

программистом.

Тогда

существует

вероят-

ность,

что

к

тестированию

программист

приступит

с

таким

же

недопониманием

своей

задачи.

Тестирование

можно

уподобить

работе

корректора

или

рецензента

над

статьей

или

книгой.

Многие

авторы

представ-

ляют

себе

трудности,

связанные

с

редактированием

собствен-

ной

рукописи.

Очевидно,

что

обнаружение

недостатков

в

своей

деятельности

противоречит

человеческой

психологии.