В.В. Кулямин - Технологии программирования. Компонентный подход (1134162), страница 21
Текст из файла (страница 21)
подтверждение того, чтоон действительно удовлетворяет потребностям и ожиданиям пользователей, заказчиков идругих заинтересованных сторон.66Эффективность верификации и валидации, как и эффективность разработки ПО в целом,зависит от полноты и корректности формулировки требований к программному продукту.Основой любой системы обеспечения качества являются методы его обеспечения и контроля.Методы обеспечения качества [9] представляют собой техники, гарантирующие достижениеопределенных показателей качества при их применении.
Мы будем рассматривать подобныеметоды на протяжении всего курса.Методы контроля качества позволяют убедиться, что определенные характеристикикачества ПО достигнуты. Сами по себе они не могут помочь их достижению, они лишь помогаютопределить, удалось ли получить в результате то, что хотелось, или нет, а также найти ошибки,дефекты и отклонения от требований. Методы контроля качества ПО можно классифицироватьследующим образом.• Методы и техники, связанные с выяснением свойств ПО во время его работы.Это, прежде всего, все виды тестирования, а также профилирование и измерениеколичественных показателей качества, которые можно определить по результатам работыПО — эффективности по времени и другим ресурсам, надежности, доступности и пр.• Методы и техники определения показателей качества на основе симуляции работы ПО спомощью моделей разного рода.К этому виду относятся проверка на моделях (model checking), а также прототипирование(макетирование), используемое для оценки качества принимаемых решений.• Методы и техники, нацеленные на выявление нарушений формализованных правилпостроения исходного кода ПО, проектных моделей и документации.К методам такого рода относится инспектирование кода, заключающееся вцеленаправленном поиске определенных дефектов и нарушений требований в коде наоснове набора шаблонов, автоматизированные методы поиска ошибок в коде, неоснованные на его выполнении, методы проверки документации на согласованность исоответствие стандартам.• Методы и техники обычного или формализованного анализа проектной документации иисходного кода для выявления их свойств.К этой группе относятся многочисленные методы анализа архитектуры ПО, о которыхпойдет речь в следующей лекции, методы формального доказательства свойств ПО иформального анализа эффективности применяемых алгоритмов.Далее мы несколько подробнее рассмотрим тестирование и проверку на моделях как примерыметодов контроля качества.ТестированиеТестирование — это проверка соответствия ПО требованиям, осуществляемая с помощьюнаблюдения за его работой в специальных, искусственно построенных ситуациях.
Такого родаситуации называют тестовыми или просто тестами.Тестирование — конечная процедура. Набор ситуаций, в которых будет проверятьсятестируемое ПО, всегда конечен. Более того, он должен быть настолько мал, чтобы тестированиеможно было провести в рамках проекта разработки ПО, не слишком увеличивая его бюджет исроки. Это означает, что при тестировании всегда проверяется очень небольшая доля всехвозможных ситуаций. По этому поводу Дейкстра (Dijkstra) заметил, что тестирование позволяетточно определить, что в программе есть ошибка, но не позволяет утверждать, что там нет ошибок.Тем не менее, тестирование может использоваться для достаточно уверенного вынесенияоценок о качестве ПО.
Для этого необходимо иметь критерии полноты тестирования,описывающие важность различных ситуаций для оценки качества, а также эквивалентности изависимости между ними. Этот критерий может утверждать, что все равно в какой из ситуаций, Aили B, проверять правильность работы ПО, или, если программа правильно работает в ситуацииA, то, скорее всего, в ситуации B все тоже будет правильно.
Часто критерий полнотытестирования задается при помощи определения эквивалентности ситуаций, дающей конечный67набор классов ситуаций. В этом случае считают, что все равно, какую из ситуаций одного классаиспользовать в качестве теста. Такой критерий называют критерием тестового покрытия, апроцент классов эквивалентности ситуаций, случившихся во время тестирования, — достигнутымтестовым покрытием.Таким образом, основные задачи тестирования: построить такой набор ситуаций, который былбы достаточно представителен и позволял бы завершить тестирование с достаточной степеньюуверенности в правильности ПО вообще, и убедиться, что в конкретной ситуации ПО работаетправильно, в соответствии с требованиями.ПроверяемыетребованияКритерииполнотытестированияРазработкатестовТестируемоеПОВыполнениетестовНабортестовАнализрезультатовРезультатытестирования —отчетыРисунок 25.
Схема процесса тестирования.Тестирование — наиболее широко применяемый метод контроля качества. Для оценки многихатрибутов качества не существует других эффективных способов, кроме тестирования.Организация тестирования ПО регулируется следующими стандартами.• IEEE 829-1998 Standard for Software Test Documentation.Описывает виды документов, служащих для подготовки тестов.• IEEE 1008-1987 (R1993, R2002) Standard for Software Unit Testing.Описывает организацию модульного тестирования (см. ниже).• ISO/IEC 12119:1994 (аналог AS/NZS 4366:1996 и ГОСТ Р-2000, также принят IEEE подномером IEEE 1465-1998) Information Technology. Software packages — Quality requirementsand testing.Описывает требования к процедурам тестирования программных систем.Тестировать можно соблюдение любых требований, соответствие которым выявляется вовремя работы ПО.
Из характеристик качества по ISO 9126 этим свойством не обладают толькоатрибуты удобства сопровождения. Поэтому выделяют виды тестирования, связанные с проверкойопределенных характеристик и атрибутов качества — тестирование функциональности,надежности, удобства использования, переносимости и производительности, а также тестированиезащищенности, функциональной пригодности и пр. Кроме того, особо выделяют нагрузочное илистрессовое тестирование, проверяющее работоспособность ПО и показатели егопроизводительности в условиях повышенных нагрузок — при большом количестве пользователей,интенсивном обмене данными с другими системами, большом объеме передаваемых илииспользуемых данных, и пр.На основе исходных данных, используемых для построения тестов, тестирование делят наследующие виды.• Тестирование черного ящика, нацеленное на проверку требований. Тесты для него икритерий полноты тестирования строятся на основе требований и ограничений, четкозафиксированных в спецификациях, стандартах, внутренних нормативных документах.Часто такое тестирование называется тестированием на соответствие (conformance68testing).
Частным случаем его является функциональное тестирование — тесты для него,а также используемые критерии полноты проведенного тестирования определяют на основетребований к функциональности.Еще одним примером тестирования на соответствие является аттестационное иликвалификационное тестирование, по результатам которого программная системаполучает (или не получает) официальный документ, подтверждающий ее соответствиеопределенным требованиям и стандартам.• Тестирование белого ящика, оно же структурное тестирование — тесты создаются наоснове знаний о структуре самой системы и о том, как она работает.
Критерии полнотыоснованы на проценте элементов кода, которые отработали в ходе выполнения тестов. Дляоценки степени соответствия требованиям могут привлекаться дополнительные знания освязи требований с определенными ограничениями на значения внутренних данныхсистемы (например, на значения параметров вызовов, результатов и локальныхпеременных).• Тестирование, нацеленное на определенные ошибки. Тесты для такого тестированиястроятся так, чтобы гарантированно выявлять определенные виды ошибок.
Полнотатестирования определяется на основе количества проверенных ситуаций по отношению кобщему числу ситуаций, которые мы пытались проверить. К этому виду относится,например, тестирование на отказ (smoke testing), в ходе которого просто пытаютсявывести систему из строя, давая ей на вход как обычные данные, так и некорректные, снарочно внесенными ошибками.Другим примером служит метод оценки полноты тестирования при помощи наборамутантов — программ, совпадающих с тестируемой всюду, кроме нескольких мест, гдеспециально внесены некоторые ошибки.
Чем больше мутантов не проходит успешно черезданный набор тестов, тем полнее и качественнее проводимое с его помощью тестирование.Еще одна классификация видов тестирования основана на том уровне, на который ононацелено. Эти же разновидности тестирования можно связать с фазой жизненного цикла, накоторой они выполняются.• Модульное тестирование (unit testing) предназначено для проверки правильностиотдельных модулей, вне зависимости от их окружения. При этом проверяется, что еслимодуль получает на вход данные, удовлетворяющие определенным критериямкорректности, то и результаты его корректны.
Для описания критериев корректностивходных и выходных данных часто используют программные контракты — предусловия,описывающие для каждой операции, на каких входных данных она предназначенаработать, постусловия, описывающие для каждой операции, как должны соотноситьсявходные данные с возвращаемыми ею результатами, и инварианты, определяющиекритерии целостности внутренних данных модуля.Модульное тестирование является важной составной частью отладочного тестирования,выполняемого разработчиками для отладки написанного ими кода.• Интеграционное тестирование (integration testing) предназначено для проверкиправильности взаимодействия модулей некоторого набора друг с другом. При этомпроверяется, что в ходе совместной работы модули обмениваются данными и вызовамиопераций, не нарушая взаимных ограничений на такое взаимодействие, например,предусловий вызываемых операций.