Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Проектирование и разработка информационных систем. Учебное пособие для СПО

.pdf
Скачиваний:
4
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
41
– Достаточно ли он реалистичен? Удовлетворяют ли имеющиеся системные ресурсы (как аппаратные, так и про­граммные) потребностям проекта? Сможет ли программный продукт работать достаточно быстро, достаточно быстро извле­кать информацию из баз данных и ее обрабатывать? Удачно ли выбраны инструментальные средства разработчиков?
– Хорошо ли описана в проекте подсистема обработки ошибок? При нисходящем проектировании особенно велико искушение оставить вопросы обработки ошибок на потом — как самые незначительные. И когда наступает это «потом», о подоб­ных элементах часто вообще забывают, или же из-за нехватки времени они проектируются наспех, поверхностно и в результа­те — плохо. Все возможные условия возникновения ошибок должны быть самым тщательным образом продуманы и описаны в проекте. Важно правильно определить уровень, на котором обрабатывается каждая из ошибок, чтобы ее возникновение в одном модуле не вело к ошибкам в других.
1.4.3. Тестирование на этапе кодирования
На этом этапе к работе по тестированию привлекается специальная группа — тестировщики.
Программный код ИС невозможно протестировать как единый цельный программный элемент (исключение — неболь­шие программы)
На рис. 1.5 показан поэтапный процесс тестирования, где:
– сначала тестируются отдельные программные компонен­ты и подсистемы;
– затем собранная система;
– система с данными, предоставленными заказчиком.
42
Рис. 1.5. Процесс тестирования при кодировании
Процесс тестирования состоит из нескольких этапов:
1. Тестирование процедур. Тестируются отдельные ком-
поненты для проверки правильности их функционирования. Каждый компонент тестируется независимо от других.
2. Тестирование модулей. Программный модуль — это
совокупность зависимых компонентов, таких, как описание класса объектов, декларирование абстрактных типов данных и набор процедур и функций.
3. Тестирование подсистем. Тестируются наборы моду-
лей, которые составляют отдельные подсистемы.
4. Тестирование системы. Из подсистем собирается ко-
нечная система. И проверяется совместимость интерфейсов под­систем
5. Приемочные испытания. Это конечный этап процесса
тестирования, после которого система принимается к эксплуата­ции. Выявляются ошибки в системных требованиях, поскольку испытания с реальными данными могут дать иной результат, чем тестирование со специально подобранными тестовыми дан­ными.
Приемочные испытания иногда называют альфатестиро- ванием. Сделанные на заказ системы предназначены для одного заказчика. Для таких систем процесс альфа-тестирования про­должается до тех пор, пока разработчики и заказчик не удосто-
43
верятся в том, что разработанная система полностью соответ­ствует системным требованиям.
Если система разрабатывается для продажи на рынке про­граммных продуктов, используется так называемое бетатести- рование. Для бетатестирования система рассылает большому числу потенциальных пользователей и заказчиков. Они отсыла­ют разработчикам отчеты о выявленных проблемах в эксплуата­ции системы. Бетатестирование позволяет проверить систему в реальных условиях эксплуатации и найти ошибки, пропущенные разработчиками. После получения отчетов об испытаниях си­стема модернизируется и снова передается на бетатестирова- ние либо сразу поступает в продажу.
Методы «стеклянного» и «черного» ящика
И вот, наконец, наступает этап кодирования: программист пишет программы и сам их тестирует. Поскольку курс «проек­тирование информационных систем» не предполагает получение навыков написания программ, этап кодирования не рассмотрен в этом пособии.
Однако следует ознакомиться с технологией тестирования, которая применяется на этом этапе. Эта технология называется тестированием «стеклянного ящика» (glass box) — иногда ее еще называют тестированием «белого ящика» (white box) в противо­положность классическому понятию «черного ящика» (black box).
При тестировании «черного ящика» программа рассматри­вается как объект,чс внутренняя структура которого неизвестна. Тестировщик вводит данные и анализирует результат, но, как именно работает программа, он не знает. Подбирая тесты, спе­циалист ищет интересные с его точки зрения входные данные и условия, которые могут привести к нестандартным результатам. Интересны для него, прежде всего, те представители каждого класса входных данных, на которых с наибольшей вероятностью могут проявиться ошибки тестируемой программы.
При тестировании «стеклянного ящика» ситуация совер­шенно иная. Тестировщик (как правило, это программист) раз­рабатывает тесты, основываясь на знании исходного кода, к ко­торому он имеет полный доступ. В результате он получает сле­дующие преимущества.
44
– Направленность тестирования. Программист может те­стировать программу по частям, разработать специальные тесто­вые подпрограммки, которые вызывают тестируемый модуль и передают ему интересующие программиста данные. Отдельный модуль гораздо легче протестировать именно как "стеклянный ящик".
– Полный охват кода. Программист всегда может опреде­лить, какие именно фрагменты кода работают в каждом тесте. Он видит, какие еще ветви кода остались непротестированными, и может подобрать условия, в которых они будут выполнены
– Управление потоком. Программист всегда знает, какая функция должна выполняться в программе следующей и каким должно быть ее текущее состояние. Чтобы выяснить, работает ли программа так, как он думает, программист может включить в нее отладочные команды, отображающие информацию о ходе ее выполнения, или воспользоваться для этого специальным программным средством, называемым отладчиком. (Отладчик может делать очень много полезных вещей: отслеживать и ме­нять последовательность выполнения команд программы, пока­зывать содержимое ее переменных и их адреса в памяти и мно­гое другое.)
– Отслеживание целостности данных. Программисту из­вестно, какая часть программы должна изменять каждый эле­мент данных. Отслеживая состояние данных (с помощью того же отладчика), он может выявить такие ошибки, как изменение данных не теми модулями, их неверная интерпретация или не­удачная организация. Программист может и самостоятельно ав­томатизировать тестирование.
– Внутренние граничные точки. В исходном коде видны те граничные точки программы, которые скрыты от взгляда "извне". Например, для выполнения определенного действия может быть использовано несколько совершенно различных ал­горитмов, и, не заглянув в код, невозможно определить, какой из них выбрал программист. Еще одним типичным примером мо­жет быть проблема переполнения буфера, используемого для временного хранения входных данных. Программист сразу мо­жет сказать, при каком количестве данных буфер переполнится, и ему не нужно при этом проводить тысячи тестов.
45
– Тестирование, определяемое выбранным алгоритмом. Для тестирования обработки данных, использующей очень сложные вычислительные алгоритмы, могут понадобиться спе­циальные технологии. В качестве классических примеров можно привести преобразование матрицы и сортировку данных. Тести­ровщику нужно точно знать, какие алгоритмы используются, и обратиться к специальной литературе.
Тестирование «стеклянного ящика» мы рассматриваем как часть процесса программирования. Программисты выполняют эту работу постоянно, тестируют каждый модуль после его написания, а затем еще раз после интеграции его в систему.
Однако не менее важно тестирование методом «черного ящика», и именно ему посвящают большую часть времени все профессиональные тестировщики. (Отдельную и достаточно специфическую область тестирования представляют собой СУБД для мэйнфреймов.)
Тестировщик «черного ящика» не изучает исходный код программы — он исследует ее извне, работая с ней так, как это будет делать пользователь. И так же, как исследование програм­мы изнутри позволяет выявить проблемы и критические точки, которых не видно извне, так и тестирование методом «черного ящика» выявляет ошибки и недостатки, которые программист упускает.
Тестирование частей против тестирования целого
Любая система разрабатывается по частям — как набор процессов или модулей. Можно ее так и тестировать — сначала отдельные части, а потом их взаимодействие. Такая стратегия называется восходящей (bottom-up).
Выяснив, что отдельные элементы программы находятся в порядке, специалист приступает к тестированию их совместной работы. И тут может оказаться, что вместе они работать отказы­ваются. Например, если программист случайно поменяет места­ми параметры вызываемой функции, при выполнении вызова произойдет ошибка. И выявлена она будет только при проверке совместной работы обеих функций — вызывающей и вызывае­мой.
Тестирование совместной работы программных модулей называют интеграционным. В ходе такого тестирования модули
46
сначала объединяются в пары, потом в большие блоки, пока, наконец, все модули не будут объединены в единую систему.
Восходящее тестирование — это прекрасный способ лока­лизации ошибок. Если ошибка обнаружена при тестировании единственного модуля, то очевидно, что она содержится именно в нем — для поиска ее источника не нужно анализировать код всей системы. А если ошибка проявляется при совместной рабо­те двух предварительно протестированных модулей, значит, де­ло в их интерфейсе. Еще одним преимуществом восходящего тестирования является то, что выполняющий его программист концентрируется на очень узкой области (единственном модуле, передаче данных между парой модулей и т. п.). Благодаря этому тестирование проводится более тщательно и с большей вероят­ностью выявляет ошибки.
Главный недостаток восходящего тестирования — необ­ходимость написания специального кода-оболочки, вызывающе­го тестируемый модуль. Если он, в свою очередь, вызывает дру­гой модуль, для него нужно написать заглушку. Заглушка — это имитация вызываемой функции, возвращающая те же данные, но ничего больше не делающая.
Понятно, что написание оболочек и заглушек замедляет работу, а для конечного продукта они абсолютно бесполезны. Но написанные однажды, эти элементы могут использоваться повторно при каждом изменении программы. Хороший набор оболочек и заглушек — это очень эффективный инструмент те­стирования.
В противоположность восходящему тестированию, страте­гия целостного тестирования предполагает, что до полной ин- теграции системы ее отдельные модули не проходят особо тща­тельного тестирования.
Преимуществом такой стратегии является то, что нет необходимости в написании дополнительного кода. Поэтому многие руководители выбирают этот способ из соображений экономии времени, они считают, что лучше разработать один обширный набор тестов и с его помощью за один раз проверить всю систему. Но такое представление совершенно ошибочно, и вот почему.
47
– Очень трудно выявить источник ошибки. Это главная проблема. Поскольку ни один из модулей не проверен, как сле­дует, в большинстве из них есть ошибки. Получается, что вопрос не столько в том, в каком модуле произошла обнаруженная ошибка, сколько в том, какая из ошибок во всех вовлеченных в процесс модулях привела к полученному результату. И когда накладываются ошибки нескольких модулей, ситуацию может быть гораздо труднее локализовать и повторить.
Кроме того, ошибка в одном из модулей может блокиро­вать тестирование другого. Как протестировать функцию, если вызывающий ее модуль не работает? Если не написать для этой функции программу-оболочку, придется ждать отладки модуля, а это может затянуться надолго.
– Трудно организовать исправление ошибок. Если про­грамму пишут несколько программистов (а именно так и бывает в больших системах), и при этом неизвестно, в каком модуле ошибка, кто же будет ее искать и исправлять. Один программист будет указывать на другого, тот, выяснив, что его код ни при чем, снова обратится к первому, а в результате будет сильно страдать скорость разработки.
– Процесс тестирования плохо автоматизирован. То, что на первый взгляд кажется преимуществом целостного тестиро­вания — отсутствие необходимости писать оболочки и заглушки на самом деле оборачивается его недостатком. В процессе раз­работки программа ежедневно меняется и ее приходится тести­ровать снова и снова. А оболочки и заглушки помогают автома­тизировать этот однообразный труд.
Поскольку большинство руководителей проектов отнюдь не глупы, когда кто-нибудь из них выбирает целостное тестиро­вание, можно предположить, что в своем конкретном случае он видит такие преимущества этого подхода, которые отнюдь не очевидны. Есть и такие руководители, которые не слишком за­ботятся об эффективности тестирования. Главное для них — как можно скорее отрапортовать начальству о завершении работ, даже если на самом деле ничего не работает. Если после этого с проектом возникнут проблемы, они будут обвинять законы Мэрфи, тестировщиков, невезение, но только не самих себя —
48
собственную часть работы они будут считать выполненной успешно и в срок.
Тестирование нисходящее и восходящее
Существует и еще один принцип организации тестирова­ния, при котором программа так же, как и при восходящем спо­собе, тестируется не целиком, а по частям. Только направление движения меняется — сначала тестируется самый верхний уро­вень иерархии модулей, а от него тестировщик постепенно спус­кается вниз. Такая технология называется нисходящей (top­down). Обе технологии — и нисходящую, и восходящую — называют также инкрементальными.
При нисходящем тестировании отпадает необходимость в написании оболочек, но заглушки остаются. По мере тестирова­ния «заглушки» по очереди заменяются на реальные модули.
Мнения специалистов о том, какая из двух инкременталь­ных стратегий тестирования более эффективна, сильно расхо­дятся. Йордан (Yourdon, 1975) доказывает, что гораздо лучше нисходящее тестирование, а Майерс (Myers, 1976) утверждает, что, хотя у обоих подходов есть свои преимущества и недостат­ки, в целом восходящее тестирование лучше. По мнению же Данна (Dunn, 1984), эти способы примерно эквивалентны.
На практике вопрос выбора стратегии тестирования обыч­но решается просто: каждый модуль по возможности тестирует­ся сразу после его написания, в результате последовательность тестирования одних частей программы может оказаться восхо­дящей, а других — нисходящей.
При статическом тестировании программный код вообще не выполняется — он тестируется только путем логического анализа.
Две описанные выше базовые стратегии — тестирование «черного ящика» и тестирование «стеклянного ящика» — явля­ются динамическими. Программа запускается, вводятся данные, и программист или тестировщик анализирует результат. Разница только в том, на какой информации основывается подбор тестов.
Для статического анализа существует множество инстру­ментальных средств. Самое известное из них — компилятор. Встретив синтаксическую ошибку или недопустимую операцию, компилятор выдает соответствующее сообщение. Ряд полезных
49
сообщений выдает и компоновщик — о повторяющихся именах переменных и других объектов, ссылках на необъявленные пе­ременные и функции.
Статический анализ программы может выполняться и людьми. Они читают исходный код, возможно, обсуждают его, и, как правило, находят достаточно много ошибок. Вот примеры такой работы.
– Обзорные, инспекционные и рецензионные совещания. Это точно такие же совещания, какие проводятся для анализа проекта программного продукта.
– Работа за столом. Статический анализ программного ко­да может выполняться и в одиночку. Специалист читает и ана­лизирует программный код. Если он не может понять, что делает конкретный фрагмент программы, он может поработать и за компьютером, но большую часть времени проводит за столом. Он работает дольше, чем обычно длятся совещания, и, как пра­вило, анализирует гораздо большие объемы кода. Этот вид те­стирования может выполнять как сам автор программного кода, так и кто-то другой, в любом случае оно будет очень полезным.
1.5. Внедрение
Задача разработчиков на этапе внедрения обучить персо­нал работе с помощью ИС, подготовить АО и поставить ИС на компьютеры заказчика.
Стадия «Внедрение проекта» — это подготовка и посте­пенное освоение разработанной проектной документации заказ­чиками. Выявляются частные и принципиальные недоработки в ПО.
Внедрение может осуществляться:
– последовательно, когда последовательно внедряется од­на подсистема за другой и одна задача следует за другой зада­чей;
– когда все задачи внедряются во всех подсистемах одно­временно;
– смешанно, при котором проектировщики, внедрив не­сколько подсистем первым методом, накопив опыт, приступают к параллельному внедрению остальных.
50
Недостатком первого подхода является увеличение дли­тельности внедрения, что ведет за собой рост стоимости проек­та. При использовании второго подхода сокращается время внедрения, но возникает возможность пропуска ошибок в про­ектной документации, поэтому чаще всего используют смешан­ный метод внедрения проекта ИС.
Внедрение проекта осуществляется в три этапа:
1) подготовка объекта к внедрению;
2) опытное внедрение;
3) сдача проекта в промышленную эксплуатацию.
Первый этап «Подготовка объекта к внедрению». На этом этапе осуществляются следующие операции:
– изменяется организационная структура объекта (пред­приятия);
– набираются кадры соответствующей квалификации в об­ласти обработки информации и эксплуатации системы и сопро­вождения проектной документации;
– оборудуется здание под установку вычислительной тех­ники;
– выполняются закупка и установка вычислительной тех­ники с периферией;
– в цехах, отделах устанавливаются средства сбора, реги­страции первичной информации и передачи по каналам связи;
– осуществляется установка каналов связи; проводится разработка новых документов и классификаторов;
– осуществляется создание файлов информационной базы с нормативно-справочной информацией.
В результате выполнения этапа составляется акт готовно­сти объекта к внедрению. Затем формируется состав приемной комиссии, разрабатывается программа проведения опытного внедрения и издается приказ о начале опытного внедрения.
Второй этап «Опытное внедрение». В процессе опытного внедрения выполняются работы по решению с помощью внед­ряемого ПО реальных задач заказчика и анализ результата на предмет наличия ошибок.
В случае обнаружения ошибок осуществляются поиск причин и источников ошибок, внесение исправлений. Кроме то-
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]