КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Автоматизация тестирования и отладки
ЛЕКЦИЯ 12 Один из фундаментальных принципов структурного проектирования заключается в том, что большая система должна быть расчленена на обозримые модули. Это расчленение должно быть выполнено таким образом, чтобы модули были как можно более независимы (критерий сцепления —coupling), и чтобы каждый модуль выполнял единственную (связанную с общей задачей) функцию (критерий связности —cohesion). Таким образом, одним из способов оценки качества модели реализации является анализ сцепления модулей. Сцепление — это мера взаимозависимости модулей. В хорошем проекте сцепления должны быть минимизированы, т. е. модули должны быть слабозависимыми (независимыми) настолько, насколько это возможно. Слабое сцепление между модулями служит признаком хорошо спроектированной системы по следующим причинам: •уменьшается количество соединений между двумя модулями, что приводит к уменьшению вероятности появления «волнового эффекта» (ошибка в одном модуле влияет на работу других модулей); • минимизируется риск появления «эффекта ряби» (внесение изменений, например при исправлении ошибки, приводит к появлению новых ошибок), так как изменение влияет на минимальное количество модулей; • при сопровождении модуля отпадает необходимость беспокоиться о внутренних деталях других модулей; •система упрощается для понимания настолько, насколько это возможно. На практике существуют три основных типа сцепления, используемых системными проектировщиками для связи модулей: нормальное сцепление, сцепление по общей области и сцепление по содержимому. С позиций структурного проектирования эти типы являются соответственно приемлемым, неприемлемым и запрещенным. Два модуля А и В нормально сцеплены, если: А вызываетВ; В возвращает управление А; вся информация, передаваемая между А иВ, представляется значениями параметров при вызове. Нормальное сцепление в свою очередь делится на три типа: сцепление поданным, сцепление по образцу, сцепление по управлению. На практике наиболее часто используется сцепление по данным. ^ Два модуля сцеплены поданным, если они взаимодействуют через передачу параметров и при этом каждый параметр является элементарным информационным объектом. Отметим, что в случае небольшого количества передаваемых параметров сцепление по данным обладает наилучшими характеристиками. ^ Два модуля сцеплены по образцу, если один посылает другому составной информационный объект, т. е. объект, имеющий внутреннюю структуру. Примером составного объекта может быть объект Данные о клиенте, включающий в себя поля: Название организации, Почтовый адрес, Номер счета и т. п. ^ Два модуля сцеплены по управлению, если один посылает другому информационный объект — флаг, предназначенный для управления его внутренней логикой. Существует два типа флагов — описательный и управляющий. Описательный флаг обычно описывает ситуацию, которая произошла, и именуется с использованием существительных и прилагательных: Конец файла, Введенная кредитная карта. Управляющий флаг используется для декларирования определенных действий в вызываемом модуле и именуется с использованием глаголов: Читать следующую запись, Установить в начало. В общем случае управляющие флаги усиливают сцепление и, следовательно, ухудшают качество проекта. Как уже отмечалось, перечисленные три типа нормального сцепления в разной степени поддерживают суть модульности и являются приемлемыми в структурном проектировании. Ниже определяются два вида сцепления, которые выходят за пределы хорошей модульности. ^ Два модуля сцеплены по общей области, если они ссылаются к одной и той же области глобальных данных. Сцепление по общей области является плохим по следующим причинам. Во-первых, ошибка в одном модуле, использующем глобальную область, может неожиданно проявить себя в любом другом модуле, также использующем эту глобальную область, поскольку эти глобальные данные не находятся «под защитой» модуля. Во-вторых, модули, ссылающиеся к глобальным данным, обычно используют точные имена (в отличие от модулей, которые вызываются с использованием параметров). Следовательно, гибкость модулей, сцепленных глобально, намного хуже, чем гибкость нормально сцепленных модулей. В-третьих, программы с большим количеством глобальных данных чрезвычайно трудны для понимания сопровождающим программистом, поскольку сложно определить, какие данные используются отдельным модулем. ^ Два модуля сцеплены по содержимому, если один ссылается внутрь другого любым способом, например, если один модуль передает управление или выполняет переход в другой модуль, если один модуль ссылается или изменяет значения информационных объектов в другом модуле или если один модуль изменяет код другого модуля. Такое сцепление делает абсурдной концепцию модулей как черных ящиков, поскольку оно вынуждает один модуль знать о точном содержании и реализации другого модуля. Вообще говоря, только ассемблер позволяет проектировщикам применять данный вид сцепления. В табл. 6 приведены сравнительные характеристики по каждому типу сцепления. Другим критерием оценки качества разбиения системы на части является критерий связности, который контролирует, как действия в одном модуле связаны друг с другом. Фактически сцепление и связность являются двумя взаимозависимыми способами измерения расчленения системы на части: связность модуля часто определяет качество его сцепления с другими модулями. Связность — это мера прочности соединения функциональных и информационных объектов внутри одного модуля. Размещение сильносвязанных объектов в одном и том же модуле уменьшает межмо- Таблица б
дульные взаимосвязи и взаимовлияния. Выделяются следующие связности: функциональная, последовательная, информационная, процедурная, временная, логическая и случайная. ^ Функционально связный модуль содержит объекты, предназначенные для выполнения одной и только одной задачи, например: Расчет заработной платы. Считывание данных кредитной карты. Каждый из таких модулей имеет одну четко определенную цель, при его вызове выполняется только одна задача (при этом она выполняется полностью без исполнения любого другого дополнительного действия). ^ Последовательно связный модуль содержит объекты, охватывающие подзадачи, для которых выходные данные предыдущей подзадачи служат входными данными для последующей, например: Открыть файл— Прочитать запись— Закрыть файл. ^ Информационно связный модуль содержит объекты, использующие одни и те же входные или выходные данные. Предположим, что мы хотим выяснить некоторые сведения о книге, зная ее ISBN: название книги, автора и цену. Эти три подзадачи являются связанными потому, что все они работают с одним и тем же входным информационным объектом — ISBN, который и делает этот модуль информационно связным. ^ Процедурно связный модуль содержит объекты, которые включены в различные (возможно, несвязные) подзадачи, в которых управление переходит от каждой подзадачи к последующей (отметим, что в последовательно связном модуле данные, а не управление, переходили от одной подзадачи к последующей). ^ Временно связный модуль содержит объекты, которые включены в подзадачи, связанные временем исполнения. Логически связный модуль содержит объекты, содействующие решению одной общей подзадачи, для которой эти объекты отобраны во внешнем по отношению к модулю мире. Таким образом, логически связный модуль содержит некоторое количество подзадач (действий) одного и того же общего вида. Чтобы его использовать, необходимо выбрать именно ту часть (части), которая требуется. Эти различные подзадачи должны обладать одним и только одним интерфейсом с внешним миром. При этом семантика каждого параметра зависит от используемой подзадачи. ^ Случайно связный модуль содержит объекты, соответствующие подзадачам, незначительно связанным друг с другом. Случайно связный модуль подобен логически связному модулю, его объекты не связаны ни потоками данных, ни потоками управления. Однако подзадачи в логически связном модуле являются по крайней мере одной категории; для случайно связного модуля даже это неверно. В табл. 7 приведены сравнительные характеристики для каждого уровня связности. Следовательно, связность является мерой функциональной зависимости объектов (исполняемых операторов, областей данных и т.д.) внутри одного модуля. В хорошей модели связность каждого модуля является высокой (последовательность введенных выше определений уровней связности соответствует направлению от луч- Таблица 7
шей связности к худшей). Как и сцепление, связность является одним из лучших критериев оценки качества проекта. Очевидно, что для оценки качества проектируемой АСУП критериев сцепления и связности недостаточно. Например, если бы мы осуществляли оценку только по критерию сцепления, мы бы всегда получали системы, состоящие из одного модуля. Связность этого единственного модуля также была бы вполне приемлемой. Поэтому кроме этих двух взаимно дополняющих друг друга критериев в структурном проектировании существует ряд других принципов, которые могут применяться для оценки и улучшения качества модели на основании структурных карт. Рассмотрим основные принципы, позволяющие получать качественные системы. 1) ^ Принцип факторизации. Под факторизацией понимается выделение подзадачи, реализуемой некоторым модулем, в новый самостоятельный модуль. Это может быть сделано с целью: • уменьшения размеров модуля; • обеспечения возможности и преимущества классического проектирования сверху вниз, позволяющего строить систему более легкую для понимания и облегчающего модификацию системы; • устранения дублирования подзадачи, выполняемой более чем одним модулем; • отделения собственно вычислений от управления (вызовы и принятия решения); • обеспечения более широкой пригодности модулей для использования их в различных частях системы; • упрощения реализации. 2) ^ Принцип единства решения. Процесс любого решения состоит из двух частей: распознавания, какое действие выбрать, и исполнения этого действия. Поскольку эти две составляющие решения различны, информационные объекты, используемые при распознавании и исполнении, также могут существенно различаться и, следовательно, могут быть недоступны в одном модуле. Такая ситуация получила название расщепления решения. Сильное расщепление решения (хотя иногда расщепления не удается избежать) обычно является симптомом плохой организации модулей. Исполнительная часть решения должна располагаться как можно ближе к распознавательной части, чтобы распознанной информации не пришлось долго «блуждать» для того, чтобы быть обработанной. 3) ^ Обработка ошибок. Сообщения об ошибках целесообразно формировать и визуализировать в модуле, который ошибку обнаруживает (и, следовательно, «знает», что это за ошибка). Тексты сообщений рекомендуется хранить вместе, так как при таком походе: • легче сохранять согласованность формулировок и форматов сообщений. Представьте себе состояние пользователя, когда он получает различные сообщения для одной и той же ошибки, когда она встречается в разных частях системы; • появляется возможность хранить тексты сообщений в отдельном файле, а не внутри кода модуля; • легче избежать дублирования сообщений; • облегчается модификация сообщений (включая их перевод на другой язык). 4) ^ Принцип отсутствия памяти состояния. Когда вызванный модуль после выполнения своей функции возвращает управление вызвавшему его модулю, он «умирает», оставляя после себя лишь результат. При повторном вызове он делает свою работу так, будто он только что «родился». Модуль «не помнит», что происходило в его предыдущих жизнях. Однако существует тип модуля, который «знает» о своем прошлом благодаря так называемой памяти состояния. Память состояния — это информационный объект внутри модуля, который продолжает существовать неизменным между двумя вызовами модуля. Работа модуля с памятью состояния в общем случае непредсказуема, это означает, что хотя модуль вызывался с одинаковыми фактическими параметрами, исполняться он может по-разному, и результаты его работы при разных вызовах могут быть различными. Сопровождение такого модуля резко усложняется. 5) ^ Инициализация и завершение. Как правило, модули инициализации и завершения трудны для сопровождения из-за их плохой (временной) связности и сильного сцепления. Общая рекомендация по решению этой проблемы — инициализацию каждой функции желательно выполнять как можно позже, а действия по завершению каждой функции должны производиться как можно раньше. И конечно, необходимо проводить инициализацию и завершение как можно ближе к тому, что инициализируется или завершается. 6) ^ Компромисс между ограниченностью и обобщенностью. Ограниченный модуль обладает по крайней мере одной из следующих характеристик: • выполняет излишне специфическую работу. Например, модуль, вычисляющий среднюю ежемесячную температуру для месяца продолжительностью в 30 дней, является ограниченным; на самом деле необходим модуль, который генерировал бы среднюю температуру для месяца любой продолжительности. Продолжительность месяца могла бы передаваться ему как параметр, а не быть жестко установленной внутри; • имеет дело с ограниченными значениями данных, их типами и структурами (например, модуль, предполагающий, что человек может быть собственником только одного автомобиля); • включает в себя условия о месте и способе его использования. Противоположная крайность ограниченному модулю — сверхобобщенный модуль, обладающий по крайней мере одной из следующих характеристик: • выполняет слишком завышенный объем работы, результаты которой не используются в большинстве ситуаций. Примером является модуль, формирующий расписание игр чемпионата по футболу как по григорианскому, так и по юлианскому ка-лендарю; • имеет дело со слишком избыточными типами данных, их значениями и структурами. Например, использование числа типа REAL вместо INTEGER для того, чтобы следить за количеством болтов на складе, было бы чрезмерным обобщением; • принимает в качестве параметров данные, которые никогда не изменятся. Так, модуль, которому передается количество дней в неделе, является определенно сверхобобщенным, а также до смешного нелепым. 7) ^ Минимизация избыточности, то есть устранение дублирования. Если любой факт, условие или реализационное решение явно проявляются в более чем одном модуле, то усилия по сопровождению, состоящие из нахождения всех случаев этого факта и их изменения, увеличиваются. Также возникает риск, что человек, сопровождающий такую систему, забудет изменить один из дублей. 8) ^ Нагрузка по входу и выходу. Под нагрузкой модуля по входу понимается количество непосредственных вызывающих его модулей. Соответственно, нагрузка модуля по выходу — это количество непосредственно подчиненных ему модулей. По уже упоминавшимся выше причинам нагрузка по выходу не должна превышать 6—7 модулей. Высокая нагрузка по входу требует от модуля хорошей связности. В заключение отметим, что при использовании структурного подхода обеспечивается естественный переход от этапа анализа к этапу проектирования за счет комбинирования транзакционных и трансформационных алгоритмов преобразования модели функциональных требований (а именно иерархии диаграмм потоков данных) в структурные карты.
Если методы структурного проектирования имели целью упрощение системной разработки на основе алгоритмического подхода, то объектно-ориентированные методы решают аналогичную задачу, используя описания классов и объектов, т. е. выразительные средства объектно-ориентированного программирования. Буч (Booch) определил объектно-ориентированное проектирование как «методологию проектирования, соединяющую в себе процесс объектной декомпозиции и приемы представления как логической и физической, так и статической и динамической моделей проектируемой системы». Основой для объектно-ориентированного проектирования резонно служат результаты объектно-ориентированного анализа. Тем не менее результат любого из методов структурного анализа также может быть использован в качестве входных данных для объектно-ориентированного проектирования: в этом случае производится интеграция диаграмм потоков данных с классами и объектами. На этапе проектирования используются следующие диаграммные техники: • наследуемые от этапа анализа требований и развиваемые на этапе проектирования диаграммы классов и диаграммы объектов, являющиеся основой статической логической модели; • диаграммы модулей и диаграммы процессов, моделирующие конкретные программные и аппаратные компоненты и являющиеся частью статической физической модели; • динамические модели: диаграммы переходов состояний, моделирующие временную последовательность внешних событий, влияющих на объекты конкретного класса, и временные системные диаграммы, моделирующие временной порядок сообщений и событий, касающихся межобъектных взаимодействий. ^ Реализация (программирование/адаптация) На этапе реализации осуществляется создание системы как комплекса программно-аппаратных средств, начиная с проектирования и создания телекоммуникационной инфраструктуры и заканчивая разработкой и инсталляцией приложений. В настоящее время существует обширная литература, в которой достаточно подробно рассмотрены все эти процессы, включая современные методы генерации исполняемого кода прикладных систем. Поэтому в настоящей книге вопросы реализации не рассматриваются, исключая случай, когда процесс реализации заключается в адаптации имеющейся на рынке системы. Учитывая недостаточное количество литературы по данному вопросу на русском языке, процесс адаптации детально рассматривается ниже в разделе «Управление процессом внедрения и эксплуатации (Типовой план внедрения)». Корректность АСУП является ее самым важным свойством и, несомненно, составляет главный предмет заботы разработчиков. В идеальном случае под корректностью АСУП понимается отсутствие в ней ошибок. Однако для большинства сложных программных продуктов достигнуть этого невозможно — «в каждой программе содержится по крайней мере одна ошибка». Поэтому под корректным обычно подразумевают программный продукт, работающий в соответствии с предъявленными к нему требованиями, другими словами, продукт, для которого пока еще не найдены такие условия, в которых он окажется неработоспособным. Установление корректности является главной целью рассматриваемого этапа жизненного цикла. Следует отметить, что этап тестирования и отладки — один из наиболее трудоемких, утомительных и непредсказуемых этапов разработки АСУП. В среднем при разработке традиционными методами этот этап занимает от '/3 до '/2 полного времени разработки. С другой стороны, тестирование и отладка представляют собой серьезную проблему: в некоторых случаях тестирование и отладка программы требуют в несколько раз больше времени, чем непосредственно программирование. Тестирование представляет собой набор процедур и действий, предназначенных для демонстрации корректной работы АСУП в заданных режимах и внешних условиях. Цель тестирования — выявить наличие ошибок или убедительно продемонстрировать их отсутствие, что возможно лишь в отдельных тривиальных случаях. Важно различать тестирование и сопутствующее понятие «отладка». Отладка — это набор процедур и действий, начинающихся с выявления самого факта наличия ошибки и заканчивающихся установлением точного места, характера этой ошибки и способов ее устранения. Различные аспекты тестирования многократно исследовались, однако полученные теоретические результаты носят почти исключительно негативный характер, что создает пессимистическую картину ценности получаемых при тестировании данных и в целом может быть суммировано в известном тезисе Дейкстры: «Тестирование программ может служить для доказательства наличия ошибок, но никогда не докажет их отсутствия!». Тем не менее нужно констатировать, что на практике результаты тестовых испытаний, не выявившие программных ошибок, интерпретируются как свидетельство корректности этой программы. Важнейшим и наиболее часто применяемым на практике является метод детерминированного тестирования. При этом в качестве эталонов (тестов) используются конкретные исходные данные, состоящие из взаимосвязанных входных и результирующих величин и правильных последовательностей их обработки. В процессе тестирования при заданных исходных величинах необходимо установить соответствие результатов их обработки эталонным величинам. Для сложных систем требуется большое количество тестов и возникает проблема оценки их необходимого количества и использования методов их сокращения. Поэтому тестирование (как и любой другой вид деятельности) целесообразно планировать. План тестирования должен содержать: • формулировку целей тестирования; • критерии качества тестирования, позволяющие оценить его результаты; • стратегию проведения тестирования, обеспечивающую достижение заданных критериев качества; • потребности в ресурсах для достижения заданного критерия качества при выбранной стратегии. Для целей тестирования программные элементы АСУП удобно представлять в виде ориентированного графа G = (N, Е), где N = (N1, N2,..., Nm) — множество узлов (вершин), соответствующих выполняемым операторам тестируемой программы; Е= (Е1, Е2,..., Еп) — множество ребер (дуг), соответствующих передачам управления между операторами. Путем (маршрутом) называется последовательность вершин и дуг Р= (N1, E1,2, N2, E2,3 ,..., Ek-1,k, Nk), где каждая дуга Ei,i+l выходит из Nt и входит в Ni+l, причем N1 не обязательно начальный узел. Ветвью называется путь Р, в котором N1 — либо начальный узел, либо узел ветвления, Nk — либо узел ветвления, либо завершающий узел, все остальные N1 не являются узлами ветвления. Очевидно, что полное тестирование всех возможных маршрутов не реально в связи с огромными затратами труда и времени. Поэтому на практике применяются критерии выбора тестов, не гарантирующие полной проверки программы. Общим требованием к этим критериям является достижение лишь определенной степени полноты АСУП или ее компонент. Как правило, эти критерии устанавливают требование по крайней мере однократной проверки всех операторов программы, всех ветвей программы, либо всех подпутей специального вида (например, всех подпутей, проверяющих циклы при начальном, завершающем и одном из промежуточных значений переменной — счетчика цикла). Самым распространенным критерием тестирования является критерий, требующий по крайней мере однократной проверки каждой из ветвей программ (критерий С1). Так, например, тестирование при приемке программного обеспечения для ВВС США производится на основании этого критерия. По ряду независимых оценок использование критерия С1 обеспечивает обнаружение от 67 до 90% ошибок. Перечисленные критерии тестирования основаны на анализе структуры потока управления программы и не гарантируют обнаружение ошибок, связанных с ее потоками данных. Разработанные для решения этой задачи критерии разбиваются на две группы: использующие разбиение входных данных на обнаруживающие подобласти и основанные на отношениях между определениями и использованием информационных объектов. ^ В первом случае осуществляется поиск такого разбиения входных данных на подобласти, при котором корректная или некорректная работоспособность программы для любого элемента подобласти предполагает соответственно ее корректную или некорректную работоспособность для всех элементов этой подобласти. Если такое разбиение удается найти, то в качестве критерия тестирования принимается требование, по крайней мере, однократной проверки данных из каждой подобласти. Конечно, построить такое разбиение в большинстве реальных случаев практически невозможно. Однако этот принцип дает возможность строить обнаруживающие подобласти для отдельных типов ошибок: если имеется предположение о возможной ошибке, то часто можно определить и подобласть, на которую должна влиять эта ошибка, если бы в действительности она имела место. ^ Второе направление связано с попыткой выразить определенные свойства потоков данных через критерии тестирования. На уровне использующих некоторые переменные операторов программы определяется среда данных (множество всех определений каждой из переменных, для которых существует маршрут из точки определения в точку использования, на котором не встречается никакого другого определения данной переменной) и контекст данных (более полная модель, учитывающая одновременное использование определений с учетом их порядка). Соответствующие критерии тестирования требуют, по крайней мере, однократной проверки каждого из элементов среды и контекста данных. Существуют и другие подходы к тестированию, например тестирование с ориентацией на слабые места (части программы, где вероятность появления ошибок относительно высока), тестирование с ориентацией на масштабы повреждения (проверка функций, ошибка в которых ведет к необратимым последствиям), стохастическое тестирование, мутационное тестирование. В последнем случае в программу целенаправленно вносятся представители различных групп ошибок — «мутанты». После тестирования осуществляется анализ числа и типов обнаруженных ошибок, включая «мутантов», далее на основе экстраполяции делается заключение о тщательности проведенного тестирования. При установлении наличия ошибок на этапе тестирования возникает необходимость в следующем этапе — отладке. Отладка представляет собой процесс устранения ошибок: она начинается с обнаружения симптомов ошибки и заканчивается определением ее местоположения и последующим исправлением. В основе практически всех способов отладки лежат три метода: просмотр, проверка и прокрутка. Метод просмотра заключается в следующем: текст программы внимательно изучается на предмет обнаружения ошибок и смысловых расхождений с текстом алгоритма, при этом помимо сплошного просмотра может применяться и выборочный просмотр (циклов, условных операторов, параметров процедур и функций). При проверке своей программы программист по тексту мысленно старается восстановить определяемый программой вычислительный процесс, после чего сверяет его с требуемым процессом. Основой прокрутки является имитация программистом выполнения программы с целью более конкретного и наглядного представления о процессе, определяемом текстом проверяемой программы, т. е. программа проверяется как бы в динамике ее работы над конкретными данными. Система автоматизации тестирования и отладки (САТО) представляет собой сложный комплекс алгоритмических и программных средств, предназначенных для автоматизации анализа АСУП, тестирования, отладки и оценки ее качества, и позволяет облегчить модификацию компонент АСУП, обеспечить выявление ошибок на ранних стадиях отладки, повысить процент автоматически обнаруживаемых ошибок. На рис. 23 показано, как использование САТО влияет на цену обнаружения ошибок в течение жизненного цикла АСУП. АСУП становится «работоспособной», когда цена обнаруженной ошибки меньше некоторого значения μ, которое отражает уровень терпимости пользователя к программным ошибкам. Число имеющихся ошибок (область под кривой) одно и то же в обоих случаях. Отметим, что число обнаруженных ошибок после того, как АСУП становится работоспособной, почти постоянно по следующим причинам: 1) влияние эффекта «ряби» — исправление ошибки служит источником внесения новых ошибок (практика показывает, что такие ошибки составляют 19% всех обнаруженных ошибок); 2) практически для всех АСУП лишь небольшая ее часть интенсивно эксплуатируется, все остальные функции выполняются от случая к случаю, поэтому ошибки в них могут быть обнаружены значительно позже при удовлетворении некоторых специальных условий. Рис. 23 I - кривая тестирования с использованием САТО, II - кривая тестирования без использования САТО Таким образом, установление корректности с помощью САТО является наиболее дешевым и эффективным средством улучшения качества и надежности АСУП. Конечно, абсолютная надежность не может быть достигнута с помощью САТО, тем не менее вероятность надежной работы АСУП будет являться допустимой в большинстве практических случаев. Средства автоматизации, включаемые в САТО, в зависимости от решаемых ими задач разбиваются на средства автоматизации тестирования и средства автоматизации отладки. Средства автоматизации тестирования в соответствии с этапами процесса тестирования классифицируются на следующие пять типов: 1) генераторы тестовых данных (ГТД), способные генерировать большие объемы тестовых данных на основании задаваемых форматов и допустимых диапазонов значений входной информации. При этом часто требуется выделить из множества тестовых данных приемлемое их подмножество. Обычно это осуществляется путем перевода ГТД в режим генерации случайных тестовых данных в пределах некоторого диапазона значений или путем выбора тестовых данных, распределенных с равными интервалами по всему диапазону возможных значений. Имеется и другой тип ГТД, строящих так называемые полные системы тестовых данных, позволяющие АСУП проверить все свои ветви или удовлетворяющие в той или иной степени другим критериям тестирования; 2) средства автоматизированного контроля результатов, предназначенные для автоматического сравнения ожидаемых результатов с реальными и выдачи информации обо всех расхождениях. Иногда удается автоматизировать и получение ожидаемых результатов, однако соответствующие средства не будут являться универсальными по отношению к тестируемым объектам; 3) средства автоматизированного управления тестированием (тест-мониторы), решающие задачу управления процессом тестирования. Тест-монитор формирует входные тестовые данные (возможно, принимая их от ГТД), подает их на испытываемый объект, получает результаты работы, визуализирует их и помогает проверить их правильность; 4) средства автоматизированного контроля тестирования, позволяющие оценить, насколько полная и тщательная проверка АСУП была осуществлена, например, на основе информации о непроверенных операторах/функциях, непроверенных маршрутах и т. п.; 5) средства автоматизации повторного тестирования, включающие в себя средства сохранения результатов, средства сравнения и визуализации всех расхождений. Средства автоматизации отладки разбиваются на средства статического анализа исходных текстов и средства динамического контроля программ в период их выполнения. В состав этих групп входят инструментальные средства двух типов: средства автоматического обнаружения и локализации семантических ошибок некоторых классов и средства частичной автоматизации, позволяющие получать дополнительную информацию для облегчения обнаружения остальных семантических ошибок. При статическом анализе осуществляется контроль предварительно построенной (средствами САТО) графовой модели АСУП и в отдельных случаях ее исходных текстов с целью обнаружения ошибок, а также спорных конструкций для дальнейшего анализа вручную. ^ Средства статического анализа классифицируются следующим образом: 1) средства анализа потоков управления, осуществляющие контроль структуры АСУП в целом, а также отдельных ее конструкций на основе графовой модели. Средства данного типа позволяют автоматически обнаружить следующие изъяны: невыполняемые операторы/функции, тупиковые ветви, некоторые виды бесконечных циклов и др.; 2) средства контроля операций над данными, предназначенные для обнаружения и локализации ошибок, связанных с особенностями конкретного языка программирования и его реализации (например, выход за пределы разрядной сетки значения константы, использование служебных слов языка в качестве имен, использование в отношении равенства вещественных переменных). Обычно такой контроль осуществляется по исходным текстам; 3) средства анализа потоков данных, используемые для обнаружения ошибок в потоках данных, связанные с нарушениями последовательности операций над информационными объектами (прежде всего операций чтения и записи). Анализ осуществляется по графовой модели, при этом обнаруживаются неинициализированные данные, неиспользуемые данные, ошибки в написании имен и т. п.; 4) средства контроля межмодульных интерфейсов, обнаруживающие некорректные межмодульные взаимодействия, например, несоответствие типов и числа фактических и формальных параметров при вызове модуля; 5) средства обнаружения возможных источников побочных эффектов, позволяющие получать информацию об изменении в теле функции/процедуры/модуля значений параметров вызова, в теле цикла значений управляющих переменных и т. п. для дальнейшего анализа вручную; 6) средства для контроля последовательности событий, производящие сравнение этой последовательности с правильной, заранее заданной последовательностью (например, при работе с файлом должна соблюдаться следующая последовательность: создание, открытие, совокупность чтений/записей, закрытие). ^ Основным недостатком средств статического анализа является то, что они обеспечивают обнаружение лишь частных, специальных случаев семантических ошибок (как правило, проявляющих себя в период выполнения). К достоинствам статического анализа следует отнести возможность контроля выбранного по заданным критериям множества маршрутов потенциального выполнения программы. ^ Средства динамического контроля предназначены для отслеживания поведения программы в период ее выполнения. Средства полной автоматизации обеспечивают контроль определенных семантических некорректностей (обычно по списку ошибок, заданному в той или иной форме). Дополнительно рассматриваемые средства позволяют осуществлять подсчет числа выполнений различных компонент АСУП, временных характеристик и другой статистической информации. Средства частичной автоматизации позволяют пользователю автоматически получать необходимую ему информацию для дальнейшей локализации ошибок вручную. Среди таких средств наиболее распространены DDT (Dinamic Debugging Tools) — «системы для уничтожения блох«(слово «bug» в английском языке означает не только «ошибка», но и»блоха», а ДДТ — популярное в недавнее время средство борьбы с насекомыми). Управление системой DDT и, соответственно, управление отладкой осуществляются посредством языка отладки командного типа, его операторы имеют форму приказов (команд), состоящих из ключевого слова и списка операндов, если последние необходимы. Операторы языка отладки обеспечивают взаимодействие программиста с DDT и инициируют выполнение соответствующих отладочных функций, согласно которым они могут быть разбиты на следующие группы: 1) управляющие операторы, обеспечивающие управление выполнением АСУП в отладочном режиме, а также гибкий контроль исполнения информирующих и контролирующих операторов; 2) информирующие операторы, обеспечивающие сбор статистической информации периода выполнения и поддерживающие аппарат трассировок различного вида (слежение, трассировка по точкам ветвления, трассировка по условиям чтения/записи значений, отслеживание частот прохождения через определенные секции кода и др.); 3) контролирующие операторы, осуществляющие контроль значений переменных, маршрутов и т. п. на предмет сравнения с заранее заданными; 4) операторы чтения/записи, дающие возможность форматного ввода тестовых данных и вывода результатов в протокол сеанса отладки в терминах исходного языка программирования; 5) служебные операторы, обеспечивающие загрузку отлаживаемых программных и информационных компонент АСУП, переключение режимов (пакет, диалог), ввод в протокол сеанса отладки комментариев и т. д. В последние годы разработан ряд DDT, имеющих более сложные языки отладки, приближающиеся по своим изобразительным возможностям к языкам программирования высокого уровня и позволяющие задавать ряд условий, при удовлетворении которых DDT способна исполнять некоторые действия (события), также заранее задаваемые средствами языка отладки.
Дата добавления: 2017-01-14; Просмотров: 684; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |