Главная страница

Основы Программной Инженерии (по swebok) Введение Программная инженерия как дисциплина swebok руководство


Скачать 3.21 Mb.
НазваниеОсновы Программной Инженерии (по swebok) Введение Программная инженерия как дисциплина swebok руководство
Анкорswebok
Дата14.10.2022
Размер3.21 Mb.
Формат файлаpdf
Имя файлаswebok_2004_ru.pdf
ТипРуководство
#733732
страница10 из 30
1   ...   6   7   8   9   10   11   12   13   ...   30
Достижение и оценка надежности (Reliability achievement and evaluation)
Помогая идентифицировать причины сбоев,
тестирование подразумевает и повышение надежности программных систем. Случайно генерируемые сценарии тестирования могут применяться для статистической оценки надежности. Обе цели – повышение и оценка надежности – могут достигаться при использовании моделей повышения надежности. Эти вопросы затрагиваются и в тематическом фрагменте 4.1.4 “Life test, reliability evaluation”.
Регрессионное тестирование (Regression testing)
Определение успешности регрессионных тестов (IEEE
610-90 “Standard Glossary of Software Engineering
Terminology”) гласит: “повторное выборочное тестирование системы или компонент для проверки сделанных модификаций не должно приводить к непредусмотренным эффектам”. На практике это означает, что если система успешно проходила тесты до внесения модификаций, она должна их проходит и после внесения таковых. Основная проблема регрессионного тестирования заключается в поиске компромисса между имеющимеся ресурсами и необходимостью проведения таких тестов по мере внесения каждого изменения. В
определенной степени, задача состоит в том, чтобы определить критерии “масштабов” изменений, с достижением которых необходимо проводить регрессионные тесты.
Тестирование производительности (Performance testing)
Специализированные тесты проверки удовлетворения специфических требований, предъявляемых к параметрам производительности. Существует особый подвид таких тестов, когда делается попытка достижения количественных пределов, обусловленных характеристиками самой системы и ее операционного окружения.
Нагрузочное тестирование (Stress testing)
Необходимо понимать отличия между рассмотренным выше тестированием производительности с целью достижения ее реальных (достижимых) возможностей производительности и выполнением программной системы c повышением нагрузки, вплоть до достижения запланированных характеристик и далее, с отслеживанием поведения на всем протяжении повышения загрузки системы.
Сравнительное тестирование (Back-to-back testing)
Единичный набор тестов, позволяющих сравнить две версии системы.
Восстановительные тесты (Recovery testing)
Цель – проверка возможностей рестарта системы в случае непредусмотренной катастрофы (disaster),
влияющей на функционирование операционной среды, в которой выполняется система.
Конфигурационное тестирование (Configuration testing)
В случаях, если программное обеспечение создается для использования различными пользователями (в терминах “ролей”), данный вид тестирования направлен на проверку поведения и работоспособности системы в различных конфигурациях.
Тестирование удобства и простоты использования (Usability testing)
Цель – проверить, насколько легко конечный пользователь системы может ее освоить, включая не только функциональную составляющую – саму систему,
но и ее документацию; насколько эффективно пользователь может выполнять задачи, автоматизация которых осуществляется с использованием данной системы; наконец, насколько хорошо система застрахована (с точки зрения потенциальных сбоев) от ошибок пользователя.
Разработка, управляемая тестированием (Test-driven development)
По-сути, это не столько техника тестирования, сколько стиль организации процесса разработки, жизненного цикла, когда тесты являются неотъемлемой частью требований (и соответствующих спецификаций) вместо того, чтобы рассматриваться независимой деятельностью по проверке удовлетворения требований программной системой.
Иногда говорят о таком стиле разработки как о самостоятельной методологии – TDD. Насколько это
верно, зависит от того, что именно понимать под методологией разработки. Скорее, с точки зрения автора, это техника, практика или стиль организации работы, чем самостоятельная методология.
В меньшей степени это относится к FDD – Feature-Driven
Development (разработка на основе функциональных возможностей). TDD может естественно рассматриваться как составная часть XP или, как минимум Agile-методов. В свою очередь, FDD может рассматриваться как один из методов гибкой разработки.
В чем отличие столь близких, на первый взгляд,
подходов (и, кстати, соответствующих аббревиатур)?
Причина – проста. Тесты – инструмент достижения характеристик системы, удовлетворяющей заданным требованиям, то есть потребностям пользователей, а
“возможности” (features) – практически сами (чаще –
функциональные) требования, воплощенные (в идеальном случае) в код.
Техники тестирования (Test Techniques)
Техники, базирующиеся на интуиции и опыте инженера
(Based on the software engineer’s intuition and experience)
Специализированное тестирование (Ad hoc testing)
Возможно, наиболее широко практикуемая техника.
Тесты основываются на опыте, интуиции и знаниях инженера, рассматривающего проблему с точки зрения имевшихся ранее аналогий. Данный вид тестирования может быть полезен для идентификации тех тестов,
которые не охватываются рассматривавшимеся выше более формализованными техниками.
Исследовательское тестирование (Exploratory testing)
Такое тестирование определяется как одновременное обучение, проектирование теста и его исполнение.
Данный вид тестирования заранее не определяется в плане тестирования и такие тесты создаются,
выполняются и модифицируются динамически, по мере необходимости. Эффективность исследовательских тестов напрямую зависит от знаний инженера,
формируемых на основе поведения тестируемого продукта в процессе проведения тестирования, степени знакомства с приложением, платформой, типами возможных сбоев и дефектов, рисками,
ассоциированными с конкретным продуктом и т.п.
Техники, базирующиеся на спецификации (Specification-
based techniques)
Эквивалентное разделение <приложения> (Equivalence partitioning)
Рассматриваемая область приложения разделяется на коллекцию наборов или эквивалентных классов, которые считаются эквивалентными с точки зрения рассматриваемых связей и характеристик
<спецификации>. Репрезентативный набор тестов
(иногда – только один тест) формируется из тестов эквивалентных классов (или наборов классов).
Анализ граничных значений (Boundary-value analysis)
Тесты строятся с ориентацией на использование тех величин, которые определяют предельные
характеристики тестируемой системы. Расширением этой техники являются тесты оценки живучести
(robustness testing) системы, проводимые с величинами,
выходящими за рамки специфицированных пределов значений.
Таблицы принятия решений (Decision table)
Такие таблицы представляют логические связи между условиями (могут рассматриваться в качестве “входов”)
и действиями (могут рассматриваться как “выходы”).
Набор тестов строится последовательным рассмотрением всех возможных кросс-связей в такой таблице.
Тесты на основе конечного автомата (Finite-state machine-based)
Строятся как комбинация тестов для всех состояний и переходов между состояниями, представленных в соответствующей модели (переходов и состояний приложения).
Тестирование на основе формальной спецификации (Testing from formal
specification)
Для спецификации, определенных с использованием формального языка, возможно автоматически создавать и тесты для функциональных требований. В ряде случаев могут строится на основе модели, являющейся частью спецификации, не использующей формального языка описания.
Случайное тестирование (Random testing)

В отличие от статистического тестирования (будет рассматриваться в 3.5.1 “Operational profile”), сами тесты генерируются случайным образом по списку заданного набора специфицированных характеристик.
Техники, ориентированные на код (Code-based techniques)
Тесты, базирующиеся на блок-схеме (Control-flow-based criteria)
Набор тестов строится исходя из покрытия всех условий и решений блок-схемы. В какой-то степени напоминает тесты на основе конечного автомата. Отличие – в источнике набора тестов. Максимальная отдача от тестов на основе блок-схемы получается когда тесты покрывают различные пути блок-схемы – по-сути,
сценарии потоков работ (поведения) тестируемой системы. Адекватность таких тестов оценивается как процент покрытия всех возможных путей блок-схемы.
Тесты на основе потоков данных (Data-flow-based criteria)
В данных тестах отслеживается полный жизненный цикл величин (переменных) – с момента рождения
(определения), на всем протяжении использования,
вплоть до уничтожения (неопределенности). В реальной практике используются нестрогое тестирование такого вида, ориентированное, например, только на проверку задания начальных значений всех переменных или всех вхождений переменных в код, с точки зрения их использования.
Ссылочные модели для тестирования, ориентированного на код (Reference
models for code-based testing – flowgraph, call graph)

Является не столько техникой тестирования, сколько контролем структуры программы, представленной в виде дерева вызовов (например, sequence-диаграммы,
определенной в нотации UML и построенной на основе анализа кода).
Тестирование, ориентированное на дефекты (Fault-based
techniques)
Как это ни странно звучит на уровне названия таких техник тестирования, они, действительно,
ориентированы на ошибки. Точнее – на специфические категории ошибок.
Предположение ошибок (Error guessing)
Направлены на обнаружение наиболее вероятных ошибок, предсказываемых, например, в результате анализа рисков.
Тестирование мутаций (Mutation testing)
Мутация – небольшое изменение тестируемой программы, произошедшее за счет частных синтаксических изменений кода (в частности,
рефакторинга). Соответствующие тесты запускаются для оригинального и всех “мутировавших” вариантов тестируемой программы.
SWEBOK фокусируется на возможности, с помощью тестов, определять отличия между мутантами и исходным вариантом кода. Если такое отличие установлено, мутанта “убивают”, а тест считается успешным. Обычно, данный подход фокусируется на синтаксических ошибках, на практике отслеживаемых
современными средами разработки и, конечно,
компиляторами.
Техники, базирующиеся на условиях использования
(Usage-based techniques)
Операционный профиль (Operational profile)
Базируется на условиях использования системы.
Тестирование для оценки надёжности системы должно проводиться в таком тестовом окружении, которое максимально приближено к реальным условиям работы системы. Результаты таких тестов позволяют оценить поведение системы в реальных условиях. Входные параметры тестов задаются на основе вероятностного распределения соответствующих параметров или их наборов при эксплуатации (входные данные могут прогнозироваться исходя из частоты возможных сценариев работы пользователей).
Тестирование, базирующееся на надежности инженерного процесса (Software
Reliability Engineered Testing)
Базируется на условиях разработки системы.
Соответствующие тесты (обозначаемые также аббревиатурой SRET от Software Reliability Engineered
Testing) проектируются в контексте используемого процесса разработки и методик тестирования.
Техники, базирующиеся на природе приложения
(Techniques based on the nature of the application)

Описанные выше техники могут применяться к любым типам программных систем. В то же время, в зависимости от технологической или архитектурной природы приложений, могут также применять специфические техники, важные именно для заданного типа приложения. Среди таких техник:
Объектно-ориентированное тестирование
Компонентно-ориентированное тестирование
Web-ориентированное тестирование
Тестирование на соответствие протоколам
Тестирование систем реального времени
Выбор и комбинация различных техник (Selecting and
combining techniques)
Функциональное и структурное (Functional and structural)
Техники тестирования, строящиеся на основе спецификаций или кода часто называют функциональными или структурными, соответственно.
Оба подхода не должны противопоставляться, но дополнять друг друга.
Определенное или случайное (Deterministic vs. random)
Обычно тесты можно распределить по данным группам на основе используемой политики выбора или определения входных параметров тестов.
Измерение результатов тестирования (Test-related
measures)
Часто техники тестирования путают с целями тестирования. Степень покрытия тестами - не то же
самое, что высокое качество тестируемой системы.
Однако, эти вопросы связаны. Чем выше степень покрытия, чем больше вероятность обнаружения скрытых дефектов. Когда мы говорим о результатах тестирования, мы должны подходить к их оценке, как оценке самой тестируемой системы. Именно количественные оценки результатов тестирования (но не самих тестов, например, покрытия ими возможных сценариев работы системы) освещаются ниже. В свою очередь, метрики самих тестов или процесса тестирования, как такового – вопросы, рассматриваемые в областях знаний “Процессы программной инженерии”
(Software Engineering Process) и “Управление инженерной деятельностью” (Software Engineering
Management).
Измерения являются инструментом анализа качества.
Измерение результатов тестирования касается оценки качества получаемого продукта – программной системы.
История измерений демонстрирует прогресс достижения приемлемого качества. Такая история является инструментом менеджмента качества.
Оценка программ в процессе тестирования (Evaluation of
the program under test, IEEE 982.1-98)
Измерения программ как часть планирования и разработки тестов (Program
measurements to aid in planning and design testing)
Данные измерения могут базироваться на размере программ (например, в терминах количества строк кода или функциональных точек) или их структуре (например,
с точки зрения оценки ее сложности в тех или иных архитектурных терминах). Структурные измерения могут
также включать частоту обращений одних модулей программы к другим.
Типы дефектов, их классификация и статистика возникновения (Fault types,
classification and statistics)
В литературе по тестированию встречается большое количество различных классификаций дефектов.
Эффективность тестирования может быть достигнута в том случае, если мы понимаем какие типы дефектов могут быть найдены в процессе тестирования программной системы и как изменяется их частота во времени (подразумевая историческую перспективу развития системы, а не её сбоев в процессе работы).
Эта информация позволяет прогнозировать качество системы и помогает совершенствовать процесс разработки, в целом.
Стандарт IEEE 1044-93 классифицирует возможные программные “аномалии”.
Плотность дефектов (Fault density)
Тестируемая программа может оцениваться на основе подсчета и классификации найденных дефектов. Для каждого класса дефектов можно определить отношение между количеством соответствующих дефектов и размером программы (в терминах выбранных метрик оценки размера).
Жизненный цикл тестов, оценка надежности (Life test, reliability evaluation)
Статистические ожидания в отношении надежности программной системы (см. выше 2.2.5 “Достижение и оценка надежности”) могут использоваться для принятия
решения о продолжении или прекращении (окончании)
тестирования, исходя из заданных параметров приемлемого качества (например, плотности дефектов заданного класса).
Модели роста надежности (Reliability growth models)
Данные модели обеспечивают возможности прогнозирования надежности системы, базируясь на обнаруженных сбоях (см. выше 2.2.5). Модели такого рода разбиваются на две группы – по количеству сбоев
(failure-count) и времени между сбоями (time-between- failure).
Оценка выполненных тестов (Evaluation of the tests
performed)
Метрики покрытия/глубины тестирования (Coverage/thoroughness measures)
Критерии “адекватности” тестирования, в ряде случаев,
требуют систематического выполнения тестов для определенных набора элементов программы,
задаваемых ее архитектурой или спецификацией.
Соответствующие метрики позволяют оценить степень охвата характеристик системы (например, процент различных тестируемых параметров производительности) и глубину их детализации
(например, случайное тестирование параметров производительности или с учетом граничных значений и т.п.). Такие метрики помогают прогнозировать вероятностное достижение заданных параметров качества системы.
Введение искусственных дефектов (Fault seeding)

“Своими руками?! Никогда! …” – такова, обычно, первая реакция на идею искусственного внесения дефектов,
например, в программный код. На практике, этот подход помогает классифицировать возможные ошибки и следующие за ними сбои, применяя в дальнейшем полученные результаты для моделирования (пусть,
часто, и интуитивного) возможных причин реальных сбоев, обнаруженных в процессе тестирования.
Безусловно, данная техника должна использоваться с максимальной осторожностью опытными специалистами, хорошо представляющими общую архитектуру тестируемой программной системы и разбирающимеся во её внутренних связях.
Оценка мутаций (Mutation score)
Получаемое в процессе тестирования мутаций (см.
выше 3.4.2) отношение “убитых” к общему числу сгенерированных мутантов помогает измерить эффективность выполняемых тестов. В силу специфики такой техники тестирования, количественные оценки мутаций имеют практическое значение только для определенных типов систем.
Сравнение и относительная эффективность различных техник тестирования
(Comparison and relative effectiveness of different techniques)
Различные исследования в области тестирования связаны с попытками сравнения (с точки зрения достигаемого качества продукта) разных подходов к тестированию. Когда мы говорим об “эффективности”
тестирования надо чётко договориться, что именно мы подразумеваем под эффективностью, желательно, в
количественном выражении. Возможные варианты интерпретации этого понятия – число тестов (данной техники), необходимых для обнаружения первого дефекта; отношение количества всех обнаруженных дефектов к дефектам, найденным с применением заданного подхода и т.п. Только обладая такого рода данными можно говорить о корректности сравнения и оценки эффективности.
1   ...   6   7   8   9   10   11   12   13   ...   30


написать администратору сайта