черного ящика
Технологии функционального
тестирования программного
обеспечения и систем
Борис Бейзер
Boris Beizer
Wiley
John Wiley & Sons, Inc.
New York ■ Chichester ■ Brisbane ■ Toronto ■ Singapore
Борис Бейзер
Е^ППТЕР*
Москва • Санкт-Петербург ■Нижний Новгород ■Воронеж
Новосибирск • Ростов-на-Дону • Екатеринбург • Самара
Киев ■Харьков ■Минск
2004
ББК 32.973-018-07
УДК 681.3.06
Б 41
Бейзер Б.
Б 41 Тестирование черного ящика. Технологии функционального тестирования
программного обеспечения и систем. — СПб.: Питер, 2004. — 318 с.: ил.
ISBN 5-94723-698-2
Книга доктора Бейзсра «Тестирование черного ящика» давно была признана классическим
трудом в области поведенческого тестирования разнообразных систем. В ней глубоко
рассматриваются основные вопросы тестирования программного обеспечения, позволяющие
отыскать максимум ошибок при минимуме временных затрат. Чрезвычайно подробно излагаются
основные методики тестирования, покрывающие все спектры испек гов разработки программных
систем. Методичность и широта изложения делают эту книгу незаменимым помощником при
проверке правильности функционирования программных решений.
Книга предназначена для тестировщиков программного обеспечения и программистов,
стремящихся повысить качество своей работы.
ББК 32.973-018-07
УДК 681.3.06
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные Тем не
менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную
точность и полноту приводимых сведений и не несет ответственности за возможные ошибки связанные с использованием книги
Введение............................................................................................ 12
Пропущенные модели......................................................................... 14
1. Общие положения.......................................................................................... 14
2. Маерс. «Искусство тестирования программ».................................................14
3. Логические модели........................................................................................ 16
4. Языковые модели.......................................................................................... 16
README.DOC........................................................................................18
Зачем нужен Readm e.doc?............................................................................... 18
План книги........................................................................................................ 18
Структура главы................................................................................................ 20
Бланки налоговой декларации и ссылки на них................................................ 22
Что должен знать читатель................................................................................22
Не только программное обеспечение...............................................................23
Использование алфавитного указателя.............................................................23
Ссылки...............................................................................................................23
Контроль качества............................................................................................24
Благодарности.................................................................................................. 24
Отказ от ответственности..................................................................................25
От издательства................................................................................................ 25
Глава 1 • Введение............................................................................. 26
1.1. Обзор...........................................................................................................26
1.2. Основные термины...................................................................................... 26
1.3. О тестировании.......................................................................................... 31
1.3.1. Тестировщик и программист......................................................... 31
1.3.2. Почему мы тестируем программное обеспечение?........................ 31
1.3.3. Стратегия тестирования............................................................... 33
1.3.4. Парадокс пестицида..................................................................... 34
1.3.5. Природа и причины ошибок........................................................... 34
6 Содержание
Приложение А ....................................................................................283
1. Общие положения
Этот раздел для читателей, знакомых с литературой по тестированию, в особеннос
ти читателей книги Глена Маерса «Искусство тестирования программ» [MYER79];
читателей, которые могут быть озадачены, если я не расскажу о нескольких мето
дах поведенческого тестирования. В первую очередь о логических моделях.
Сначала я поставил себе цель уложиться в 175-страничную книгу. Этот объем
вполне подходит для прочтения за один семестр. Одновременно планировалось,
что эта книга заменит устаревший шедевр Маерса. Маерс уложился в 191 страницу.
Когда я начал писать, для меня стало очевидно, что примеры занимают больше мес
та, чем я предполагал. Я добавил некоторые новые технические требования, и это оз
начало, что мне придется включить больше материала, чтобы книга была самодоста
точной. Цель «175 страниц» была недостижима, и, тем не менее, мне приходилось
постоянно себя ограничивать, сокращая материат.
Мои технические семинары служили обратной связью для определения тем, кото
рые наиболее интересны людям. Я проводил их свыше 200 раз на протяжении 10 лет
для тысяч тестировщиков. Участники семинара заполняли опросный лист, в котором
спрашивалось, какие методы, по их мнению, могут быть полезны для них сразу же, а
какие могут пригодиться в будущем (скажем через 3-5 лет). Я поддерживаю связь с
бывшими студентами и оргапизациями-заказчиками, чтобы определить, какие методы
они используют при тестировании. Эта обратная связь лежит в основе данной книги.
3. Логические модели
Логические модели включают в себя причинно-следственные диаграммы [ELME73,
MYER79], модели таблиц решений [BEIZ90, GOOD75] и множество других ва
риантов, использующихся в качестве частей различных методологий дизайна
[BEND85, WEYU94B]. Это замечательные методы, однако для их разбора пот
ребуется слишком много места. К примеру, логические модели занимают в книге
«Методы тестирования программного обеспечения» 42 страницы. В данной книге
из-за более современных предпосылок и примеров черновик состоял из 75 стра
ниц. Это еще две дополнительные большие (даже слишком большие) главы, что
сделает курс слишком большим для одного семестра.
Мне трудно объяснить логические модели без привлечения булевой алгебры,
а ее нет смысла учить, если вы не владеете диаграммами Карно—Вейча [BEIZ90],
поскольку булева алгебра почти не используется без этого важного инструмента.
Я обратил внимание, что слушатели разделяются на две категории. Те, кто знаком
с булевой алгеброй и картами Карно, способны овладеть этими методами само
стоятельно, например, с помощью STT2. Те же, у кого нет таких знаний, не могут
изучить их за четыре часа, которые я посвящаю этой теме. В итоге тестирование
на основе логики всегда находится на последних местах в списке предпочтений
моих студентов и спонсоров. И я частенько вообще выбрасываю эту тему из моих
семинаров.
Было бы неплохо, чтобы курс по тестированию был не единственным. Вспо
могательный курс, для начальных или старших курсов, когда студенты уже владе
ют необходимыми знаниями, мог бы включать в себя логические модели и другие
модели, здесь не представленные.
4. Языковые модели
Существует большое число моделей на основе специальных языков для разра
ботки тестов и связанных с ними инструментальных средств. Хорошим приме
ром может служить метод разбиения по категориям Остранда [LAYC92, OSTR88]
и «Т» Постона [POST94], Другие методы того же типа изложены в [BALC89,
BELF76, DAVI88, КЕММ85, RICH89]. Все эти методы основаны на языке опре
деления теста. Языки отличаются степенью формальности и выразительной си
лой, простираясь от самых элементарных до строгих полнофункциональных язы
4. Языковые модели 17
План книги
Эта книга имеет свою генеральную линию. В главе 1 подготавливается почва для
дальнейшего изложения и говорится о моем видении вашей ситуации, или, ины
ми словами, обстоятельств, в которых происходит ваше тестирование. Для неко
торых из вас эти обстоятельства могут показаться идеалистическими, но на самом
деле они реальны и в той или иной форме присутствуют во множестве органи-
заций-разработчиков программного обеспечения, и это то, к чему вам надо стре
миться. Сравнивая вашу ситуацию с главой 1, вы поймете, где вы находитесь и в
каком направлении вам надо двигаться. Для тех, кто ориентируется в терминах,
мои стандарты — пятый уровень зрелости SEI (по шкале Института программно
го обеспечения) и, кроме того, немного из [SCAC94].
Глава 2 необходима для понимания глав 3, 4, 5, 6, 8 и 9, глава 4 —для глав 5, 6
и 8. Вы —в большинстве своем тестировщики-практики, и я не буду осуждать вас,
План книги 19
1-ВВЕДЕНИЕ
/ ~ Т — |----Г“* \
/ f * 1ч
Структура главы
Главы с 3 по 9, составляющие ядро данной книги, имеют сходную структуру, хотя
порядок может меняться от главы к главе.
Обзор. Содержание главы в общих словах без использования терминов, вводи
мых в данной главе.
Словарь внешних терминов. Технические термины, определение которых от
сутствует в данной книге, но которые вы должны знать. Англоговорящего читате
ля может удивить, что сюда включено так много основных компьютерных терми
нов. Около половины содержимого словаря внешних терминов хорошо знакомо
не только профессионалу в области программного обеспечения, но и студенту.
Включая сюда основные термины, я преследовал цель помочь моим многочислен
ным читателям, для которых английский язык не является родным. Я также на
деюсь, что эти термины ощутимо облегчат перевод книги. Некоторые из внешних
терминов не принципиальны для понимания книги, поскольку используются
лишь в одной из нескольких иллюстраций идеи или в несущественном коммента
рии. Не слишком расстраивайтесь, если вы не понимаете термины, используемые
в иллюстрациях, поскольку они играют вспомогательную роль в освоении мето
дов тестирования. Все такие термины есть в алфавитном указателе, и вы можете
посмотреть их применение в контексте изложения, чтобы понять, действительно
ли они вам нужны для понимания темы.
Словарь внутренних терминов. Термины, определяемые в предыдущей главе.
Словарь новых определений. Определения, используемые в главе. Новые опре
деления выделяются курсивом. Определение будет выделено курсивом еще раз,
если оно дополняется или уточняется. Определения приводятся в логической по
следовательности, где каждое следующее определение зависит от предыдущего;
их надо читать в предложенном порядке. Внимательно читайте новые определе
ния и не двигайтесь дальше, пока их не поняли.
Конфликт словарей. Иногда вы будете находить один и тот же термин во внеш
нем и внутреннем словарях, а также в словаре новых определений. Когда термин
появляется одновременно во внешнем и внутреннем словарях, это значит, что
если вы знали его и раньше, то у вас не будет проблем с пониманием главы, одна-
Структура главы 21
ко в данном контексте определение будет более строгим, чем то, которое вы зна
ли. Аналогично, если термин возникает во внутреннем словаре и в словаре новых
определений, то в данной главе он либо уточняется, либо дополняется (переопре
деляется).
Термины могут выделяться в тексте курсивом (это значит, что вы, скорее всего,
с ними не знакомы), при этом их определение может отсутствовать, и они не бу
дут включены в словарь новых определений. Это означает, что этот термин ссы
лается на что-то, что будет определено позже. Я старался избегать таких ссылок
и использовал их, только если чувствовал, что это принесет пользу. Вы, возмож
но, захотите заглянуть в соответствующую главу и просмотреть определение, но в
любом случае можете не беспокоиться: на изучение данной главы никак не влияет
понимание подобных ссылок.
Модель. Модель, на которой основан метод. Она включает то, что мы принима
ем во внимание в поведении программы, что игнорируем и как мы представляем
себе это поведение.
Предположение об ошибках. Любой метод тестирования основан на предполо
жении относительно программного продукта, дизайна, пользователя, типа оши
бок и возможных проявлений этих ошибок. Этот раздел поможет вам определить
эффективность метода в вашем случае.
Тип приложений. Обсуждение, для каких приложений данный метод, скорее
всего, будет эффективен.
Метод. Метод, что он собой представляет, как он работает и почему он работает.
Примеры. Примеры и решения технических задач — от необходимых требо
ваний до готовых тестов. Там, где это было возможно, я использовал в качестве
примеров декларацию о доходах внутренней налоговой службы США. Я выбрал
бланки декларации на подоходный налог, поскольку они едины для всех, содер
жат большое количество нетривиальной логики; они подходят для иллюстраций
большинства методов черного ящика; несмотря на то, что мы затрачиваем огром
ные усилия, чтобы заполнить бланк декларации и разобраться в этих непостижи
мых формах, они, тем не менее, представляют собой вполне законченные специ
фикации и свободны от ошибок; и, наконец, их должен знать каждый.
Предостережения и ограничения. Что данный метод может, чего не может
и ошибки какого типа он пропустит.
Автоматизация и инструментальные средства. Комментарии по поводу ав
томатической генерации совокупности тестовых данных и инструментальных
средств, построенных на этом методе.
Резюме. Краткое содержание главы с использованием новой терминологии.
При сравнении обзора и резюме становиться понятно, какие новые концепции
были рассмотрены в этой главе.
Тест и упражнения. Упражнения и вопросы по итогам главы. Не прилагая уси
лий, вы не станете хорошо тестировать. Также вам надо знать терминологию, вве
денную в этой главе, если она встречается в последующих главах. Станьте сами
себе ОТК. Проверьте себя. Бланки налоговой декларации являются подходящими
объектами для тестирования. Проверьте сделанное, протестировав готовый пакет
налоговых документов. Можете считать, что все правила налоговой службы в нем
22 Readme.doc
соблюдены. В том числе они проверяют, чтобы все обязательные для заполнения
графы были заполнены. Если вы вводите некое значение, очевидно выходящее за
указанные рамки, программа должна определить это и предупредить вас. Я дол
жен извиниться за то, что использовал налоговые декларации за 1994 год, но если
они изменятся (а это неизбежно случится), вы приобретете полезный навык в об
новлении средств тестирования.
Если вы в данный момент не являетесь студентом, то с помощью этого упраж
нения вы дополнительно попрактикуетесь в заполнении налоговой декларации.
Если же вы студент и никогда не заполняли декларацию, самое время научиться
этому. Не осуждайте меня за сложность формы, обратитесь лучше с этим вопро
сом к своим сенаторам и конгрессменам. Кроме того, реальные проблемы, с кото
рыми вам придется столкнуться при тестировании программ, будут гораздо более
трудными.
приводится лексика, которую вам надо знать для освоения метода. Большинство
людей склонно недооценивать собственные знания. Если вы понимаете термино
логию главы, этого достаточно для ее изучения.
Ссылки
Исследователи вряд ли найдут в ссылках что-нибудь интересное для себя. Ссылки
здесь приводятся для того, чтобы читатель мог узнать больше о теме, иногда озна
комиться с противоположной точкой зрения или удачными примерами приложе
ний, которые он мог бы использовать как средство борьбы за внедрение данного
метода в свою организацию. Я ограничил библиографию работ, которые, хотя и
содержат дополнительную информацию, но не являются существенными. Также
я не стал включать в список ссылок множество прекрасных работ, особенно теоре
тических исследований, не относящихся к теме данной книги.
Ссылки обозначаются согласно требованиям ACM (ассоциация вычислитель
ной техники). Первые четыре символа из имени автора, затем год публикации, и в
24 Readme.doc
конце заглавная буква, начиная с «А», если это не единственная работа автора за
тот год. Так, например, [BEIZ90] —книга Бейзера, опубликованная в 1990 году, а
[BEIZ91C] — третья его книга в 1991 году. Часто приводится резюме или корот
кий обзор, если тема не понятна из названия.
Контроль качества
Контроль качества —это ваша задача. Я ожидаю ваших комментариев, а также ва
ших замечаний об ошибках и недочетах, чтобы исправить их в следующих изда
ниях. Технологии позволяют сделать это очень просто. Пришлите мне факс или
e-mail по адресам, приведенным ниже. Пожалуйста, сообщите следующую инфор
мацию о себе:
Ваше имя, место работы (компания, университет, государственное учреждение)
Ваша должность
Почтовый адрес
Номер телефона, факса, e-mail
Название книги, издание
Номер страницы и комментарии или исправления
Если вы используете факс, вы можете сделать копию страницы и написать ком
ментарий прямо на ней.
В публикациях используются номера, эквивалентные номеру версии и релиза.
«Номер версии» —это то же самое, что и «номер издания», это всегда указывается
в заголовке. Например, «Методы тестирования программ», издание 2-е.
Пожалуйста, посылайте ваши замечания:
Борису Бейзеру
Факс: 215-886-0144, три параллельных факса, отвечают на первый звонок
E-mail: BBEIZER@MCIMAIL.COM
Благодарности
Я написал эту книгу по настоянию Боба Постена из Programming Environments Inc
при поддержке Джинджера Хостона-Ладлэма из Frontier Technologies, Эдварда
Миллера из Software Research Associates, Билла Перри из Quality Assurance
Institute, Ричарда Бендера из Bender Associates и еще такого огромного числа кол
лег по академии, что перечислить их не представляется возможным. В написании
этой книги есть вклад и других людей: коллег по цеху, моих читателей, моих сту
дентов, клиентов, приходящих на консультации, однако уже трудно сказать, кто
из них и что предлагал. Вряд ли кто-нибудь из этих людей догадываются, что они
являются соавторами этой книги, поскольку их участие в ее написании было по
большей части неосознанным. Мотивация, сознательная или нет — тоже цен
ный вклад. Я также хочу поблагодарить тех, кто откликнулся на мою просьбу по
Интернету о помощи в выборе темы. И, наконец, я благодарен Ли Уайту за полез
ную и обоснованную критику главы 7.
От издательства 25
Отказ от ответственности
Там, где было возможно в этой книге, я использовал в качестве примеров декла
рации о доходах внутренней налоговой службы США. Они использовались для
иллюстрации проблем тестирования и не годятся для предоставления реальной
информации, например как заполнять налоговую декларацию или как интерпре
тировать код внутренней налоговой службы США. Я по своему усмотрению со
кращал или изменял формы, если это мне было надо в педагогических целях. Не
используйте формы из этой книги для каких-либо реальных целей, связанных с
налогами. Не представляйте эти формы, их копии или материал в них в налоговую
службу. Я не несу ответственности за любое их использование, кроме как в качес
тве учебных пособий.
Несмотря на вышесказанное, бланки декларации, их запутанность и инструк
ции к ним совпадают с формами внутренней налоговой службы США. Мои кол-
леги-неамериканцы говорят мне, что налоговые законы сложны во всем мире. Я за
это не отвечаю. Законы и формы на самом деле дают нам нечто, за что можно быть
благодарным. Если вы в состоянии заполнить налоговую декларацию в своей
стране, то вы можете решить любую задачу тестирования, например тестирование
программы контроля ядерного реактора.
От издательства
Ваши замечания, предложения и вопросы отправляйте по адресу электронной
почты comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
Подробную информацию о наших книгах вы найдете на веб-сайте издательства
http://www.piter.com.
Введение
1.1. Обзор
В этой главе вводится терминология, использующаяся в тестировании, и рассматри
вается тестирование как элемент процесса разработки программного обеспечения.
1 Автор использует свою собственную, оригинальную терминологию. Отдавая дань классику, от
метим, что более распространены следующие термины: верификация — проверка того, что программа
правильно реализует определенную функцию; валидация — проверка того, что программа соответству
ет требованиям заказчика. — Примем, иауин. ред.
1.2. Основные термины 29
1.3. О тестировании
1.3.1. Тестировщик и программист
Повсюду в этой книге мы будем упоминать и противопоставлять друг другу «тес
тировщиков» и «программистов» так, как будто они являются разными людьми.
Такое разделение может привести вас к мысли, что тестирование методом черно
го ящика предназначено только для независимых тестировщиков, но не для про
граммистов. Другим ошибочным мнением является то, что я сторонник идеи, что
тестирование и программирование должны выполняться различными людьми,
(то есть должно проводиться независимое тестирование). Я хочу предотвратить
и/или скорректировать такие ошибочные взгляды.
Говоря образно, программист должен носить две шляпы — шляпу програм
миста и шляпу тестировщика. Когда он выполняет тестирование, он должен на
деть шляпу тестировщика и думать как тестировщик. Вот что представляет собой
«тестировщик», для которого я пишу эту книгу. Итак, тестировщик может быть,
а может и не быть тем же самым человеком, который пишет программы. Так как
способ мышления при программировании и способ мышления при тестировании
сильно отличаются, хорошая идея — просто рассказать о двух ролях, как будто
бы их играют различные люди. Способ мышления в программировании известен
давно и существует много книг по этой теме, поэтому не стоит специально на этом
останавливаться. Способ мышления, применяемый при тестировании, возник от
носительно недавно, и именно поэтому эти способы сильно различаются. Методы
тестирования, затрагиваемые здесь, предназначены как для независимых тести
ровщиков, так и для тех программистов, которые в данный момент тестируют свое
или чье-либо программное обеспечение.
грязных тестов должно быть существенно больше, чем чистых. Так оно и есть на
самом деле. В продуманных тестовых комплектах число грязных тестов относится
к числу чистых как 4 : 1 или 5:1.
2 Зак 770
34 Глава 1 • Введение
' Это называется «парадокс пестицида» по аналогии с явлением в сельском хозяйстве, когда ли
чинки долгоносика, приспособившись к яду, вынуждали нас создавать все более мощный яд, который
приводил к возникновению все более устойчивых к этому яду личинок, пли искать принципиально
иное решение.
1.3. О тестировании 35
1 Если некомпетентный программист нс может стать компетентным, избавьтесь от него. Если про
цесс содержит ошибки, исправьте его. Ни от кого нельзя ожидать продуктивности без надлежащих
инструментов.
36 Глава 1 • Введение
' Все, что мы делаем в процессе разработки программного обеспечения, подвержено ошибкам.
Формальное (то есть математическое) доказательство корректности алгоритма точно так же уяз
вимо для ошибок, как любой другой процесс, выполняемый человеком. Убедиться в этом легко: д о
статочно вспомнить о количестве статей в математических журналах, озаглавленных: «Контрпример
к теореме...».
1.4. Процесс разработки программного обеспечения 39
рящего на этом языке, а также для тех, кто занимается переводами с одного языка
на другой, но не они определяют способность носителя языка к общению.
Итак, мы не будем рассматривать модель водопада [ROYC70] или спиральную
модель [ВОЕН86], пошаговую детализацию, нисходящую стратегию, восходящую
стратегию и все такое прочее. Ниже приводятся составляющие, которые вам надо
искать в любом эффективном процессе, подобно тому, как вы ищете существитель
ные, глаголы и другие части речи в разговорном языке, но без указания, в каком по
рядке они должны быть скомпонованы, чтобы получился осмысленный процесс.
Дорожная карта процесса. Необходимо понимать в каждый момент времени,
на какой стадии процесса находитесь вы и ваша программа. Если вы предпочита
ете блок-схемы процесса — это очень хорошо, но некоторые люди отдают пред
почтение комментариям и спискам. Грамотная дорожная карта процесса разби
вает процесс на элементарные шаги, которые легко понять и контролировать. Она
достаточно детальна, чтобы вы или кто-нибудь другой мог легко сориентиро
ваться в ней, но эта детализация не чрезмерна и не подавляет индивидуальность
и творческое начало.
Управление процессом. Управление процессом не подразумевает жесткого со
блюдения детально расписанного графика, как не означает оно и тоталитаризма
и подавления индивидуальности. Управление процессом подразумевает наличие
эффективных механизмов, при помощи которых все участники процесса могут
получать информацию, касающуюся улучшения тех частей процесса, в которых
они напрямую задействованы. Управление процессом включает в себя обратную
связь, обучение и широкий круг возможностей, и направлено на создание атмо
сферы в коллективе, в которой люди будут стремиться улучшить себя, свой про
дукт и мир вокруг.
Количественные измерения и метрики. Мы имеем дело с инженерной на
укой, а не с искусством, и потому объективность —требование, необходимое для
управления процессом. В инженерной науке количественные измерения являют
ся залогом объективности. В компьютерных науках количественные измерения
опираются главным образом на метрики [BERL94, FENT91, GRAD87, GRAD92,
MOLL93, ZUSE90, ZUSE94].
Контроль конфигурации так же стар, как Имхотеп, великий строитель пирамид.
Он означает, что в любой момент времени мы можем проверить результат нашего
труда (программу, требования или, скажем, тестовый комплект) и узнать: кто, что,
где, когда, зачем и как. Конфигурация всего, с чем планируется дальше работать,
должна контролироваться, а все, что не контролируется, просто не входит в наш
продукт.
Требования. Что мы создаем? Все в курсе? Все имеют в виду одно и то же? Здесь
я настаиваю на документировании, поскольку человеческая память ненадежна.
Прослеживаемость требований. Откуда взялись требования? Если, как часто
бывает, требования изменяются в процессе разработки программы, на какие дру
гие требования это повлияет? Прослеживаемость означает, что требования нахо
дят свое отражение в компонентах программного обеспечения и наоборот. Однако
не требуйте и не ожидайте взаимно однозначного соответствия, так как требова
ния и компоненты не отображаются в стиле «один к одному».
42 Глава 1 • Введение
2.1. Обзор
Графы рассматриваются как основной концептуальный инструмент тестирования.
Имя узла. Каждый узел имеет уникальное имя. Если объекты является фай
лами, имена узлов могут быть именами файлов; если объекты — это программы
или операторы программ, имена узлов могут быть именами программ или метка
ми операторов соответственно. Ни свойства графа, ни свойства объектов, пред
ставленных в нем, не зависят от того, какие имена мы дадим узлам.
Вес узла. Узлы могут иметь свойства. Эти свойства называются весом узла.
В этой книге в качестве веса узла мы будем использовать, например: состояние
программы, значение переменной, функцию, которая' описывает, какая из не
скольких величин может быть использована для вычисления чего-либо, имя дру
гого объекта. Задача тестирования —убедиться, что узлы с заданным весом имеют
ожидаемый вес.
Связь. Стрелка или линия, которая соединяет узлы, используется для иллю
страции конкретного отношения между этими узлами. Например, если суть от
ношения описывается как «А и Б — братья», мы соединяем А и Б линией, что
бы отметить этот факт. Если в нашей модели определено только одно отношение,
мы можем не надписывать каждую связь, чтобы обозначить это отношение. Если
между объектами может быть несколько отношений, мы можем помечать связи
метками заданных отношений. На рисунке между узлами А и Б существуют два
отношения: 0 — «А и Б —дети одних родителей» и S —«А и Б —друзья». Задача
тестирования —проверить, что все связи находятся там, где и должны находиться,
и что каждой связи соответствует определенное отношение.
Друзья
Дети одних
родителей
46 Глава 2 • Графы и отношения
Параллельные связи. Две или более связей между двумя узлами. Параллельные
связи используются, если между двумя узлами существуют несколько отношений.
Имя связи. Каждая связь имеет уникальное имя. Существует несколько спо
собов обозначить связи. Мы будем часто использовать числа в качестве имен уз
лов, поэтому для имен связей мы будем применять строчные буквы. Другой спо
соб дать имя связи — использовать имена соединяемых узлов. Например, связь
между узлами 17 и 34 мы назовем (17, 34). Это правило не годится для графов с
несколькими связями между двумя узлами. Нам не обязательно всегда указывать
имя связи, в таких случаях мы его просто опускаем. Ни свойства графа, ни свой
ства объектов и отношений, которые этот граф представляет, не зависят от того,
как мы назовем связи.
Вес связи. Связи могут обладать свойствами. Такие свойства называются ве
сом связи. Простейшим возможным весом связи является факт ее существования.
Примером веса связи может служить отношение или все отношения между двумя
объектами. Если узлы обозначают шаги обработки, а связи показывают последо
вательность этих шагов, то весом связи может быть: время выполнения програм
мы по данному пути, вероятность выполнения именно этого пути (этой последо
вательности), тот факт, что будет вызван определенный объект данных. Свойства
модели, изображаемой графом, напрямую зависят от веса связей. Задача тестиро
вания —убедиться, что связи с весом имеют ожидаемый вес.
Дети одних
родителей
Пол г*~ ►(Алия)
Брат
Сестра
Граф. Граф —это набор узлов, имен узлов, весов узлов, связей, имен связей, ве
сов связей и отношений между узлами. Если между двумя узлами существует от
ношение, то между ними есть связь.
ВОПРОС: Что вы делаете, когда вам встречается граф?
ОТВЕТ: Исследую его!
Направленный граф. Граф, в котором все связи направлены. Большинство гра
фов в тестировании — направленные. Задача тестирования — убедиться, что на
правления связей совпадают с заданными.
48 Глава 2 • Графы и отношения
Входной узел. Узел без входящих связей. Хотя у программы обычно есть вход
ные точки (например, BEGIN), графы, моделирующие поведение программ, могут
и не иметь входных узлов.
Узел ветвления. Узел с двумя или более исходящими связями. В языках про
граммирования примерами узлов ветвления служат операторы CASE или IF-THEN-
ELSE. На рисунке узел имеет три ветви. Обратите внимание, что это узел ветвления
в графе, моделирующем поведение программы, в самой же программе соответ
ствующего ветвления может и не быть.
2.2. Основные термины 49
Проходимый путь. Путь в модели, для которого существует такой набор вход
ных значений, что, используя их, программа может пройти по этому пути.
Непроходимый путь. Путь в модели, который невозможно воспроизвести в
программе, какой бы набор входных значений мы ни взяли.
Путь вход—выход. Путь от входного узла к выходному узлу. Если отдельно не
оговаривается, под термином «путь» подразумевается «путь вход—выход».
Сегмент пути. Обычно путь, не являющийся путем вход—выход.
Имя пути. Существует два способа назвать путь: по именам узлов вдоль это
го пути или по именам связей вдоль пути. Если мы назовем путь на следующем
рисунке по именам узлов, то получим: «14,99,12,17», если по именам связей, то
«кгт».
50 Глава 2 • Графы и отношения
Длина пути. Существует два способа измерить длину пути. Можно восполь
зоваться числом узлов вдоль этого пути или количеством связей вдоль пути.
В данной книге мы, как правило, будем считать связи. Предыдущий рассмотрен
ный путь был длиной в три связи или четыре узла.
Цикл. Путь, в котором как минимум один узел встречается больше одного раза.
Иначе говоря, это путь, в имени которого больше одного раза встречается имя
узла (связи), в зависимости от того, как строится имя пути — перечислением уз
лов или перечислением связей. В примере на рисунке существует циклический
путь akrmbakrmb или 7,14,99,12,17,7,14. Попробуйте найти на этом графе все цик
лические пути.
Нециклический путь. Путь, в котором нет циклов. Это значит, что в его имени
ни разу не повторяются имена узлов (связей).
2.4. Отношения
2.4.1. Обзор
Отношения имеют определенные свойства и, следовательно, могут быть раз
биты на категории. Если, глядя на отношение, вы говорите: «О, это такой-то и
такой-то тип отношений», то эти ваши знания вы сможете применить в конк
ретных случаях. Мы не будем рассматривать все свойства всех возможных от
ношений. Остановимся лишь на отношениях, наиболее часто используемых при
тестировании.
ножницы. Дело усложняется тем, что все три отношения {режет, покрывает, ту
пит) эквивалентны в данном случае отношению сильнее, чем. На неоднозначности
транзитивности построено также много других детских и взрослых игр.
В наших интересах (поскольку это одна из задач тестирования) проверить, что
все отношения, которые должны быть транзитивны, действительно транзитивны,
и наоборот, если транзитивность не является свойством отношения, то необходи
мо проверить, что оно нетранзитивно. В естественных языках это бывает не всегда
очевидно, поэтому спецификации могут вводить в заблуждение. Например, час
то встречающееся отношение связан в естественном языке может интерпретиро
ваться неоднозначно. Значит ли это, что из узла А можно достичь узла Б, или это
значит, что А напрямую связан с Б? В первом случае отношение можно достичь
должно быть транзитивно. Это значит, что если из А можно достичь Б, а из Ъ мож
но достичь В, то из А можно достичь В. Но отношение можно достичь не обяза
тельно транзитивно. Что, если мы добавим «прикоснувшись к руке»? Например,
я могу достичь своей соседки, прикоснувшись к ее руке, а она, в свою очередь, мо
жет достичь своей соседки, прикоснувшись к ее руке, однако это не значит, что я
могу достичь ее соседки, прикоснувшись к ее руке, если я, конечно, не орангутан
или если мы не сидим очень близко.
Всегда обращайте внимание и проверяйте транзитивность или нетранзитив-
ность всех отношений из спецификации. Кроме этого, проверяйте программиста
на его понимание транзитивности или нетранзитивности. Если понятие транзи
тивность неоднозначно трактуется в спецификации или программистом, то у вас
плодородная почва для тестирования.
3. Если число связей между двумя узлами больше одной, значение данного
элемента должно быть равно числу связей.
4. Если связи обладают весами, впишите соответствующие веса.
Обычно бывает удобно обозначать колонки и строки матрицы именами узлов.
На рисунке показано подобное описание графа, внешний вид которого был при
веден в начале главы.
17 34
17 . 1
34 .
7 13 14 17 12 99 43 16
13 • • 1 .
14 • 1 . • 1 .
17 1
12 . • 1 . 1
99 • • 1 .
43 1 • 1 .
16
• Оно симметрично?
• Оно транзитивно?
Если оно рефлексивно, то каждый узел должен иметь петлю. Если оно симмет
рично, то каждая связь должна быть двусторонней. Отношения на графе не обяза
тельно должны обладать этими свойствами. Более того, они могут обладать други
ми свойствами, не рассматриваемыми в этой книге (см. [BEIZ90], глава 12). Какими
бы ни были свойства отношений, они должны проверяться при тестировании.
3. Тестирование отношений.
• Если отношение симметрично, то необходимо убедиться, что каждая
связь является двусторонней: например, D0/UND0.
• Если отношение рефлексивно, то необходимо убедиться, что каждый
узел связан сам с собой: например, DO NOTHING.
• Если отношение транзитивно, то вы должны проверить его транзитив
ность в любой ситуации. Это делается следующим образом. Рассмотрим
три объекта, А, Б и В, причем А связано с Б, а Б связано с В. То есть А Й Б
и Б Й В. Показав (путем тестирования), что А Й Б —истина и Б Й В —ис
тина, необходимо показать, что А Й В тоже является истиной. Сделайте
это для каждой тройки узлов, в которой выполняются данные условия.
4. Если существуют входной и выходной узлы, то шаги 1-3, как правило, за
вершаются подбором путей от входа к выходу, при этом выбираются такие
входные параметры, с которыми программа проследует по выбранным путям.
Чаще всего для теста указывают несколько путей ВХОД/ВЫХОД (тестовых
вариантов). Заметим, что если вы осуществляете проверку связей, вы обычно
осуществляете и проверку узлов. Тем не менее, проверка связей в большин
стве случаев требует большего количества тестов, чем проверка узлов.
При тестировании черного ящика, исключая патологические случаи, если вы
разрабатываете тесты проверки связей, вы вместе с тем добиваетесь и проверки
узлов. Однако вы вряд ли сможете убедиться, что не существует лишних узлов и
что веса узлов, если узлы обладают весами, верны. Хорошей идеей будет добавле
ние в проверочный список инспектирования тестов и в ваш проект тестов требо
вания проверки узлов из раздела 2.5.4.
2.6. Резюме
Вы освоили словарь и основную идею поведенческого тестирования. Может
быть, материал был изложен более кратко, чем вы бы хотели. Как я уже говорил в
README.DOC, эта глава — как подпрограмма, которую вы будете использовать
в последующих главах при создании конкретных тестов. Рассматривайте эту гла
ву как объект в объектно-ориентированных программах, которые вы будете со-
.давать в последующих главах. ООП, на мой взгляд, более абстрактно, нежели эта
глава. Или же рассматривайте эту главу как игру, в которой вы должны победить.
Используйте следующие вопросы для оценки того, что вы вынесли из этой главы.
62 Глава 2 • Графы и отношения
3.1. Обзор
В этой главе в качестве основной модели, используемой при разработке тестов,
рассматривается граф потока управления1. С помощью графа потока управления
мы будем моделировать различные части формы 1040 декларации о доходах внут
ренней налоговой службы США (форма 1040 ВНС), сложность тестирования ко
торой сравнима с ее собственной сложностью. В дальнейшем модель будет ис
пользована для построения набора тестов по проверке связей.
' Я не выдумал это сам. Данная спецификация — это путь выполнения в форме SE ВНС, 1994.
Можете убедиться сами. Подоходный налог 101 — определенно более напряженный курс, нежели про
граммирование 101 или тестирование 101.
3 Зак. 770
66 Глава 3 • Тестирование потока управления
7-14
Узел выбора. Узел с двумя или более исходящими связями, вес каждой из ко
торых равен одному из значений величины выбора.
Пример: строка 34 в форме 1040: Введите наибольшую из ваших льгот, перечис
ленных в бланке А, строка 29 ИЛИ обычная льгота для вашей формы заполнения, ука
3.3. Отношения и модель 67
занная ниже. Однако, если вы отметили какую-либо графу на строке 33а или Ь. сле
дуйте инструкциям для определения ваших стандартных льгот. Если вы отметили графу
33с, ваша стандартная льгота равна нулю, (а) холост = $3,800. (Ь) женат, запол
няю совместную налоговую декларацию = $6.350, (с) вдовец = $6,350 (d) женат, за
полняем раздельные налоговые декларации = $3.175, (е) глава хозяйства = $5,600.
Следующий граф моделирует большую часть этого предложения. Узел 34.5 яв
ляется узлом выбора.
1 На самом деле это не узел с предикатом, а нечто иное, что будет рассмотрено в главе 6 при из
учении тестирования потока транзакций. Это не настоящий предикат, поскольку вы можете выбрать
оба альтернативных варианта.
3.3. Отношения и модель 69
ветвей, равным числу возможных вариантов. Для двух предикатов, число ветвей бу
дет равно четырем, для трех предикатов —будет восемь ветвей, для п простых преди
катов —2"ветвей.
3.4. Методика
3.4.1. Основы
Проектирование теста и его выполнение состоит из следующих шагов:
1. Изучите и проанализируйте требования на предмет их доступной для реа
лизации завершенности и самосогласованности. Убедитесь в том, что спе
цификация корректно отражает требования, внесите поправки в специфи
кацию, если это не так.
2. Перепишите спецификацию в виде последовательности коротких предло
жений. Уделите специальное внимание предикатам. Разделите сложные
предикаты на эквивалентные последовательности простых предикатов.
Найдите узлы выбора и выпишите их в виде простых списков. Удалите лю
бые логические «И», которые не являются частью предикатов, вместо этого
разбейте предложение на две части.
3. Однозначно пронумеруйте предложения. Впоследствии это будут имена
узлов.
4. Постройте модель.
5. Проверьте модель —ваша работа так же подвержена ошибкам, как и работа
программиста.
6. Выберите пути тестирования.
72 Глава 3 • Тестирование потока управления
65 или старше?
Это узел с предикатом, то есть будет по крайней мере две исходящие связи.
33а4 если НЕ 65 или старше
Позднее нам будет необходимо знать общее число пометок, а этот способ моде
лирования не хуже любого другого.
33а4 33а5 если слеп
Узел ЗЗаЮ является излишним, так как мы изменяли счетчик пометок по мере
прохождения пути; однако я предпочитаю быть уверенным, что существует по
крайней мере один узел (для начала) для каждого утверждения в спецификации.
ЗЗЬЗ З Ы Если ваши родители могут предъявить на вас права
Узел с предикатом.
74 Глава 3 • Тестирование потока управления
Это не избыточность.
ЗЗсЗ Двойное гражданство
34 34.1 Ваши льготы детализированы?
34.2 Ваши льготы не детализированы
лельно, иначе нечего будет сравнивать в узле 34.13. Вы наверняка это делаете при
заполнении своей налоговой декларации.
34.1 34.12 Используйте бланк А. строку 26
Предикат выбора.
34.9 Глава хозяйства
34.10 Менат. заполняем совместную налоговую декларацию
34.11 Менат. заполняю отдельную налоговую декларацию
34.8 34.12 Стандартная льгота = $3.800
34.9 34.12 Стандартная льгота = $5.600
34.10 34.12 Стандартная льгота = $6.350
34.11 34.12 Стандартная льгота = $3.175
Эта модель тоже может быть выражена при помощи графа на следующем
рисунке.
Детализированные
льготы?
Бланк А
Помет,
графу ЗЗЬ?
Помет,
графу 33с?
76 Глава 3 • Тестирование потока управления
Выглядит привлекательно. На первый взгляд это выглядит так, как будто есть
пять взаимоисключающих возможностей: (а) таблица налогов, (Ъ) налоговая та
рифная сетка, (с) бланк D, (d) форма 8615 или (е) форма 8814. Однако, изучая
формы 8615 и 8814, я замечаю, что они могли бы представлять собой две дополни
тельные позиции для каждой из первых трех опций. Я пытался получить объясне
ния в ВПС, но не получил. Я позвонил моему бухгалтеру, и он спросил, будет ли это
«специальной консультацией», но я ответил: «Не беспокойся, Чарли». Такого рода
исследования вы можете проводить при создании практической модели, но в этом
примере я буду рассматривать пять различных вариантов.
38 38.2 t a x ra te sc hedule (налоговая тарифная сетка)
38.3 Бланк С
38.4 Форма 8615
38.5 Форма(ы) 8814
Заметим, что может быть несколько форм 8814, но мы не говорим о том, что
бы суммировать эти формы. Такие особенности должны быть исследованы. Здесь
нам следует взять вместе все формы 8814, так как они должны быть заполнены на
каждого ребенка, чей интерес и дивиденды вы представляете при заполнении нало
говой декларации.
38.1 39 налог в соответствии с t a x t a b l e (таблицей налогов)
38.2 39 налог в соответствии с t a x r a t e sc hedule (налоговой тарифной
сеткой).
38.3 39 налог в соответствии с бланком С.
38.4 39 налоги в соответствии с формой 8615
38.5 39 налоги в соответствии с формой (формами) 8814
39 39.1 дополнительные налоги в соответствии с формой 4970
39.2 НЕТ дополнительных налогов по форме 4970
39.1 39.3 заполните налоговую форму 4970
39.2 39.3 поставьте ноль для дополнительных налогов в строке 39
39.3 39.4 дополнительные налоги по форме 4972
39.5 НЕТ дополнительных налогов по форме 4972
39.4 40 Добавьте налоги из формы 4972 в строку 39
3.4. Методика 77
Я смоделировал это именно таким образом, так как из налоговых форм мне по
казалось, что можно облагать налогом по форме 4970 или 4972 или сразу по обеим.
Такие вещи не очевидны, и вы должны их исследовать.
39.5 40 Ничего не делайте
40 41 Добавьте строки 39 и 40
Следующий предикат —это узел 33а4 (слеп?). Он, очевидно, является незави
симым от предыдущего предиката 33а2 (65лет или старше?). Поэтому, хотя пути
снова расщепляются, нет необходимости добавлять это в тесты. Для определен
ности зафиксируем значение предиката ИСТИНА в пути А1, а значение ЛОЖЬ —
в пути А2.
А 1: 32. 33а1. ЗЗа2(И). ЗЗаЗ. ЗЗа4(И). 33а5. ЗЗаб
А2: 32. 33а1. ЗЗа2(Л). ЗЗа4(Л). ЗЗаб
З З с ( Л ) , З Зс 2(Л ). 34
С5В1А2: 32. 33а1. ЗЗа2(Л). ЗЗа4(Л). ЗЗаб(Л). ЗЗа8(Л). ЗЗаЮ. ЗЗЬ(И). З З Ы .
ЗЗс(И). З З с К Л ) . ЗЗс4(Л). 34
С1В2А2: 32. 33а1. ЗЗа2(Л), ЗЗа4(Л). ЗЗаб(Л). ЗЗа8(Л). ЗЗаЮ, ЗЗЬ(Л).
З З с (Л ) . З Зс 2(И ). 33с3. 34
С2В2А2: 32. 33а1. ЗЗа2(Л). ЗЗа4(Л). ЗЗаб(Л). ЗЗа8(Л). ЗЗаЮ. ЗЗЬ(Л).
33с( И). 33с1(И). ЗЗсЗ. 34
СЗВ2А2: 32. 33а1. ЗЗа2(Л). ЗЗа4(Л). ЗЗаб(Л). ЗЗа8(Л). ЗЗаЮ. ЗЗЬ(Л).
33 с( И). З З с К Л ) . З Зс4(И ). ЗЗсЗ. 34
С4В2А2: 32. 33а1. ЗЗа2(Л). ЗЗа4(Л). ЗЗаб(Л), ЗЗа8(Л). ЗЗаЮ. ЗЗЬ(Л).
ЗЗс(Л). З Зс 2(Л ). 34
С5В2А2: 32. 33а1. ЗЗа2(Л). ЗЗа4(Л). ЗЗаб(Л). ЗЗа8(Л). ЗЗаЮ. ЗЗЬ(Л).
З З с (И ) . З З с К Л ) . ЗЗс4(Л ). 34
поиск по узлу ЗЗЫ (где проверяется пометка графы ЗЗЬ), мы видим, что лю
бой сегмент, включающий вариант В1, не может быть скомбинирован с сег
ментами D4-D8.
2Ь. И наоборот, если графа ЗЗЬ не помечена (вариант В2), логика не позво
ляет выбрать в узле 34.3 исходящую ветвь, соответствующую значению
ИСТИНА, и вариант D3 не может объединяться с любыми путями, кото
рые включают ЗЗЬ(Л). Это пути, содержащие в себе В2. Поэтому любые сег
менты с В2 не комбинируются с D3.
За. Если графа 33а помечена, тогда сегменты D3-D8 можно удалить. Графа 33а
помечается в узлах ЗЗаЗ, 33а5, 33а7 и 33а9. Проводя заново поиск наших
сегментов, мы видим, что это любые сегменты, содержащие А1. Поэтому А1
не комбинируется с D3-D8.
Таблица 3.2. Определение графа состояний
СЕГМЕНТ D1 D2 D3 D4 D5 D6 D7 D8
С1В1А1 хххх хххх хххх хххх хххх хххх
С2В1А1 хххх хххх хххх хххх хххх хххх хххх
СЗВ1А1 хххх хххх хххх хххх хххх хххх хххх
С4В1А1 хххх хххх хххх хххх хххх хххх
С5В1А1 хххх хххх хххх хххх хххх хххх хххх
С1В2А1 хххх хххх хххх хххх хххх хххх
С2В2А1 хххх хххх хххх хххх хххх хххх хххх
СЗВ2А1 хххх хххх хххх хххх хххх хххх хххх
С4В2А1 хххх хххх хххх хххх хххх хххх
С5В2А1 хххх хххх хххх хххх хххх хххх хххх
С1В1А2 хххх хххх хххх хххх хххх хххх
С2В1А2 хххх хххх хххх хххх хххх хххх
СЗВ1А2 хххх хххх хххх хххх хххх хххх хххх
С4В1А2 хххх хххх хххх хххх хххх хххх
С5В1А2 хххх хххх хххх хххх хххх хххх хххх
С1В2А2 хххх хххх хххх хххх хххх хххх
С2В2А2 хххх хххх хххх хххх хххх хххх
СЗВ2А2 хххх хххх хххх хххх хххх хххх хххх
С4В2А2 хххх хххх хххх хххх
С5В2А2 хххх хххх хххх хххх хххх хххх хххх
ЗЬ. Наоборот, если графа 33а (А2) не помечена, то можно не учитывать D2.
4а. Если вы женаты и заполняете форму раздельно (проверяется 33с), то вы не
можете заполнять форму совместно в 34.7. Следовательно, любые сегмен
ты С1В1А1-С5В2А2, включающие ЗЗс(И), не могут комбинироваться с D7.
Это все сегменты, содержащие С2, СЗ или С5.
4Ь. И наоборот, любой сегмент, содержащий С1 или С2, не может комбиниро
ваться с D8. Так как ЗЗс(Л ) не означает заполнение раздельных деклараций
и 34.7 (РАЗДЕЛЬНО) этому противоречит.
82 Глава 3 • Тестирование потока управления
У нас есть три варианта для D4. В данный момент я возьму вариант С1, приво
дящий к D4C1B2A2.
D4C1B2A2: 32. 33а1. ЗЗа2(Л). ЗЗа4(Л). ЗЗаб(Л). ЗЗа8(Л). ЗЗаЮ. ЗЗЬ(Л).
З З с (Л ) . ЗЗс2(И ). ЗЗсЗ. 3 4 (Л ). 3 4 .2(Л ). 34.3(Л). 34.5(H). 34.6.
34.12
В этом месте мы еще должны включить Al, Bl, С2, СЗ, Dl, D2 и D3. D3 может
сочетаться только с комбинацией В1А2, поэтому давайте скомбинируем В1А2 с
СЗ, для того чтобы получить в итоге СЗВ1А2 с D3.
D3C3B1A2: 32. 33а 1. ЗЗа2(Л). ЗЗа4(Л). ЗЗаб(Л). ЗЗа8(Л). ЗЗаЮ. ЗЗЬ(И).
З З Ы . ЗЗс(И). З З с К Л ) . ЗЗс4(И ). ЗЗсЗ. 34(Л). 3 4 .2(Л). 34.3(H).
34.4. 34.12
У нас не было вариантов для путей D5-D8. Если бы у нас были варианты, как
.и в случае D1-D4, выбор комбинаций основывался бы на нескольких критериях.
Нам необходимо было бы учитывать прошлую историю ошибок, насколько труд
но было анализировать комбинацию (выберите сложную комбинацию, так как
если у вас есть проблемы, то они могут быть и у программиста), как много иссле
дований мы должны были сделать для прояснения проблемы (выберите комбина
цию, требующую больших исследований). Также пришлось бы опираться на ин
туицию и знание образа работы ответственного программиста.
В качестве упражнения закончите выбор пути от узла 34.12 к узлу 40. У нас
есть восемь тестов вплоть до узла 34.12. Узел 34.13 добавит только один тест. Узел
36 не добавит никаких тестов (почему?). Узел 38 добавит два теста. Оставшиеся
предикаты не нуждаются в тестировании. Таким образом, похоже, что мы можем
добиться покрытия связи за 11 тестов. Так как я этого не делал, я могу ошибаться.
Однако когда мы будем активизировать эти тесты, возможно, придется вернуться
назад и добавить другие тесты.
На рассмотренный пример выбора пути (изложенный выше) я потратил
семь часов. Может быть, я более опытен, чем вы, но мне пришлось его объяснять.
Предыдущий пример не труднее, чем кажется. Вам следует его выполнить при
мерно за то же самое время.
3.4.4. Активизация
3.4.4.1. Основы
Активизация. Поиск входных значений, при которых (в случае отсутствия в реа
лизации ошибок) в модели будет пройден выбранный путь.
Большая часть тех процедур, которые описывались в предыдущем разделе, яв
лялись активизацией логики в моделях. Процедура активизации зависит от пре
дикатов, встречающихся в рассматриваемом пути. Если предикаты в большинстве
своем логические, как это было в предыдущем разделе, тогда активизация и выбор
пути осуществляются одновременно. Если предикаты в большинстве своем чис
ленные (то есть алгебраические), то данные процедуры различаются, что описы
вается в подразделе «Алгебраическая активизация».
Знание приложения важнее знания алгоритма активизации. Знание того, что
приложение будет делать в том или ином случае, существенно для определения
набора путей, обеспечивающих полное покрытие, и входных значений для их ак
тивизации. Я уверен, что если бы мы были экспертами в области налогообложе
ния, нам было бы гораздо легче найти для предыдущего примера набор путей,
обеспечивающих покрытие. Прежде чем вы потратите силы и время на активиза
цию, запустите простейшие тесты вашей модели и убедитесь, что она обеспечива
ет покрытие связей. После этого у вас останется совсем немного мудреных путей,
требующих для активизации применения формальных методов.
84 Глава 3 • Тестирование потока управления
7. На данном этапе у вас уже есть набор больших сегментов, которые не кор
релируют друг с другом. Это означает, что вы можете выбрать отрезки пути
в каждом из сегментов, которые не зависят от других сегментов. Выберите
достаточное число путей в каждом сегменте, чтобы быть уверенным, что вы
обеспечили покрытие связей внутри этих сегментов.
8. Объединяйте сегменты, комбинируя пути и выбирая имеющие смысл ком
бинации. Обратите внимание, что число тестов при этом не должно увели
читься. Например, сегмент А содержит 6 путей, а сегмент В — 10 путей. Это
означает, что пара сегментов будет содержать 10 путей, а не 60. Поскольку
сегменты некоррелированные, вы можете связать любой отрезок пути в сег
менте А с любым отрезком пути в сегменте В.
9. Продолжайте до тех нор, пока не получите набора путей, обеспечивающих
покрытие.
10. Теперь мы можем перейти непосредственно к активизации. Следуйте вдоль
пути и по достижении предиката определите входное условие, при кото
ром предикат принимает значение ИСТИНА или ЛОЖЬ, в зависимости
от требований пути. Вам, возможно, придется использовать некоторые ме
тоды из следующего раздела для осуществления этого, однако, как правило,
для большинства логических предикатов и предикатов выбора, это должно
быть просто, так как вы уже убедились в отсутствии противоречий на вы
бранном пути.
3.4.4.3. Алгебраическая активизация
Интерпретация предиката. Предикат считается интерпретированным, если он
выражен через входные значения. Интерпретация предиката зависит от выбора
пути. Это означает, что мы можем получить эквивалентный предикат, следуя в
вычислениях по определенному пути, ведущему к этому предикату.
Примером в данном разделе служит расчет детализированных льгот в Бланке А,
строке 29 (См. Приложение). Модель для этого вычисления приводится ниже. Это
не полная модель —она содержит только узлы, находящиеся на пути, который мы
активизируем. Переменные, начинающиеся с буквы А, относятся к бланку А или
к строкам формы 1040. Переменные, начинающиеся с буквы W, относятся к про
цедуре расчета.
1 1.1 in p u t AL4
1.1 1.2 in p u t AL9
1.2 1.3 in p u t AL14
1.3 1.4 in p u t AL18
1.4 1.5 in p u t AL19
1.5 1.6 in p u t AL26
1.6 1.7 inpu t AL27
1.7 1.8 in p u t AL28
1.8 2 W1 = AL4 + AL9 + AL14 + AL18 + AL19 + AL26 + AL27 + AL28
2 2.1 in pu t AL13
2.1 2.2 in p u t AL28g
2.2 3 W2= AL4 + AL13 + AL19 + AL28g
3 3.1 W3= W2-W1
86 Глава 3 • Тестирование потока управления
Если нам сильно не повезет, то придется решать систему уравнений для ак
тивизирующих величин. Уравнения в системе представляют собой интерпре
тированные предикаты. В большинстве случаев, однако, это просто вопрос пра
вильного выбора входных значений для первого интерпретированного предиката,
подстановки их в последующих предикатах и упрощения по мере продвижения.
Предположим, например, что у нас есть следующий набор интерпретированных
предикатов (это не относится к нашей модели) для выбранного пути:
AL9 + AL14 + AL18 + AL26 + AL27 + AL32 > AL13 + AL28
AL9 + 0 . 05*AL14 > AL32
AL32 > 55.900
AL14 > AL18
AL9 = 10
AL18 = 15
AL26 = 30
AL27 = 40
AL13 = 5
AL28 = 10
AL14 = AL18 + 10
AL32 = 55.900
Детализированные
льготы? Бланк А
3.6. Резюме
Поведенческое тестирование потока управления рассмотрено как фундаменталь
ная модель тестирования черного ящика. Она является основой для всех других
методов тестирования, обсуждаемых в этой книге, и впоследствии я буду считать,
что вы ее усвоили.
Проектирование тестов начинается с создания поведенческой модели графа
потока управления на основе документированных требований, таких как специ
фикация. Представление в виде списка, как правило, более удобно, чем рисунки
графов, но маленькие графы помогают при проектировании модели.
94 Глава 3 • Тестирование потока управления
4.1. Обзор
Тестирование цикла — это эвристический метод, который следует использовать
в сочетании со многими другими методами тестирования, поскольку опыт пока
зывает, что ошибки часто сопутствуют циклам. Методы, обсуждаемые в этой гла
ве, применяются в тех случаях, когда имеются циклы в таких графах как: граф по
тока управления, граф потока транзакций, или синтаксический граф.
4 Зак. 770
98 Глава 4 • Тестирование циклов
Обработка
обработки
4.3. Отношения и модель 99
Нет
обработки
Обработка
Вложенные циклы. Два или более циклов — вложенные, если один полностью
содержится в другом. На следующем рисунке цикл 10-20-10 является вложен
ным по отношению к циклу 5-25-5.
1 Пусть вас не сбивают с толку языки программирования и семантика конструкций типа опера-
юров FOR и WHILE. Почти любая комбинация детерминировапных/педетерминированиых циклов с
проверкой до/после/смеш апной может быть создана с помощью почти любой логической структуры.
Смотрите упражнения в конце главы.
100 Глава 4 • Тестирование циклов
40 45 обработка цикла
45 46 lo o p _ co n tro l = lo o p _ co n tro l + INT(3*RAND)
46 30 lo o p _ co n tro l = lo o p _ co n tro l + 1
50 продолжить оставшуюся часть модели
Люди не могут и не будут вести себя структурно. Например, они могут сразу
выйти из цикла, поняв, что совершили ошибку при наборе номера.
10 20 d ig it_ c o u n t = 0. d ig it jn a x = 11
20 30 d ig it_ c o u n t < = d ig it jn a x . d ig it_ c o u n t = d ig it_ c o u n t + 1
50 d ig it_ c o u n t > d ig it jn a x . выйти из цикла
30 40 набор цифры
40 20 цифра набрана успешно
10 цифра не набрана, трубка вешается и номер набирается заново
50 продолжить дальше модель
4.4. Методы
4.4.1. Критические тестовые значения
Рассмотрим общую детерминированную модель цикла.
10 20 lo o p _ co n tro l = s t a r t v a l . ite rm ax = upperval
20 30 lo o p _ c o n tro l > iterm ax
40 lo o p _ co n tro l < - iterm ax
30 20 lo o p p ro ce ss. lo o p _ co n tro l = lo o p _ co n tro l + in c re v a l
40 продолжить оставшуюся часть модели
рования, как С —за исключением, конечно, того случая, когда вы проверяете реа
лизацию и видите, что имеете дело с низкоуровневым программированием.
1Я выбрал 10 записей, поскольку теория и опыт говорят, что значения 1 ,2 ,3 ,4 и 5 могут приводить
к различным моделям поведения. Поскольку 5 - 1 - 4 не является общим вариантом, 5 пропущено.
Поскольку 6 - 1 = 5 — это первый общий вариант, 5 не является хорошим значением. Первое хорошее
общее значение — это, возможно, 7. Но степени двойки и числа, близкие им (7, 8, 9), могут быть про
блемными, так что 10 — это первое действительно хорошее типичное значение.
4.4. Методы 109
4.6. Резюме
Тестирование цикла —это эвристический метод, основанный на опыте, который
программисты приобретают, сталкиваясь с ошибками в начале и конце циклов.
Несмотря на то, что для пояснений в этой главе были использованы примеры с по
током управления, метод эффективен для большинства графовых моделей, име
ющих циклы (исключая сильно связные графы). Необходимые для тестирования
значения основаны на числе повторений цикла: 0,1, 2, MIN - 1, MIN, MIN + 1, ти
пичное количество проходов, МАХ - 1, МАХ, и МАХ + 1, а также на комбинациях
этих величин для вложенных циклов.
5.1. Обзор
Граф потока данных является характерной особенностью многих методов проек
тирования программного обеспечения и с успехом используется в проектирова
нии тестов.
Сэм,
Джо
Сэм,
Джо
Запоминающий узел. Пара узлов для одного и того же объекта данных. Узел
\
SAM
VIV
118 Глава 5 • Тестирование потоков данных
В предыдущем примере выбор VIV мог быть основан на значениях всех входя
щих связей:
Значение_исходящей_связи: = МАКСИМУМ (значения_входящих_связей)
В этом случае управляющей входящей связи нет. И наоборот, выбор мог быть
основан на значении управляющей входящей связи, которое определяет, какое
значение и какой входящей связи должно быть использовано:
Значение_исходящей_связи: = ВЫБОР(УПРАВЛЯЮЩАЯ_ПЕРЕМЕННАЯ. значения_входящих_связей)
ся прямым, то здесь нет прямых стрелок из этих узлов к узлу 53. Однако есть по
токи данных из некоторых из этих узлов, приходящие в узел 53.
Свойства узлов (веса узлов). Пометьте узлы функцией входящих связей, кото
рую они вычисляют. Это может быть просто имя выхода функции (например, об-
щий доход) или сама фактическая функция, например, формула.
Свойства связей (веса связей). Добавление весов связей не является необхо
димым, поскольку эта информация заложена в весах узлов. Однако поскольку
графы потока данных могут быть довольно сложными, обычно исходящие связи
помечаются именами представляемых ими объектов данных. Если узел представ
ляет собой узел выбора данных, пометьте входящие связи значениями предиката
выбора, соотнесенными с каждой входящей связью.
Вы, возможно, захотите начертить все эти графы потока данных для сравнения.
Модели потоков данных могут показаться более сложными по сравнению с ранее
рассматриваемыми моделями, но это не так. Они только включают больше инфор
мации, чем обычно закладывается в модель потока управления. Дополнительные
детали возникают вследствие того, что каждый объект данных должен откуда-то
появиться. Вот почему мы добавили два узла kl и k2, отвечающие за константы
$2450 и $83850 соответственно. Мы добавили связь 32 : 36 в первую модель пото
ка данных (связь 32 : 36.2 во вторую модель потока данных) потому что adjusted_
gross_income (скорректированный общий доход) должен откуда-то появиться.
Связь 6е: 36.1 для переменной total_number_of_exemptions (общее_число_освобож-
дений) была добавлена по той же причине. Если мы уберем эту дополнительную
информацию (уменьшив детализацию нашей модели), мы получим даже еще бо
лее простую модель (по числу узлов и связей), чем модель потока управления.
36.1: 36: total_num ber_of_exem ptions (общее_число_освобождений) * k l
Р23: 36: расчет_согласно_инструкции
36: ... узел_выбора_данных 36.1 IF СОД <= к2
Р23 IF СОД > к2
122 Глава 5 • Тестирование потоков данных
Будьте осторожны с такими величинами, как ноль и пусто; это не одно и то же.
Мы ввели два входных узла в последний пример: 54.1 графа: = отмечена и 54.2 гра
фа: = неотмечена. В обоих случаях графа имеет реальное значение. Таким же обра
зом значение ноль —реальное значение, в то время как пусто не имеет какого-либо
значения. Это означает —не определено.
Рассмотрим оператор присваивания: IF х > 0 THEN сэм: = джо. Мы знаем, что
делать с сэм, когда х > 0, но вдруг х <= 0? Есть две альтернативы: либо у перемен
ной сэм нет значения, и она здесь же и создается, либо имеется другое, заранее
' Я начал писать эту книгу в 1992 году. Я должен был исправлять эти числа в 1993, 1994 и, наконец,
еще раз в 1995 году. Однако, в отличие от вас, я не мог использовать символьную переменную для этих
чисел. Было бы намного проще, если бы я мог так поступить. Если я пропустил несколько обновлений,
я уверен, что вы сообщите мне об этом, — но надеюсь, что вы простите меня.
5.3. Отношения и модель 123
рассчитанное где-то в другом месте графа потока данных значение для сэм. Первый
случай не представляет проблемы. Мы моделируем его так: IF х > ОTHEN сэм: = джо
ELSE сэм:= пусто. Второй случай тоже не сложен. Он должен быть смоделирован
так: IF х > О THEN сэм: = джо ELSE сэм: = старое_значение_сэм. Нам снова не нужно
сомнительное IF-THEN.
Возможно, проблема возникнет, если переменная сэм определена в более чем
одном месте. Какое значение нам следует использовать для случая ЛОЖЬ? Это —
хороший вопрос, не имеющий простого ответа. Тут возможны варианты, пос
кольку в случае неоднозначности не бывает очевидного ответа. Конструкция
IF-THEN однозначна в графе потока управления, потому что графы потока управле
ния имеют подразумеваемое упорядочение (упорядоченную последовательность).
Следовательно, обычно имеется подразумеваемое (предшествующее) значение
для такой ситуации. В графах потока данных, в которых нет подразумеваемого
упорядочения, значение становится неоднозначным. Вот почему следует избегать
использования IF-THEN в подобных моделях. Но заметьте, что неоднозначность
в модели увеличивает вероятность ошибок программирования.
В качестве примера использования IF-THEN рассмотрим, как бы мы могли смо
делировать строки с 1-й по 5-ю в форме 1040. Здесь приведен псевдокод для этих
строк.
1: IF статус налогоплательщика = холост THEN отмечена графа_1; GOTO 6а
2: IF статус налогоплательщика = женат_заполнено_совместно THEN отмечена графа_2: GOTO 6а
3: IF статус налогоплательщика = женат_заполнено_раздельно THEN отмечена графа_3: GOTO 6а
4: IF статус налогоплательщика = домовладелец THEN отмечена графа_4; GOTO 6а
5: IF статус налогоплательщика = вдовец THEN отмечена графа_5; GOTO 6а
Программисты могут возразить, что этот код нехорош, так как он неоправдан
но сложен, что само по себе делает код более уязвимым для ошибок, и, кроме того,
он не структурирован. Все это правда, но ведь это не код. Это всего лишь модель,
в которой мы пытаемся сделать ситуацию как можно более однозначной. Вот мо
дель потока данных для этих действий.
0.0; . 0.1 вход_статус
О.Г. графа_1: графа_1: 6: выбор: IF статус = неженат
выбрать отмечена ELSE выбрать не
отмечена
124 Глава 5 • Тестирование потоков данных
Модель может показаться сложной, но это не так, потому что определено всего
пять различных выходов (по одному на каждую графу). В тестируемом программ
ном обеспечении, в котором реализуется этот процесс, мы должны убедиться не
только в том, что правильная графа отмечена, но и в том, что все остальные графы
остались неотмеченными и отмечено не больше одной графы. Заметьте, что если
вход статус_налогоплателыцика не является одним из пяти правильных вариан
тов, тогда все графы останутся неотмеченными.
Селектор CASE. Структура Селектора CASE в графах потока данных —обобщение
структуры IF-THEN-ELSE. Модель потока данных для строки 34 такова:
34.1: 34: вход $3800 (холост, de du ction (возврат): =
$3800)
34.2: 34: вход $5600 (домовладелец.
de du ction (возврат): = $5600)
34.3: 34: вход $6350 (женат совместная декларация,
de du ction (возврат): = $6350)
34.4: 34: вход $6350 (вдовец.
de du ction (возврат): = $6.350)
34.5: 34: вход $3175 (женат, заполнено раздельно,
de du ction (возврат): = $3175)
статус: 34: вход статус_налогоплательщика (управляющая входящая связь для
селектора 34)
34: выбор статус_налогоплательщика: холост 34.1
домовладелец 34.2
совместно 34.3
вдовец 34.4
раздельно 34.5
Когда вы, как об этом говорилось выше, разделяете модель на уровни, вам, воз
можно, придется «создать» новые объекты данных, которых нет в спецификациях.
Определите их так точно, как если бы вы занимались программированием, задай
те их атрибуты, определения и так далее. После определения, такая псевдопере
менная становится переменной при использовании в модели потока данных более
высокого уровня.
При создании и использовании таких упрощенных методов вы не програм
мируете и не меняете технические требования — вы закладываете фундамент,
необходимый для создания высокочувствительного теста. Если приложение
сложно организовано, приготовьтесь к тому, что тесты будут, подобно ему, об
ладать сложной структурой. Если программное обеспечение выигрывает при
использовании иерархической структуры, разбиения и многократно использу
емых компонентов, то выиграет и тестовый комплект. Большинство методов,
использование которых оправдано при проектировании программы, окупаются
при разработке тестов.
Вы могли бы раскритиковать такой подход к организации разработки тестов,
сказав: «Ни приложение, ни программное обеспечение не всегда бывает струк
турировано должным образом. Предполагая хорошую структуру тестируемой
системы при проектировании тестов, вы можете упустить из виду возможность
выявления ошибок, являющихся следствием плохой структуры, — например,
ошибок, проистекающих из смешения уровней файла, поля, записи данных с их
обработкой».
Подобный критицизм заслуживает внимания, но из того, что структура про
граммы размыта, не следует того, что плохо структурированное тестирование бу
дет более эффективным. Не следует доверять поимку вора вору. Необходимо ра
ботать систематично.
Как можно повысить эффективность использования скудного времени, отпу
щенного на проектирование тестов? Существует гораздо больше способов спроек
тировать программное обеспечение плохо, чем способов сделать это хорошо. Если
вы решили придерживаться неструктурированного проектирования тестов в по
пытке найти некоторые ошибки, вы можете также ошибиться в предположениях о
коде, как и при хорошо структурированном проектировании. Вы обманываете са
мих себя. Единственный способ сделать обоснованные допущения о коде, на кото
рых можно основать проектирование тестов, —это посмотреть на код и построить
дизайн ваших тестов в соответствии с его структурой. Но это уже нельзя назвать
тестированием черного ящика.
Приняв структурированную модель, вы увеличиваете вероятность того, что
ваши позитивные тесты будут обеспечивать покрытие требований. Такой на
бор тестов более объективен и при создании негативных тестов. Например, раз
деляя тесты на уровне файла и полей записи, вы можете яснее увидеть, какая
имеется возможность для грязных тестов, в которых эти уровни перемешаны.
Проектирование грязных тестов будет проще и потребует меньшего количества
предположений об ошибках, так что работу будет проще оценить.
5.3. Отношения и модель 127
1 Мы все знаем, что подготовка наших налоговых деклараций — повторяющаяся процедура, кото
рая производит впечатление бесконечной (до 15 апреля). Зная особенности бюрократического мыш
ления, я очень надеялся найти много необходимых циклов в налоговых законах. Я просмотрел все
формы и инструкции (это порядка 950 страниц терминологии ВНС) в моем налоговом пакете. Я об
наружил множество способов уйти от уплаты налогов, но не нашел ни одного необходимого цикла. Я
уверен, что они там есть, но я не эксперт по налогам, так что я не смог найти пи одного. Любой читатель,
который укажет мне на необходимые циклы, чтобы использовать их в качестве примеров в последую
щем издании книги, получит бесплатный экземпляр этого издания.
5 Зак. 770
130 Глава 5 • Тестирование потоков данных
значение Х0. Нам также нужно исходное значение для счетчика итераций IQ. Мы
не знаем, действительно ли код содержит эти исходные значения в виде явно вы
раженных констант, но, следуя логике, полагаем, что они существуют. Опыт гово
рит нам, что ошибки исходных значений случаются сравнительно часто, так что
это имеет смысл проверить.
Первая модель мне не нравится. Она не настолько близка к модели потока дан
ных, насколько мне бы хотелось. Узел ЦИКЛ имеет скрытую сложность, и наиболее
важный вопрос — каким образом выбраны исходные значения? Модель на следу
ющем рисунке более ясна. Я добавил два узла выбора данных (помеченных «?»),
чтобы выбрать между исходными значениями X и I. Я также ввел управляющую
связь из селектора I к селектору X, чтобы показать, как программа могла бы вы
бирать между исходным значением Х0 и последующим значением X,. Например,
там мог бы находиться предикат в форме IF I = О THEN ВЫБРАТЬ X, ELSE ВЫБРАТЬ Х0.
В случае реальной проблемы вам следовало бы иметь больше информации о спе
цифике условий прекращения цикла и разместить больше этой информации внут
ри чисто потоковых (по данным) узлов. Например, условие прекращения цикла
может быть основано на разнице между предыдущим и настоящим значениями
X и сравнении ее с некоторой маленькой константой £.
вится в узле Х2 и третья — в узле Х3. Это три отдельных модели, позволяющие
рассмотреть три случая — выход без прохождения цикла, выход после однократ
ного прохождения цикла и выход после двукратного прохождения цикла. Если вы
должны протестировать максимальное число итераций, используйте модель пото
ка управления.
5.4. Методы
5.4.1. Основы
Ссылки на материал, описанный в этом разделе, можно встретить в [SNEE86,
ZWEB92]. Данные книги рекомендуются для дополнительного ознакомления с
рассматриваемыми концепциями.
Проектирование и выполнение тестов остаются такими же, как и для моделей
потока управления, с незначительными различиями, которые вытекают из того,
что мы имеем дело с графами потока данных, а не с графами потока управления.
В дальнейшем я буду предполагать, что у нас нет циклов.
1. Проверьте спецификацию.
2. Идентифицируйте входные переменные, особенно константы. Дайте каж
дой входной переменной имя и создайте для нее входной узел.
132 Глава 5 • Тестирование потоков данных
1 То, что обязательно для вас, совсем не обязательно для меня, и наоборот. Никогда не забывайте,
что модели — это мысленные инструменты и что в них нет чего-либо принципиально правильного или
неправильного. Они могут быть только полезными или бесполезными. Вы можете предпочесть сохра
нить несущественное промежуточное вычисление в модели, поскольку знаете, что это будет выгодно в
другом контексте или просто потому, что люди часто склонны думать подобным образом.
5.4. Методы 133
На самом деле это неправильно, не так ли? Строка 55 по сути является суммой
двух слагаемых, строка 58а — сумма двух слагаемых, и строка 59 тоже является
суммой двух слагаемых (форма 2349 и форма 4136: Налог со всех видов дохода
в 1994 и Сумма, взятая из декларации 1993, соответственно). Мы создадим более
детальную модель.
54: 60: Federal_T ax_W ithheld (Удержанный_федеральный_налог)
55a: 55: 1994_Estimated_Tax_Payment
(Выплата_налога_со_всех_видов_дохода_в_1994)
55b: 55: Am ount_Applied_from_1993_Return 1
1 Нам нужна одна из стратегий «всех использований», но не настолько мощная, как проверка всех
путей, которая в контексте поведенческого тестирования просто неосуществима
5.4. Методы 137
(Сумма_заявленная_в_декларации_1993 )
55: 60: 55а + 55Ь
56: 60: Еа rned_Income_Credi t
(Налоговые_льготы_предоставляемые_получателям_заработной_платы)
57: 60: Amount_Pa i d_wi th_Form_4868 ( Extens i on_Request)
(Сумма_уплаченная_в_соответствии_с_формой_4868
(Просьба о продлении))
58а 1: 58а: E xce ss_ S o cia l_ S e cu rity_ T a x_ W ith h e ld
(Налог_на_превышение_социального_обеспечения)
58а 2: 58а: Excess_RTTA_Tax_W ithheld (Налог_на_превышение_РРТА)
58а: 60: 58a1 + 58a2
59а: 59: Другие_выплаты_в_соответст8ии с Формой 2439
59Ь: 59: Другие выплаты в воответствии с Формой 4136
59: 60: 59а + 59Ь
60: Total Payments (Общие выплаты):= 54 + 55 + 56 + 57+ 58а + 59
данных. Сначала мы рассмотрим более простой случай, при котором в двух пре
дикатах выбора происходит ветвление потоков. Это изображено на следующем
рисунке.
ном (и требующем больших затрат) тестировании вам следует взять оба порож
денных подграфа. В нашем примере это добавляет только один тест, но если у нас
есть много узлов выбора, расположенных один за другим в каждом порожден
ном подграфе, разница в подходах может стать разительной. Эти два метода соот
ветствуют применению того, что формально известно как критерий всех исполь
зований (ВИ) (берется какой-либо один порожденный подграф, который влияет
на значение W) и критерий Всех путей-определение-использование (ВПОИ) (бе
рется каждый порожденный подграф, влияющий на значение W). ВПОИ —более
полный метод, чем ВИ, но требует бблыпих трудозатрат. Исходя из эмпирическо
го доказательства, приведенного в [WEYU90], вы сможете получить больше пре
имуществ, выбрав ВИ. Таким образом, убедитесь, что вы включили по крайней
мере один порожденный подграф для каждого выхода, а не все возможные порож
денные подграфы, которые появляются вследствие всех возможных комбинаций
выбора в селекторах (и, как мы увидим, всех комбинаций значений для предика
тов потока управления и условий циклов).
Я буду строить эту модель для случая, когда ваш супруг(а) (если он(а) есть) не
работает, и вы можете (или не можете) внести взнос в ИПС за него. Полная мо
дель (в которую включен работающий супруг) оставлена в качестве упражнения
для самостоятельного выполнения. Вы можете предположить, что в этой модели
некоторые из узлов и связей на самом деле не нужны, например, такие как: С 1а,
СЗа, С4, С5 и С7. Я сохранил все узлы, следующие за узлом выбора, в качестве
меры предосторожности и для того, чтобы быть уверенным в том, что узел выбора
в этой модели явный, а не скрытый, по аналогии с формой. Строка 5 (узел 5) была
сохранена, поскольку подобная строка имеется в форме ВНС, и у нас будет воз
можность проверить ее значение.
k l: CCla константа = $2000
СС7
BCla: CCla ВХОД ваш_взнос_в_ИПС_94
С2а: ССЗа ВХОД your_94_wages
(Ваша_заработная_плата_в_1994 ??)
СС4а
ВС7: СС7 ВХОД взнос_супруга_в_ИПС_94
к2: СС4а константа = $2250
CCla: C la ВЫБРАТЬ мин m in (k l, BCla)
C la : ССЗа
ССЗа: СЗа ВЫБРАТЬ мин m in (C la . С2а)
СЗа: ВЫХОДа ВЫХОД в Строку 23а Формы 1040
С5
С5: Сб (замечание: спецификация ВНС неправильна,
вместо "СтрокаЗ" должно быть сказано
“СтрокаЗа" - подобные пустяки как раз и порождают ошибки)
СС4а: С4 ВЫБРАТЬ мин (С2а. к2) (замечание: в этом месте еще одна ошибка
ВНС)
С4: Сб
Сб: СС8 С4-С5
СС7: С7 ВЫБРАТЬ мин (ВС7. k l)
С7: СС8 ВЫБРАТЬ мин (Сб. С7)
СС8: С8 ВЫХОД в строку 23Ь формы 1040
Тест 3: С8. СС8. Сб. С5. СЗа. ССЗа. С2а. С4. СС4а
Тест 4: С8. СС8. Сб. С5. СЗа. ССЗа. C la . CC la. k l . С4. СС4а. к2
Тест 5: С8, СС8. С7. СС7. ВС7
Тест б: С8. СС8, С7. СС7. К1
5.4.6. Активизация
Каждый тест соответствует порожденному подграфу. Если порожденные подгра
фы были определены корректно, тогда для активизации одного подобного порож
денного подграфа достаточно задать только его входные величины. Активизация
происходит по большей части так же, как это было описано для потоков управ
ления, за исключением того случая, когда вы можете решить, что проще начать с
выхода и двигаться в направлении входов. Если же в порожденном подграфе нет
узлов выбора или узлов потока управления, об активизации не стоит и говорить.
Любые приемлемые входные значения подойдут.
В случае существования узлов выбора или узлов потока управления следует
выполнить несколько процедур.
1. Обратите внимание на минимальные и максимальные значения для каж
дого входа. Если значения составляют некоторое множество, запишите все
значения из него.
2. Двигайтесь по всем ветвям порожденного подграфа в обратном направле
нии (к началу), отмечая пути, которые достигают входов без прохождения
через узлы выбора (потоков данных или потоков управления). Вы можете
146 Глава 5 • Тестирование потоков данных
пока игнорировать эти части порожденного подграфа, потому что для вхо
дящих данных, скорее всего, нет ограничений.
3. Двигайтесь наверх вдоль путей, пока не достигнете узла выбора (для кото
рого вы уже сделали выбор). Этот узел выбора — неважно является ли он
узлом выбора потоков данных или потока управления — содержит преди
кат, значение которого вы уже определили (выбором данного порожденного
подграфа). Этот предикат теперь накладывает ограничения на все входные
значения, которые могут быть достигнуты при движении по порожденному
подграфу из этой точки. Определите самый широкий набор входных значе
ний, удовлетворяющих этому предикату.
4. Продолжайте обрабатывать каждый встреченный вами предикат (при дви
жении к началу порожденного подграфа). Если в порожденном подграфе на
выбранном пути имеется больше двух предикатов, следует рассматривать
их условия одновременно, а каждый последующий предикат накладывает
дополнительные ограничения на возможные входные значения.
Для потоков данных активизация обычно происходит проще, поскольку в этом
случае существует сравнительно немного промежуточных узлов и обычно не нуж
но интерпретировать предикаты для того, чтобы выразить их через входные пе
ременные. Если вы имеете дело с таким случаем, поступайте так, как если бы ра
ботали с потоками управления, учитывая, что вы имеете дело с порожденными
подграфами для потоков данных, а не с отдельными путями.
Активизация предыдущего примера с бланком ИПС не так уж сложна. Ваши
взносы в ИПС сравниваются с $2000, и соответственно есть два возможных ва
рианта. Ваша заработная плата в 1994 году сравнивается с $2250 — вот еще два
варианта. И, наконец, взнос в ИПС вашего супруга сравнивается с $2000. Всего
мы получаем восемь возможных случаев, из них шесть должны быть осуществи
мы. Составляя различные комбинации входных переменных, выбирая их больше
или меньше той суммы, с которой они сравниваются, получаем следующие набо
ры значений для активизации тестов:
Тест Ваш 1994 взнос Ваша заработная плата в 1994 Ваш 1994 взнос
Тест 1 $1900 $2251 $2060
Тест 2 $2050 $2100 $2251
Тест 3 $2100 $1950 $3500
Тест 4 $2100 $2251 $1500
Тест 5 $200 $1800 $1500
Тест 6 $200 $1800 $2500
5.6. Резюме
Тестирование потоков данных — более эффективный метод, чем тестирование
потоков управления. Он основан на определении модели потоков данных и ис
пользовании этой модели как основы для проектирования тестов. Тесты созда
ются путем выбора порожденных подграфов —движением от выходных узлов ко
всем входным узлам порожденного подграфа. Мы определили несколько метрик
покрытия, но метод всех использований, дополненный разверткой циклов (дву
кратной), рекомендован в качестве минимально приемлемой метрики.
6.1. Обзор
Графы потока транзакций используют в системном тестировании приложений,
работающих в режиме онлайн, и программного обеспечения для пакетной обра
ботки. Этот граф обладает свойствами как потока управления, так и потока дан
ных.
чальный узел, конечный узел, модель конечного числа состояний, граф, входящая
связь, ввод, интеграция, промежуточный узел, связь, покрытие связей, вес связи,
цикл, тестирование цикла, модельная программа, узел, покрытие узлов, итог, ис
ходящая связь, путь, предикат, отношение, активизировать, порожденный под
граф, спецификация, состояние, субмодель, системный тест, проект теста, путь
теста, тестирование, критерий соответствия.
Транзакция —единичная операция по обработке данных.
Маркер транзакции — метка (например, точка), которая отображает присут
ствие транзакции на модельной связи.
Контрольная запись транзакции —гипотетическая или фактическая запись, кото
рая содержит данные о транзакции. В фактической записи нет необходимости, одна
ко во многих системах она присутствует. Там, где контекст позволяет, вместо термина
«контрольная запись транзакции» будет использоваться термин «запись транзакции».
Состояние транзакции — потенциально это значения всех данных в контроль
ной записи транзакции или ее неявном эквиваленте. Но, как правило, состояние
выражают лишь частью данных записи, зачастую целым числом.
Тип транзакции — некое обозначение, например, целое число, которое исполь
зуется для идентификации транзакций различных типов.
Стартовый узел — узел в модели графа потока транзакций, в котором транзак
ция начинает нас интересовать. Это входной узел графа потока транзакций.
Завершающий узел —узел в модели графа потока транзакций, в котором транзак
ция прекращает нас интересовать. Это выходной узел графа потока транзакций.
Задача —каждая задача в графе потока транзакций представлена узлом.
Узел ветвления — узел, в котором входящая транзакция выбирает одну из не
скольких альтернативных исходящих связей. Так, на рисунке входящая транзак
ция вышла на самую верхнюю связь.
Узел слияния —узел, в котором две или более входящие транзакции (родитель
ские транзакции) сливаются в новую, выходящую дочернюю транзакцию. После
узла слияния родительские транзакции перестают существовать.
IХищник
Хищник
@ Жертва
Узел 12 является узлом ветвления, так как транзакция должна либо продол
жить заполнять Бланк С, либо обойти его, если нет дохода от индивидуальной
трудовой деятельности. Узел 12.1 — это узел порождения, из которого начинает
ся дочерняя транзакция для Бланка С. Предположим, что на этом уровне в узел
С приходит незаполненный Бланк С, а выходит из узла С уже заполненный. Узел
12.2 представляет собой узел поглощения, потому что здесь данные Бланка С за
носятся в форму 1040. Узел С —узел расщепления, так как нам необходима копия
Бланка С для налоговой службы, а также для формы 1040. Наконец, узел 13 явля
ется узлом соединения, потому что форма 1040 может появиться на любой из вхо
дящих в него связей, но не на обеих.
6.3.2. Маркировки
Маркировка. Набор всех меток (и связанных с ними состояний) на всех связях
в любой момент времени называется маркировкой графа потока транзакций. Для
всего графа потока транзакций маркировка является тем же самым, чем является
состояние для отдельной транзакции.
Очередь. Связь, которую можно маркировать более чем одной меткой, пред
ставляет собою очередь. Это может, конечно, быть и обрабатывающая очередь, но
она может также представлять собой и обычную очередь из ожидающих людей.
Проследим путь следования одной транзакции через граф потока транзакций.
Если бы не существовало узлов расщепления и порождения, это было бы эквива
лентно маркировке пути в графе потоков управления. Но две детали делают эту
простую интерпретацию маловероятной — существование очередей и узлы слия
ния и поглощения.
Мы можем использовать различные маркировки, определяя, какие маркеры
и на каких связях появляются на каждом шагу. В нашей модели есть два вида сим
волов: форма 1040 и Бланк С, сокращенные до «Ф1040» и «Б-С» соответственно.
Если в модели есть только одна транзакция, то существуют две возможные марки
ровки в зависимости от того, выполняем ли мы Бланк С.
Без Бланка С:
Шаг 1: 11/12 Ф1040
Шаг 2: 12/13 Ф1040
С Бланком С:
Шаг 1: 11/12 Ф1040
6.3. Отношения и модель 157
6.3.3. Очереди
Детальное описание очередей можно встретить в [СООР81].
Все реальные очереди ограничены, то есть они имеют некий максимально воз
можный размер. При выходе за пределы этих размеров плохо протестированные
системы могут неожиданно выйти из строя, так что стоит тестировать максималь
но возможный размер очереди. Если существует очередь, то должно быть и прави
ло упорядочения —то есть правило, определяющее, в каком порядке транзакции
будут поступать из очереди для обработки. Ниже приведены некоторые распро
страненные правила.
Правило FIFO — «первым пришел — первым вышел» («first-in, first-out»), на
зываемое также «First-Come-First-Served» — («первым прибыл — первым обслу
жен»). Транзакция, которая раньше всех поступила в очередь, будет обработана
раньше всех. Это самое простое правило очень распространено. Но представьте,
что было бы, если бы Виления настаивала, чтобы все заполненные Бланки С воз
вращались к ней в том же порядке, в каком она отдавала их на обработку.
Правило LIFO — «последним пришел — первым ушел» («last-in, first-out»),
называемая также LCFS «Last-Come-First-Served» — («последним пришел —
первым обслужен»). Транзакция, которая позже всех поступила в очередь, будет
обработана раньше всех. Подобная очередь является обрабатывающим стеком,
158 Глава 6 • Тестирование потоков транзакций
6.3.5. Циклы
С одной стороны, циклы в потоках транзакций, строго говоря, создают проблемы. А
с другой стороны, они встречаются редко, и если встречаются, то они просты и встре
чаются нечасто. Цикл, который чаще всего можно обнаружить в потоке транзакций, —
это цикл повторения обработки после обнаружения ошибки ввода данных. Так, на
пример, банкомат дает вам три попытки ввода вашего личного идентификационного
номера. Можно ожидать, что похожие циклы повторения будут встречаться в боль
шинстве интерфейсов, таких как каналы связи с другими системами, драйверы уст
ройств и т. д. Очереди, обслуживаемые как пакет, очевидно, содержат цикл для обра
ботки пакетов. Сходным образом каждый узел обработки, обслуживающий очередь,
работает в составе цикла для того, чтобы обрабатывать каждый последующий элемент
в очереди и продолжать работу далее. Таким образом, он активируется каждый раз до
тех пор, пока очередь не иссякнет. Такие циклы следует тестировать отдельно для каж
дого узла обработки на более низком уровне интеграции и тестирования. А это означа
ет, что необходимо выполнять тестирование циклов различных узлов обработки тран
закций в контексте компонентного тестирования этих узлов обработки.
исходного кода —отнюдь не самая лучшая идея. Узлы на графах потока транзак
ций могут представлять собой не только действия программного обеспечения.
Термин «обработка данных» был использован в общем смысле для обозначения
любого вида работы с данными, вне зависимости от того, выполняется ли эта ра
бота компьютером, людьми или другими системами. Модель потока транзакций
обычно используется как высокоуровневая модель. Наиболее часто ее используют
в системном тестировании. Корректную работу компонентов следует проверить
при компонентном тестировании, обычно это делают на предшествующей стадии
интеграции. Разделение сложного действия на компоненты представляется в мо
дели потока транзакций лишь выборочно. Но при этом следует учитывать неко
торые детали.
1. Компоненты модели имеют интерфейсы, через которые происходит переда
ча данных. Обратите внимание, что глобальные данные могут соответство
вать этому требованию.
2. Компоненты могут взаимодействать только через свои интерфейсы. Если
есть такие компоненты, сгруппируйте их и моделируйте группу как отде
льный объект.
3. Поведение компонента определяется типом и состоянием транзакции.
4. Поведение узла обработки не зависит от предыстории транзакции, если
только предыстория не влияет на тип и состояние транзакции. Отдельный
процесс должен быть марковским.
5. Можно проверить корректность поведения узла обработки путем проверки
выходящих транзакций (или их контрольных записей) каждого процесса
в модели.
6. При наличии соответствующих средств тестирования можно полностью
протестировать один компонент в отдельности.
При тестировании потока транзакций первоочередное внимание следует об
ращать не на корректную работу отдельных процессов, а на систему в целом.
Особенное внимание следует уделять корректности интерфейсов между компо
нентами, корректности маршрутизации транзакций между компонентами, орга
низации и дисциплине очередей (если это не правила упорядочения FIFO), узлам
слияния, поглощения, расщепления и порождения, синхронизации, одновремен
ности, созданию и уничтожению транзакций, а также дублированию и потере
транзакций.
6.4. Методика
6.4.1. Основы
Предположим, что у нас нет циклических транзакций. Если же вы встретите
такие, будем надеяться, что их применение в данном случае является обоснован
ным, и их можно протестировать в пределах субмодели, включающей цикл. Для
6.4. Методика 161
6 Зак. 770
162 Глава 6 • Тестирование потоков транзакций
задать себе вопрос: «Что является целью тестирования»?» Я уже ранее говорил,
что системное тестирование —это не проверка работы отдельных узлов, а провер
ка того, правильно ли транзакции проходят от обработки к обработке. Поскольку
большая часть обработки (в случае потоков транзакций) включает в себя услов
ные ветви, которые частично зависят от типа транзакций, то не лишним будет про
верить одну и ту же логику для различных типов транзакций. По сути, такое «из
быточное» покрытие связей может оказаться единственным способом проверить
глубоко скрытые составные предикаты.
Используя данные выше рекомендации, мы получаем два семейства тестов.
С10/Сба/p a l . С6а/С1/Ф1а/Ф1
С10/С6а/ра1. С6а/С1 /Т1/Ф1 д/Ф1а/Ф1. Т1/Тсун/_.С11а._0т1/Фр1/Ан1
Это два семейства тестов, поскольку для транспортных средств возникает мно
го тестов. И поэтому мы должны проверить вопросы синхронизации и поведение
очереди.
6.4.7. Активизация
Проблема активизации при тестировании потоков транзакций отличается от ана
логичной проблемы в методах тестирования потоков управления или потоков дан
ных. Задача заключается не в том, чтобы найти такие транзакции, которые просле
дуют по выбранному пути. На самом деле суть проблемы — создать транзакции,
выполняющие это условие, и ввести эти транзакции в систему. Хотя обычные
транзакции, как правило, не слишком сложны, типы транзакций, представленные
в разделе 6.4.1, иногда бывает просто невозможно ввести. Ниже приведены неко
торые характерные проблемы и возможные способы их решения.
1. Ошибки, отрицательное квитирование и восстанавливающие транзакции из
других систем. Это было моим проклятием. Вы не можете получить эти тран
закции, не заставив другую систему вести себя неправильно. Вам необходи
ма транзакция из другой системы, информирующая вас, что один из ваших
блоков данных был утерян или искажен. Однако вы не можете послать ей
блок данных или искаженный блок, поскольку такие ошибки могут быть об-
172 Глава 6 • Тестирование потоков транзакций
6.6. Резюме
Модель потока транзакций является эффективной моделью, применяемой
в высокоуровневом системном тестировании большого количества систем.
Моделирование начинается с идентификации интересующих нас транзакций, осо
бенно мест, где они порождаются и завершаются и обстоятельств, при которых это
происходит. Модель основана на допущении о марковском процессе1. В ней так
же предполагается, что подробные модели обработки были созданы и использова
лись на более низком уровне компонентного тестирования, на стадии, предшест
вующей интеграции. Основное внимание при тестировании потоков транзакций
уделяется очередям, и маршрутам транзакций в системе. Мы рассмотрели эври
стическую иерархию покрытия, основанную на порожденном подграфе.
1 Иными слонами полагают, что поток транзакций является марковским процессом (процессом
без последействия), в котором будущее поведение транзакции зависит только от текущего состояния
и не зависит от предыстории процесса. — Примеч. научи, ред.
6.7. Вопросы для самопроверки 177
1040, то же самое будет с W2, бланком В, бланком С, формой 3903 и так да
лее. Не пытайтесь моделировать эти формы. Создавайте пустые формы, как
того требует логика, отправляйте их на соответствующий узел обработки
форм, затем принимайте данные формы обратно в соответствующие строки
формы 1040. Разработайте следующие типы тестов: покрытие узлов, покры
тие связей, покрытие порождения/завершения.
6. Выполните задачу 5 в предположении, что вспомогательные формы могут
быть сначала открыты, а затем оставлены незаполненными, поскольку ока
залось, что в них нет необходимости.
7. Выполните еще раз задачу 5 в предположении, что различные строки могут
заполняться в произвольном порядке при условии, что существуют требу
емые данные (то есть вы не можете добавлять числа, пока они не введены).
Разработайте необходимые тесты синхронизации, считая, что входящие
формы поступают по очереди, но в произвольном порядке.
Тестирование
доменов
7.1. Обзор
Тестирование доменов используется для проверки такого программного обеспе
чения или его частей, в которых преобладают численные вычисления. Оно явля
ется альтернативой общему эвристическому методу тестирования экстремальных
значений и предельных значений входных величин.
щего для нас интерес в приложении. Иными словами, наибольшее значение е вы
бирается из условия, чтобы ошибка порядка е или меньше была приемлемой для
данного приложения.
Точка НА. Точка, лежащая на границе домена или находящаяся так близко
к границе, насколько это возможно, чтобы удовлетворять условиям, относящим
ся к границе1.
Точка ВНЕ [СОНЕ78] Если домен открыт по отношению к какой-либо грани
це, то точка ВНЕ этой границы —внутренняя точка, лежащая в непосредственной
близости от границы (в пределах е-окрестности). Если домен закрыт, тогда точ
ка ВНЕ является внешней точкой и лежит в непосредственной близости от гра
ницы снаружи. Это означает, что точка ВНЕ не удовлетворяет условиям, относя
щимся к границе [JENG 94]. Очевидно, у двух смежных доменов может быть одна
и та же точка ВНЕ. Запомнить определение вам поможет следующий акроним:
ЗВСОВИ —Закрыт ВНЕ Снаружи, Открыт ВНЕ Изнутри2.
Линейное неравенство. Неравенство вида apCj + а2х2+ а3х3+...+апхп+...+ к >= 0, где xi —
элементы входного вектора (то есть входные переменные), а1— численные коэф
фициенты, а к — константа. При тестировании доменов границы часто описыва
ются линейными неравенствами.
Линейный домен. Домен, все граничные неравенства которого линейны.
Нелинейный домен. Домен, у которого по крайней мере одно граничное нера
венство не линейно.
Линейно зависимый. Два неравенства называются линейно зависимыми, если
одно из них можно превратить в другое путем отбрасывания константы к и
умножения всех коэффициентов а, на соответствующий множитель. Например,
х + 2у >= 7 и Зх + 6у < 5 линейно зависимы, поскольку, отбрасывая постоянные
слагаемые и умножая первое неравенство на 3, мы получаем Зх+бу. Линейно зави
симые гиперплоскости параллельны друг другу. На предыдущем рисунке диаго
нальные границы были линейно зависимы.
Линейно независимый. Неравенства называются линейно независимыми, если
они не являются зависимыми. Несколько неравенств линейно независимы, если
ни одно из них не является линейно зависимым от любого другого. Границы,
определяемые линейно независимыми неравенствами обязательно пересекаются.
Линейно независимые точки. Наборы точек (то есть входные векторы) v3, v2,
v3, ..., vpлинейно независимы, если уравнение с^-н c2v2+ c3v3+ ... + cpvp=0 имеет единс
твенное решение с}= с2= с3=... = ср= 0 для всех коэффициентов. Если точки не яв
ляются линейно независимыми, то они линейно зависимы, и некоторые из них
можно выразить через другие.
Законченная граница. Граница, простирающаяся на +-<*> по всем своим пере
менным. Мы будем считать границы законченными, если не оговаривается об
ратное. Наклоненная вверх граница на рисунке является законченной, поскольку
простирается на + - о о по всем своим переменным.
1 .Эго может быть необходимо из-за ограничений, накладываемых компьютерным методом пред
ставления чисел [JENG 94]. К примеру, функция, определенная для целых чисел, может не иметь точ
ных решений на границе.
2 Неплохо бы для начала запомнить акроним. — Примеч. перев.
184 Глава 7 • Тестирование доменов
Полная граница
Сегмент границы. Часть граничного неравенства между двумя или более доме
нами. Иначе говоря, один из краев домена. Как правило, граничное неравенство
определяет сегменты границ для множества различных доменов.
Незаконченная граница. Граница с одним или более разрывами. Наклоненная
вниз граница на рисунке выше разорвана и, следовательно, незакончена. Разрывы,
если они есть, лежат между узловыми точками; это значит, что они состоят из сег
ментов границ.
Последовательное закрытие. Граница, для которой направление, в котором она
закрыта (или открыта), сохраняется на всем ее протяжении. Мы будем в даль
нейшем считать закрытие границ последовательным, если не оговаривается об
ратное. Граница, отмеченная как последовательная на рисунке, имеет одно и то же
направление закрытия на всем своем протяжении.
$22100 < нал_доход =< $53500 налог = $3315 + 0.28 * (нал_доход - $22100)
$53500 < нал_доход =< $115000 налог = $12107 + 0.31 * (нал_доход - $53500)
$115000 < нал_доход =< $250000 налог = $31172 + 0.36 * (нал_доход - $115000)
$250000 < нал_доход налог = $79722 + 0.396 * (нал_доход - $250000)
7.3.2. Основы
Описание компонентов графа и связанных с ними отношений не столь продуктив
но при тестировании доменов, как для большинства других методов; тем не менее,
это позволяет понять суть метода, что необходимо при любой стратегии.
Объекты (узлы). Домены, определенные для входного вектора.
Отношение (связи). Определено отношение «смежный с». Смежный —это зна
чит имеющий общую границу. Условимся принимать за направление связи на
правление неравенства. Например, если А и В — смежные домены и А является
закрытым доменом, стрелку надо рисовать от А к В. Вы можете выбрать и другой
способ определения направления, это не принципиально, главное, чтобы вы были
последовательны в своих действиях.
Так же как для всех графических моделей, следует провести тесты, чтобы
убедиться в правильности направления стрелок (вне зависимости от выбранно
го правила). Такая интерпретация принципа графового моделирования означа
ет, что мы должны проверить закрытость границ всех смежных доменов (то есть
1 Проверка обработки может быть проведена в том числе путем тестирования домена, если, напри
мер, обработка представляет собой алгебраическое уравнение. Это можно рассматривать как проверку
корректности вырожденного домена, заданного с помощью предиката равенства. [AFIF92],
2 Этот вариант сильно искажает бланк декларации, позтому, пожалуйста, не используйте его в це
лях, связанных с уплатой налогов.
7.3. Отношения и модель 189
На рис. 7.2 показан возможно более наглядный способ представления этих доме
нов. В одномерном и двумерном пространстве будет не лишним изображать домены
графически, подобно тому, как это сделал я. Границы доменов представляют собой
несколько параллельных линий. Это типичные домены, встречающиеся на практи
ке. Тем не менее, нам потребовалось выполнить алгебраические преобразования,
для того чтобы упростить эти границы и выразить их через входные переменные.
Интерпретация предикатов. Символическая подстановка, проделанная выше,
для того чтобы выразить домены через входные переменные, называется интер
претацией предикатов. Любое неравенство имеет вид предиката, который может
принимать значение ИСТИНА или ЛОЖЬ. Предикат мы интерпретируем в терминах
входных переменных.
Зачем все усложнять, интерпретируя предикаты границ доменов? Почему бы
нам не работать непосредственно со строками спецификации ВНС? Дело в том,
что в этом случае у вас уже не будет модели для тестирования доменов, это будет
модель потока управления. Нашей же целью является проверка корректной реа
лизации граничных предикатов (или их аналогов в коде).
Наша конечная модель является избыточной. Граничные неравенства появ
ляются в ней дважды (по одному разу для каждого задаваемого ею домена). Эта
модель неизящна, и вероятность того, что программист построит вычисления та
ким образом достаточно мала. Программист, проанализировав требуемые вычис
ления, организует их более эффективно (то есть так, чтобы их было проще сопро
вождать), и вместо промежуточных вычислений, заданных в спецификации, он,
возможно, реализует нечто от них отличное, но, по всей вероятности, им эквива
лентное. И в этом все дело. Анализ, который мы проводим для разработки тес
тов доменов, имеет совершенно иные задачи, в отличие от задач, стоящих перед
программистом, и поэтому наши ошибки тоже, скорее всего, будут отличаться от
ошибок разработчика. У нас, тестировщиков, собственные ошибки.
7.3. Отношения и модель 191
Домен
СОД
(Тысячи)
Льготы
1 Эта оценка занижена для современного программного обеспечения, поскольку утверждение ос
новано на данных почти двадцатилстнсй давности (в 1994 году). В то время как методы компонентного
тестирования совершенствовались, относительная частота возникновения ошибок в требованиях воз
растала. Я не удивлюсь, если доля ошибок доменов в среднем окажется порядка 10 а для некоторых
программ и всех 30 %.
Отношения и модель 193
7 Зак. 770
194 Глава 7 • Тестирование доменов
7.4. Методы
7.4.1. Основы
Существует масса стратегий тестирования доменов [AFIF90, AFIF92, CLAR82,
СОНЕ78, JENG94, НАОМ87, PERE85, WHIT78A, WHIT80A, WHIT85B,
WHIT90, ZEIL83, ZEIL89]. Мы не будем рассматривать их все. Если вы занима
лись программированием, то вы, безусловно, знаете основы стратегий тестирова
ния доменов. Если вы занимались программированием непродолжительное вре
мя, то вы использовали эвристические методы тестирования доменов. Прежде
чем прейти к рассмотрению эффективных стратегий, давайте обсудим причины
несовершенства эвристических стратегий.
1. Тестирование экстремальных точек. В соответствии с этой стратегией лю
бой численный ввод должен быть протестирован в окрестности минимально
го и максимального значения этого ввода. Эта эвристическая стратегия имеет
множество названий, таких как тестирование граничных значений [MYER79],
7.4. Методы 195
X X test points on + o ff
В
Ошибка: граница пропущена
Контрольная точка х Контрол ьная точка х
(точка НА) (точка НА) v
------- А1 А \
Ошибка: лишняя граница
У нас есть пять доменов (на самом деле шесть) и пять определенных границ,
которые мы проверяем при помощи 10 тестов; примитивной стратегии в то же са
мое время требуется 15 тестов, и при этом она не даст нам ничего нового.
7.4. Методы 199
тать тесты для других границ этого домена и рассчитать ожидаемые значения для
спроектированных вами тестов.
Точка ВН Е
N. для В и С
N. | Домен В открыт
Домен А открыт ^
Домен С закрыт
\
Линия С обозначает границу и представляет собой отдельный домен. Согласно
определению, граница должна быть закрыта. Стратегия 1x1 будет здесь работать,
если вы корректно интерпретируете составляющие элементы. Домен А открыт, по
этому мы берем точку НА на границе, а точку ВНЕ внутри А. Для В тоже надо вы
брать точку НА, но мы можем взять ее той же самой, что и для А. Точка ВНЕ для
В лежит внутри В. Как насчет С? Она закрыта, поэтому, согласно определению,
точка ВНЕ должна лежать снаружи. Снаружи чего? Снаружи С и, следовательно,
в обоих доменах А и В. Повторяюсь, точки могут быть общими. Таким образом, в
случае вырождения нам не нужны дополнительные тесты, если мы уточним, что
мы подразумеваем под «точкой ВНЕ» в данной ситуации.
шшжшшштшшшшшшш
ш ш т т ш
Е Ш ПРАВИ ЛЬНО Ш Н ЕП РАВИ Л ЬН О
А
В
ТОЧКА ВН Е j(Мш/штшлЯл
ТОЧКА ВН Е ГРАН И Ц А
СД ВИ НУТА
ПРАВИЛЬНО
\ А'
ВВЕРХ
а б
Я предлагаю вам самостоятельно проверить, что стратегиям х 1вдвухмерном
пространстве работает для всех видов сдвига (слишком большое, слишком
маленькое значение или смена знака константы), для открытых и закрытых
доменов.
Сдвиги доменов, как правило, довольно значительны. Наиболее вероятной
причиной возникновения сдвига является грубая ошибка Flp2, например
отсутствие десятичной точки или ее неправильное положение. Однако
простая перестановка цифр в числе может привести и к небольшим сдвигам.
Поэтому так важно выбирать точку ВНЕ как можно ближе к границе.
3. Поворот домена. В одномерном пространстве этому нет аналога, но эта
ошибка встречается в пространстве с размерностью два и более. Поворот
домена возникает вследствие какой-либо ошибки в коэффициентах тести
руемого неравенства.
204 Глава 7 • Тестирование доменов
ТОЧКА ВН Е
t
ТОЧКИ НА
Сравнение двух точек НА, выбранных так, чтобы новая граница проходила
между ними, выявит расхождение. Стратегия Nx 1слепа к лишним границам,
которые не приводят к изменению обработки. Однако это не смертельно,
поскольку пользователь также их не заметит.
5. Пропущенная граница. Сравните любую из точек НА с точкой ВНЕ. В ре
зультате отсутствия границы домены А и В будут обрабатываться одинако
во (но мы не можем сказать, будет ли это обработка соответствовать доме
ну А или домену В).
ТОЧКИ НА
А
ТОЧКА ВН Е
2. Точки ВНЕ надо выбирать рядом с центром тяжести точек НА. Для линий
берите середину между точками НА. Для плоскостей выбирайте точку, ле
жащую в середине треугольника, построенного на точках НА, то есть как
можно ближе к точке, равноудаленной от вершин треугольника.
Применим стратегию N х 1 для тестирования верхней границы домена 4.
Домен 4: налог = 0.31СОД - 72 8.БЛьготы - 6400.0
СОД > 59700 + 2350Льготы
СОД <= 121200 + 2350Льготы
1 На самом деле мое разделение стратегий на сильные и слабые обманчиво. Подходящий набор
спецификаций в случае, когда требуется «сильное» тестирование, подразумевает наличие, по мень
шей мере, одного неравенства для каждой точки, в которой меняется направление закрытия границы,
и/или в начале или конце каждого разрыва границы. Если вы обладаете подобной дополнительной
информацией, любое ваше тестирование будет слабым — у вас нет необходимости тестировать пере
сечение само по себе.
7.5. Рассмотрение приложений 207
7.6. Резюме
Тестирование доменов представляет собой формальный, автоматизируемый метод,
призванный так или иначе заменить общепринятую, но неэффективную практику
тестирования экстремальных входных значений и их комбинаций. Тестирование
доменов основано на формальной процедуре определения доменов как набора
входных неравенств, заданных во входном пространстве. Слабая стратегия 1x1
тестирования доменов используется для адекватных неравенств, а неадекватные
тестируются при помощи сильной стратегии 1x1. Стратегии более высокого по
рядка, такие как Nx 1 и стратегии, описанные в [AFIF92], могут помочь устано
вить природу ошибок (например, сдвиг, поворот), если это является одной из
ваших задач. Полная автоматизация проектирования тестов и их выполнение воз
можны при современном развитии вычислительной техники, однако поддержка
этих возможностей коммерческими инструментами весьма незначительна.
8.1. Обзор
Синтаксическое тестирование — это мощный метод для проверки команд
но-управляемого программного обеспечения и сходных приложений. Он доста
точно легко осуществляется и поддерживается многими коммерческими инстру
ментальными средствами.
Тире. Тире между двумя элементами алфавита заменяет собой все элементы
в алфавите, начинающиеся с первого и заканчивающиеся последним элементом, в
предположении что естественный порядок этих символов понятен, как, например,
«а-я». «1-9» означает целочисленные символы от 1 до 9, включительно.
Метасимволы (или металингвистические символы). Символы, используемые
для описания языка. Используемые метасимволы включают в себя: {, }, |, [, ], (,
), *, +, <, >, ?, (3, б, а, Ф, :, :=, =, -, (запятая), (пробел) и символы, используемые в
обычных текстах. Интерпретация и применение метасимволов будут обсуждаться
ниже. Мы будем рассматривать слова и команды, составленные из символов, а так
же способы их тестирования, поэтому так важно различать тестируемые символы
и символы, которые описывают тестируемые символы. Для того, чтобы описать
тест, включающий символ | , обычно этот символ дублируют. То есть используют
комбинацию символов «| |». Так, например, «[[» означает не два метасимвола «[»,
а одиночную квадратную скобку, которая фигурирует в тесте.
Нуль (\). Металингвистический символ, используемый для обозначения от
сутствия символа. Не путайте \ с символом пробела (о), или пустым символом ((5).
Символ пробела (о). Металингвистический символ, обозначающий знак пробе
ла (например, в напечатанном тексте). Пробелы между словами в предложении
используются для удобства чтения и не являются частью нашего описательного
языка.
Пустой символ ((3). Металингвистический символ, обозначающий пустоту. Он
может совпадать, а может и не совпадать с символом пробела. Типичное отличие
между пустым символом и символом пробела заключается в том, что о создает
видимое пространство при печати или в изображении чего-либо, в то время как
Р —нет.
Строка. Последовательность, состоящая из ноля или более символов алфави
та. Например, авб567х($Р(И 11, 1776,666999,{:{ |)>, —/ Д \ —. Строки идентифици
руются при помощи букв верхнего регистра, например, А.
Набор строк. Наборы строк выделяются фигурными скобками, например, {А}.
Набор, состоящий, к примеру, из нулевой строки \ —{\}, обозначается просто \.
Имя строки. Другой способ обозначить строку, это заключить ее имя в угловые
скобки, подобно <имя_строки>. Строковое имя также может быть именем набора
строк. Например, <имя_строки_альфа>::={х,хх,ав,сде}.
Команда. Строка, используемая для управления. Команды состоят из комбина
ции полей, операторов, операндов и разделителей.
Командно-управляемое программное обеспечение. Программная система или ее
часть, в которой основное управление происходит посредством строк, вводимых
из командной строки, как, например, MS-DOS и UNIX.
Командный язык. Набор команд, используемый для управления командно
управляемым программным обеспечением. Основная задача синтаксического тес
тирования —проверка командных языков.
Синтаксис. Правила, определяющие, что является, а что не является правиль
ной строкой (например, командой). Правила могут быть, а могут и не быть универ
сальными для всех команд, как, например, корректная форма представления чи
сел. Но для каждой команды в командном языке должно существовать какое-либо
8.2. Основные термины 213