76 Часть I: Основы
• Процесс тестирования плохо автоматизирован. То, что на первый
взгляд кажется преимуществом целостного тестирования — отсут-.
ствие необходимости писать оболочки и заглушки, — на самом деле
оборачивается его недостатком. В процессе разработки программа
ежедневно меняется, и ее приходится тестировать снова и снова. А
оболочки и заглушки помогают автоматизировать этот однообразный
труд.
Поскольку большинство руководителей проектов отнюдь не глупы,
когда кто-нибудь из них выбирает целостное тестирование, мы предпола-
гаем, что в своем конкретном случае он видит такие преимущества этого
подхода, о которых в разговоре с нами просто не упоминает. Есть и такие
руководители, которые вообще не слишком заботятся об эффективности
тестирования. Главное для них — как можно скорее отрапортовать началь-
ству о завершении работ, даже если на самом деле ничего не работает. Если
после этого с проектом возникнут проблемы, они будут обвинять законы
Мэрфи, тестировщиков, невезение, но только не самих себя — собствен-
ную часть работы они будут считать выполненной успешно и в срок. Мы
не понимаем такой позиции, хотя каждый из нас был в свое время руко-
водителем проекта, а также встречался с руководителями, действующими
подобным образом.
Нисходящее тестирование против восходящего
Существует и еще один принцип организации тестирования, при кото-
ром программа так же, как и при восходящем способе, тестируется не
целиком, а по частям. Только направление движения меняется — сначала
тестируется самый верхний уровень иерархии модулей, а от него тестиров-
щик постепенно спускается вниз. Такая технология называется нисходящей
(top-down). Обе технологии — и нисходящую и восходящую — называют
также инкрементальными.
При нисходящем тестировании отпадает необходимость в написании
оболочек, но заглушки остаются. По мере тестирования заглушки по оче-
реди заменяются на реальные модули.
Мнения специалистов о том, какая из двух инкрементальных стратегий
тестирования более эффективна, сильно расходятся. Йордан (Yourdon,
1975) доказывает, что гораздо лучше нисходящее тестирование, а Майерс
(Myers, 1976) утверждает, что, хотя у обоих подходов есть свои преимуще-
ства и недостатки, в целом восходящее тестирование лучше. По мнению же
Данна (Dunn, 1984), эти способы примерно эквивалентны.
На практике вопрос выбора стратегии тестирования обычно решается
просто: каждый модуль по возможности тестируется сразу после его напи-
сания, в результате последовательность тестирования одних частей про-
граммы может оказаться восходящей, а других — нисходящей.
Глава 3: Типы тестов ... 77
Статическое тестирование против динамического
При статическом тестировании программный код вообще не выполня-
ется — он тестируется только путем логического анализа.
Две описанные выше базовые стратегии — тестирование "черного ящи-
ка" и тестирование "стеклянного ящика" — являются динамическими.
Программа запускается, вводятся данные, и программист или тестировщик
анализирует результат. Разница только в том, на какой информации осно-
вывается подбор тестов.
Для статического анализа существует множество инструментальных
средств. Самое известное из них — компилятор. Встретив синтаксическую
ошибку или недопустимую операцию, компилятор выдает соответствующее
сообщение. Ряд полезных сообщений выдает и компоновщик — о повто-
ряющихся именах переменных и других объектов, ссылках на необъявлен-
ные переменные и функции. О других полезных средствах автоматизации
статического и динамического тестирования рассказывается в главе 11.
Статический анализ программы может выполняться и людьми. Они
читают исходный код, возможно, обсуждают его, и, как правило, находят
достаточно много ошибок. Вот примеры такой работы.
•
Обзорные, инспекционные и рецензионные совещания. Это точно та-
кие же совещания, какие проводятся для анализа проекта программ-
ного продукта. Майерс (Myers, 1979) предлагает для них очень
полезный список контрольных вопросов. Он утверждает (1978), что
для выявления ошибок обзорные совещания не менее полезны, чем
динамическое тестирование специалистом, который не является
автором кода программы. А у Фергана (Fergan, 1976) можно найти
описание классического способа проведения таких дискуссий.
• Работа за столом. Статический анализ программного кода может
выполняться и в одиночку. Специалист читает и анализирует про-
граммный код. Если он не может понять, что делает конкретный
фрагмент программы, он может поработать и за компьютером, но
большую часть времени он все же проводит за столом. Он работает
дольше, чем обычно длятся совещания, и, как правило, анализиру-
ет гораздо большие объемы кода. Этот вид тестирования может
выполнять как сам автор программного кода, так и кто-то другой — в
любом случае оно будет очень полезным.
Вычитывать программный код (как собственный, так и чужой) — работа
Довольно скучная, и многие ее не любят. В пользу этой процедуры горячо
высказывается Вейнберг (Weinberg, 1971), а Бейзер (Beizer, 1984, 1990)