Файл: Отладка и тестирование программ: основные подходы и ограничения.pdf
Добавлен: 28.03.2023
Просмотров: 139
Скачиваний: 2
ВВЕДЕНИЕ
Актуальность выполнения данной работы обусловлена тем, что новые методологии разработки, таких как ускоренная разработка прикладных программных приложений (RAD), привели к стремительным разработкам специализированных средств автоматизированного тестирования программных систем. Среди основных особенностей таких методологий можно выделить возможность получения разных версий разрабатываемой программной системы. Отсюда, современные технологии тестирования приобрели итеративную природу - каждая последующая версия сопровождается большим количеством тестов, а так же необходимости переработки существующих средств тестирования программных систем.
В свою очередь, в процессе разработке программных систем, в целях снижения затрат, активно используются методы и алгоритмы проектирования программных систем. Но не все они могут подойти для разработки средств тестирования, кроме того в условиях изменений тестируемой программной системы возникает необходимость в постоянной переработке существующих средств.
Среди основных видов тестирования программных систем можно отметить следующие: функциональное тестирование; системное тестирование; тестирование производительности программной системы; нагрузочное тестирование компонентов системы; стресс тестирование; регрессионное тестирование разработанных алгоритмов; модульное тестирование структуры программной системы; тестирование безопасности; тестирование локализации; юзабилити тестирование.
Надежность программной системы является гораздо наиболее важной ее характеристикой чем другие время ее выполнения, и в тоже время абсолютная характеристика надежности современной программной системы, по-видимому, является недостижимой, до сих пор нет общепринятых мер по которым можно было бы определить надежность конкретной системы.
Объект исследования – отладка и тестирование программ.
Предмет исследования – виды тестирования, тестирование надежности, организация процесса тестирования. Финишные этапы разработки программных систем.
Целью данной работы является изучение вопросов, связанных с отладкой и тестированием программ: основные подходы и ограничения.
В соответствии с целью была определена необходимость постановки и решения следующих задач:
– изучить виды тестирования;
– изучить тестирование надежности;
– изучить организацию процесса тестирования;
– изучить финишные этапы разработки программных систем;
– изучить программные средства для оценки качества программных систем.
1. Тестирование и отладка программ
1.1. Виды тестирования
Функциональное тестирование.
Проверка функциональности (тестирование методом «черного ящика») представляет собой определенную проверку соответствия определенной программной системы некоторым требованиям, которые были заявлены в ее спецификации. В процессе функционального тестирования могут выполняться как операции полного тестирования заявленной функциональности, так и выполнение проверки только базовой функциональности конечной программной системы.
Тестирование «белого ящика» (white box) представляет собой использование операций тестирования на соответствие программной системы некоторым требованиям с учетом знаний внутренней структуры реализации программной системы (при наличии исходного кода и технической спецификации).
Тестирование «черного ящика» (black box) представляет собой тестирование на соответствие программной системы заявленным требованиям без знания внутренней структуры реализации программной системы [4].
Системное тестирование.
Системное тестирование представляет собой высокоуровневую проверку функционала всей программно системы или некоторой системы в целом.
Тестирование производительности.
Тестирование производительности предполагает тестирование, которое проводится для определения, насколько быстро будет работать программная система или её отдельная часть под определённой функциональной нагрузкой.
Нагрузочное тестирование.
Нагрузочное тестирование предполагает тестирование, которое предназначено для выполнения проверки полной работоспособности программной системы при возможных стандартных нагрузках и для определения наибольшего пика ее непосредственной производительности, при котором программная система будет работать правильно и без некоторых сбоев [1].
Стресс тестирование.
Стресс тестирование представляет собой тестирование, которое предназначено для выполнения проверки полной работоспособности программной системы при наличии нестандартных нагрузок и для выявления максимально возможного пика программной системы, при котором программная система будет работать правильно и без сбоев. Так же стресс тестирование используется для выявления результатов, при которых программная система переходит в нерабочее состояние, т.е. выходит из строя.
Регрессионное тестирование.
Регрессионное тестирование выполняется для проверки влияния новых функций, улучшений и исправлений дефектов на существующую функциональность программной системы и не возникают ли старые дефекты исходной программной системы.
Модульное тестирование.
Каждая достаточно сложная программная система состоит из отдельных программных частей, отдельных модулей, которые выполняют определенные функции в составе программной системы. Для того, чтобы определить правильность и корректность работы всей программной системы, необходимо сперва выполнить тестирование каждого отдельного модуля программной системы по отдельности. Если возникнуть какие-либо проблемы в процессе тестирования программной системы в целом это поможет намного проще выявить программные модули, которые вызвали проблемы, и устранить проблемы обработки информации. Такого рода тестирование программных модулей по отдельности называется модульным тестированием [3].
Тестирование безопасности.
Тестирование безопасности представляет собой стратегию тестирования, которая используется для непосредственной проверки общей безопасности программной системы, а также для выполнения качественного анализа возможных рисков, которые связаны с непосредственным обеспечением целостного подхода к организации защиты прикладного программного приложения, атак хакеров, широкого спектра вирусов, несанкционированного доступа к конфиденциальной информации.
Тестирование локализации.
Тестирование локализации - это процесс тестирования локализованной версии программного продукта. Проверка правильности перевода элементов интерфейса пользователя, проверка правильности перевода системных сообщений и ошибок, проверка перевода раздела "Помощь"/"Справка" и сопроводительной документации [9].
Юзабилити тестирование.
Тестирование удобства пользования - это метод тестирования, направленный на установление степени удобства использования, обучаемости, понятности и привлекательности для пользователей разрабатываемого продукта в контексте заданных условий. Выявлять проблемы, связанные со специфическим механизмом интерфейса определять, существуют ли проблемы с удобностью интерфейса для навигации, использования основного функционала.
1.2. Тестирование надежности
Надежность программной системы является гораздо наиболее важной ее характеристикой чем другие время ее выполнения, и в тоже время абсолютная характеристика надежности современной программной системы, по-видимому, является недостижимой, до сих пор нет общепринятых мер по которым можно было бы определить надежность конкретной программной системы.
Для обеспечения определенной надежности программной системы существует большое количество различных подходов, к которым относятся специальные организационные методы по разработке программных систем, разнообразные технологии и специальные технологические программные средства, которые требует, использования большого количество различных ресурсов. Однако из-за отсутствия общепризнанных критериев, по которым можно определить надежность не позволяет с четкой уверенностью ответить на вопрос, насколько является надежной программная система при соблюдении предложенных процедур и специальных технологий и в какой степени будут оправданы выделенные затраты на определенную программную систему. Таким образом, приоритет задач по оценке надежности программных систем должен быть намного выше приоритета задач по ее обеспечению, чего в современной практике на самом деле не наблюдается [10].
На интуитивном уровне понятие надежности программной системы может отражать тот факт, что программная система не всегда может выдавать правильные результаты. Это означает, что надежность программной системы является некоторой характеристикой ее исполняемых инструкций и содержащегося в ней кода. Исполняемый код программной системы можно соотнести с исходным текстом программы так же, как, например, электродвигатель можно соотнести с его чертежами: можно говорить о некоторой надежности конечного изделия, но бессмысленно говорить о надежности его описания, некоторого чертежа, определенного текста 2]. Даже взяв две идентичные программы с одинаковыми функциональными особенностями, но написанные при помощи разных языков программирования, или запасные части, которые разработанные для различных типов машин, или для одинаковой машины, но с использованием различных компиляторов, с точки зрения надежности необходимо считать разными.
Надежность и правильность программной системы.
Программная система может быть правильной, если она не будет содержать ошибок выполнения. Такая программная система не будет давать ложных результатов, т.е. она будет абсолютно надежной и в полной мере выполнять свои функции. Данный факт порождает ложные представления о том, что число ошибок в программной системе может быть наиболее естественной мерой ее конечной надежности. Сегодня встречается множество работ, в которых предлагаются различные методы для оценки количества оставшихся в программном коде ошибок в результате операций ее тестирования, в том числе метод «засорения» наиболее известными ошибками [6]. Однако, как будет видно из приведенных ниже соображений, количество возможных ошибок в ее программном коде не имеет никакого отношения к конечной надежности программной системы стабильной, безотказной работы:
1. Число ошибок в программной системе представляет собой определенную величину «ненаблюдаемую», наблюдаются не сами возникающие ошибки, а результат их проявления в конечной программной системе.
2. Неверное исполнение программной системы может быть следствием не единичного сбоя, а сразу наличием нескольких ошибок программной системы.
3. Ошибки могут быть компенсированы между собой, так что после устранения некоторой ошибки программная система может начать «работать хуже», но это не будет свидетельствовать о конечной надежности программной системы.
4. Надежность характеризуется частотой проявления возможных ошибок, но не их количества; в то же время хорошо является известным, что ошибки могут проявляться с разной частотой: множество ошибок будут неопределенными после нескольких месяцев и даже лет конечной эксплуатации программной системы, но, с другой стороны, нетрудно найти примеры, когда одна ошибка может привести к неверному выполнению программной системы при любых исходных данных, т.е. к некоторой нулевой надежности [15].
Следует также отметить, что если количество возможных ошибок будет рассмотрено как некоторая мера надежности определенной программной системы, то при использовании терминологий теории вероятности это число является случайной величиной, однако самым главным вопросом будет - на каком пространстве возможных событий она будет задана - никем не затрагивался [13].
Наконец, важно подчеркнуть, что, с точки зрения надежности программной системы, в результате исправления выявленных ошибок или выполнения любых других коррекций будет получена новая программная система с другими, чем до выполнения операций коррекции, показателями надежности программной системы.
Таким образом, число ошибок в некоторой программной системе характеризует скорее не программную система, а ее изготовителей и используемый инструментарий для ее разработки.
В качестве примера рассмотрим метод восходящего тестирования.
Восходящее тестирование предполагает, что сначала будет выполнено тестирование всех программных модулей, которые входят в состав программной системы и только после этого они будут объединены для интеграционного тестирования всей программной системы. При использовании такого подхода может быть существенно упрощена локализация возникающих ошибок: если программные модули были протестированы по отдельности, то ошибка при их совместной работе будет проблемой интерфейса программной системы. При таком подходе область поиска возникшей проблем у тестировщиков будет достаточно узка, и поэтому вероятность правильно идентифицировать дефект гораздо выше.