Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
К вопросу о классификации программных ошибок.doc
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
169.98 Кб
Скачать

К вопросу о классификации программных ошибок

Березкин Д.В.

Определение понятия «ошибка в программе» 1

Классификация ошибок по месту их возникновения 2

Классификация ошибок с точки зрения тестировщика 12

Классификация ошибок по степени их критичности 13

Классификация ошибок в зависимости от их места в жизненном цикле программного изделия 14

Классификация программных ошибок (багов) с точки зрения субъективного восприятия их программистами 15

Некоторые выводы 16

Литература 16

В качестве введения рассмотрим определения понятия «ошибка». Начнем с наиболее общего трактования этого понятия применительно к некоторым техническим системам.

По определению стандарта ISO 9241-13 [1] ошибка это – несоответствие между целями пользователя и ответом системы.

Определение, приведенное в работе [2], предполагает, что ошибка вызвана не сложностью задачи, а сложностью орудия (напр., компьютерной системы), поэтому она является не ошибкой пользователя, а ошибкой разработчиков этого орудия.

Далее рассмотрим более частные определения, непосредственно связанные с компьютерными программами.

Определение понятия «ошибка в программе»

В самом общем случае под ошибкой понимается какой-то сбой в программе на этапе ее выполнения.

Ошибкой (или так называемым багом) можно назвать недокументированные или нежелательные, "побочные" реакции программы на те или иные действия пользователя равно как и при использовании ее одновременно с другим программами или на другой аппаратной платформе.

Майерс дает такое нестрогое определение: «Если программа не делает того, чего пользователь от нее вполне обосновано ожидает, значит налицо программная ошибка» [3].

Автор работы [4] настаивает на субъективном характере программных ошибок: «Не существует ни абсолютного определения ошибок, ни точного критерия наличия их в программе. Можно лишь сказать, насколько программа не справляется со своей задачей, - это исключительно субъективная характеристика».

Канер с соавторами [5] указывают, что определение ошибок как расхождение между программой и ее спецификацией - не верно. Они исходят из того, что даже точно соответствующая спецификации программа содержит ошибки в том случае, если есть ошибки и в самой спецификации.

В книге [6] приводится такое определение программных ошибок: "Говоря простыми словами, программная ошибка - не что иное, как изъян в разработке программного продукта, который вызывает несоответствие ожидаемых результатов выполнения программного продукта и фактически полученных результатов. Дефект может возникнуть на стадии кодирования, на стадии формулирования требований или на стадии проектирования, либо же его причина может крыться в некорректной конфигурации или данных. Дефектом может быть также что-то другое, что не соответствует ожиданиям заказчика и что может быть, а может и не быть определено в спецификации программного продукта".

Классификация ошибок по месту их возникновения

Классификация ошибок в книге [5] дается по месту их возникновения. В главе 4 приводится краткая классификация ошибок и в Приложении – более полная, которая, на мой взгляд, не имеет строгих принципов и является скорее перечнем возможных ошибок, чем их классификацией. Авторы исходят из того, что главным критерием программы должно быть ее качество, которое трактуется как отсутствие в ней недостатков, а также сбоев и явных ошибок. Недостатки программы зависят от субъективной оценкой ее качества потенциальным пользователем. При этом авторы скептически относятся к спецификации и утверждают, что даже при ее наличии, выявленные на конечном этапе недостатки говорят о ее низком качестве. При таком подходе преодоление недостатков программы, особенно на заключительном этапе проектирования, может приводить к снижению надежности. Очевидно, что для разработки ответственного и безопасного программного обеспечения (ПО) такой подход не годится, однако проблемы наличия ошибок в спецификациях, субъективного оценивания пользователем качества программы существуют и не могут быть проигнорированы. Должна быть разработана система некоторых ограничений, которая бы учитывала эти факторы при разработке и сертификации такого рода ПО. Для обычных программ все проблемы, связанные с субъективным оцениванием их качества и наличием ошибок, скорее всего неизбежны.

В краткой классификации выделяются следующие ошибки.

Ошибки пользовательского интерфейса.

Функциональность.

Взаимодействие программы с пользователем.

Организация программы.

Пропущенные команды.

Производительность.

Выходные данные.

Обработка ошибок.

Ошибки, связанные с обработкой граничных условий.

Ошибки вычислений.

Начальное и последующие состояния.

Ошибки управления потоком.

Ошибки передачи или интерпретации данных.

Ситуация гонок.

Перегрузки.

Аппаратное обеспечение.

Контроль версий.

Документация.

Ошибки тестирования.

Подробная классификация с небольшой правкой и моими комментариями приведена ниже.

Ошибки пользовательского интерфейса.

Многие из них субъективны, т.к. часто они являются скорее неудобствами, чем «чистыми» логическими ошибками. Однако они могут провоцировать ошибки пользователя программы или же замедлять время его работы до неприемлемой величины. В результате чего мы будем иметь ошибки информационной системы (ИС) в целом. Основным источником таких ошибок является сложный компромисс между функциональностью программы и простотой обучения и работы пользователя с этой программой. Проблему надо начинать решать при проектировании системы на уровне ее декомпозиции на отдельные модули, исходя из того, что вряд ли удастся спроектировать простой и удобный пользовательский интерфейс для модуля, перегруженного различными функциями. Кроме того, необходимо учитывать рекомендации по проектированию пользовательских интерфейсов, например [7]. В этой книге приводятся простые модели проверки качества интерфейса, которые можно использовать на стадии его проектирования. На этапе тестирования ПО полезно предусмотреть встроенные средства тестирования, которые бы запоминали последовательности действий пользователя, время совершения отдельных операций, расстояния перемещения курсора мыши. Кроме этого возможно применение гораздо более сложных средств психо-физического тестирования на этапе тестирования интерфейса пользователя, которые позволят оценить скорость реакции пользователя, частоту этих реакций, утомляемость и т.п. Необходимо отметить, что такие ошибки очень критичны с точки зрения коммерческого успеха разрабатываемого ПО, т.к. они будут в первую очередь оцениваться потенциальным заказчиком.

Ошибки функциональности.

«Если с помощью программы трудно, неудобно или невозможно выполнить что-то, чего может обоснованно ожидать от нее пользователь, значит, в ней имеется функциональная ошибка». Очень расплывчатое определение, хотя возможно, что и верное. Как уже отмечалось, авторы книги [5] предполагают наличие ошибок в спецификации программы. Авторы подразделяют ошибки функциональности, однако трудно провести грань между функциональными и другими видами ошибок.

Избыточная функциональность. В программе слишком много функций, поэтому она сложна в изучении и эксплуатации. Не хватает концептуального единства. Второстепенные функции осложняют доступ к базовым возможностям. Программа часто теряет производительность. Документация на систему слишком обширна и ею невозможно пользоваться. Мне кажется, что часть такого рода ошибок пересекаются с ошибками интерфейса.

Ложное впечатление о наборе функций продукта. Связано в первую очередь с ошибками или низким качеством документации. Сюда же можно отнести не документируемые функции программы и закладки. Очень важный пункт с точки зрения безопасного ПО: необходимо обеспечить строгое соответствие описания программы и ее функций.

Неадекватность реализации базовых функций. Функция реализована так, что не годится для эксплуатации. Сюда относятся вопросы недостаточной производительности.

Пропущенная функция. В программе не реализована функция, предусмотренная спецификацией.

Неверно работающая функция. Функция работает не так, как предусмотрено спецификацией.

Функция должна быть реализована пользователем. Пользователь должен сам что-то сделать, чтобы функция заработала. Для некоторых программ такой режим предусматривается и не может, на мой взгляд, считаться ошибкой.

Программа не делает того, что ожидает от нее пользователь. Причина таких ошибок кроется в недостатках спецификации программы. С этими ошибками нужно бороться на этапе проектирования ПО. Для ответственного ПО необходимо потребовать безошибочность спецификаций. Как этого добиться – сложный вопрос. Во всяком случае, для достижения высококачественного кодирования нужно исходить из того, что спецификации программ не содержат ошибок, иначе совершенно не ясно как это обеспечить и проконтролировать.

Взаимодействия программы и пользователя. Их появление возможно как в интерактивном, так и в пакетном режимах.

Пропущенная информация. Сюда относятся типичные ошибки интерфейса: ошибки в подсказках, в перечне возможных команд, отсутствие справочной информации и т.п., отсутствие индикации курсора или признаков активности выполнения программы, открытия документов. Сюда необходимо отнести ошибки, когда пользователю не выдана, предусмотренная спецификацией информация, но почему-то именно этот случай не отражен в работе [5]. Для некоторых видов ПО подобная ошибка может быть весьма критичной (например, если не отражена информация о наступлении важного события, аварии в системе и т.п.).

Неверная или смущающая пользователя информация. Даже незначительные ошибки подрывают доверие пользователя к программе. На основании этих ошибок, а также при недостаточно подробных сообщениях пользователь может сделать неверные выводы, которые могут иметь серьезные последствия для системы в целом. В этом разделе авторы анализируют сообщения программ об ошибках. Сюда же относятся такие интерфейсные ошибки, как неудачные пиктограммы, названия кнопок и функций, несколько разных названий для одной и той же функции. Избыточность документации, попытка переложить на пользователя проблемы, которые должны решить программисты.

Справочная система и сообщения об ошибках. Текст в электронном виде должен быть не сложнее, чем на бумаге (максимальный уровень сложности 5). Текст должен быть написан простым языком, сообщения программ должны быть в утвердительной форме, краткими и простыми, содержать минимум технических терминов. Нужно избегать неуместной эмоциональности и слов, которые могут напугать пользователя. Документация не должна содержать ошибок и неверных примеров. Контекстно-зависимые справочные системы и подсистемы обработки ошибок должны проверять, что делает программа в момент их вызова. Неправильное определение источника ошибки в сообщении, должны указываться причина ошибки и способ выхода из ситуации.

Представляется целесообразным выделение рубрики «Ошибки документации и сообщений программы» в самостоятельный раздел. Этот раздел не связан непосредственно с кодом программ (по крайней мере, с его функциональной частью) и процессом кодирования. Поскольку язык технической документации является строгим, основные понятия должны быть строго определены, их полисемия исключена, возможно применение методов автоматической обработки текстов и достижение при этом весьма высокого качества.

Ошибки отображения. Данные отражаются формально правильно, но в каком-то неестественном виде, два курсора (забыли стереть курсор в предыдущем фокусе ввода), курсор исчезает или отображается не в том месте, недоочищена часть экрана, не выделены активные элементы экрана, не снято выделение, отображена неверная или неполная строка, сообщение остается на экране слишком долго или исчезает слишком быстро. В этот пункт следовало бы добавить ошибки, связанные с появлением информации, не предусмотренной спецификацией, ошибки в форматах или размерности некоторых полей, выдачу информации (или части сообщений) конфиденциального характера пользователем, не имеющим соответствующих прав.

Организация экрана. Плохая структурированность информации на экране, неэстетическое оформление экрана, неудачная организация меню, ошибки организации диалоговых окон, труднонаходимые конструкции, неуместное использование мигания, пестрые цветовые сочетания, использование цветов в качестве смыслового интерфейса, невозможность избавиться от избыточной информации на экране – все это «ошибки интерфейса».

Организация команд и способы их ввода. Рассматриваются различные несоответствия. Неуместная оптимизация, непоследовательный синтаксис, неодинаковый стиль ввода команд, нелогичные сокращения команд, непоследовательные правила завершения ввода, несоответствие опций для различных команд, похожие названия для различных команд, непоследовательная интерпретация регистра, неодинаковое положение команды в меню, неодинаковое использование функциональных клавиш, непоследовательные правила обработки ошибок, непоследовательные правила редактирования или сохранения данных.

Потери времени. Имеются в виду потери времени из-за неудачного интерфейса программы.

Меню. Меню должны быть простыми и логичными, поэтому все недостатки меню можно считать ошибками программы или же потенциальным источником ошибок при эксплуатации программного изделия.

Командные строки. В некоторых случаях ввод команд может быть предпочтительнее выбора из меню. Речь идет о чисто интерфейсных вещах: учет регистра в командах может приводить к ошибкам, соблюдение единого порядка параметров в командах, не распознаются полные имена в командах, не допускаются сокращения, сложная команда в одной строке, отсутствие возможности пакетного ввода, отсутствие возможности редактирования команд.

Нестандартное использование клавиатуры. Рассматриваются различные неудобства пользователя, приводящие к его ошибкам, связанные с отсутствием возможности использовать клавиши, их непривычное использование, возможность осуществить ввод недопустимых символов, отсутствие индикаторов состояния клавиатуры, отсутствие реакции на управляющие клавиши.

Пропущенные команды. Ошибки связаны с невозможностью или с существенными трудностями пользователя при изменениях состояния программы. Сюда входят ошибки, связанные с невозможностью выйти из какой-то программы или из какого-то режима, прервать или приостановить выполнение программы, отсутствие возможности резервного копирования (по-моему, это в первую очередь функциональная ошибка), отсутствие команды отмены, отсутствие запросов на подтверждение команд для некоторых ответственных операций, отсутствие режима автоматического периодического сохранения данных (по-моему, это также функциональная ошибка).

Обработка ошибок пользователем. Не предусмотрены пользовательские проверки вводимых данных (по-моему, это в первую очередь функциональная ошибка), сложно исправить допущенную ошибку, не предусмотрена возможность записи комментариев (по-моему, это можно считать как функциональной ошибкой, так и ошибкой в интерфейсе в зависимости от того, что представляет собой этот комментарий), отсутствуют средства отображения связей между переменными.

Разное. Очень эклектичный раздел. Сюда входят ошибки, связанные с защитой информации (неадекватные средства защиты и избыточная защита), которые необходимо выделить в самостоятельный раздел. Невозможность спрятать меню (недостаток интерфейса), отсутствие поддержки стандартных функций операционной системы, отсутствие поддержки длинных имен файлов (функциональные ошибки).

Негибкость программы. В разделе рассматриваются возможные проблемы настройки пользовательского интерфейса программы. Отмечается, что негибкость программы – это не всегда недостаток, т.к. программы с простым фиксированным интерфейсом как правило более просты в изучении и в эксплуатации. Выделяются следующие виды ошибок: невозможность отключить звук, отсутствие переключателя учета регистра, несовместимость с аппаратным обеспечением (по-моему, не из этого раздела), игнорирование инициализации устройств, выполненной извне (имеется в виду, что программа не может выполнить настройки конкретного оборудования, а только посылает какой-то ограниченный набор команд (по-моему, не из этого раздела), не предусмотрено отключение функции автоматического сохранения, невозможность замедлить (ускорить) прокрутку текста, отсутствие возможности повторить последнее действие или выяснить, каким оно было, невозможно выполнить только что настроенную команду, не сохраняются настроенные параметры программы (мне кажется, что это функциональный недостаток, причем возможна ситуация, когда настройка некоторых параметров пользователем невозможна по соображениям безопасности), побочные эффекты настройки, излишне высокая степень настраиваемости.

Кто здесь главный? В этом пункте авторы работы [5] опять возвращаются к ошибкам в сообщениях программ и недостаткам команд. Получился как бы еще один раздел «Разное», который включает следующие ошибки: навязывание ненужных ограничений, дружественность к новичкам, создающая неудобства для опытных пользователей, навязчивая предупредительность и неудачная попытка сделать программу интеллектуальной, запрос информации без необходимости, ненужное повторение действий, ненужные ограничения.

Производительность. Авторы отмечают существование нескольких трактовок этого понятия: 1) скорость программы, 2) производительность работы пользователя, 3) субъективное восприятие пользователем характеристик производительности программы. В связи с этим возможна ситуация, когда высокоскоростная программа с неудачным пользовательским интерфейсом кажется медленнее, чем на самом деле. Какая-то логика в этом безусловно есть, но представляется более правильным разделить производительность программы при решении ее основных функциональных задач, которая в большинстве случаев не зависит от пользователей и может быть точно замерена, и производительность непосредственно интерфейса. При всей субъективности этой характеристики она может быть оценена на стадии разработки интерфейса, а затем и измерена специальными средствами.

В разделе выделяются следующие подразделы: низкоскоростная программа (ошибки проектирования и кодирования), задержка реакции на действия пользователя, большое время ответа, программа не распознает ввод, отсутствие предупреждений о длительных операциях, отсутствие индикаторов хода работы, проблемы тайм-аутов (здесь речь идет об искусственных ограничениях времени ввода данных или паузах при совершении каких-то действий), надоедливая программа, избыточная информация, передавая по медленным сетям (проблема рассматривается только с точки зрения интерфейса пользователя, хотя проблема должна решаться при проектировании системы в целом). Далее приводятся ряд ошибок, которые явно не из этого раздела: выходная информация должна быть полной и понятной пользователю, невозможно получить определенные данные, невозможно перенаправить вывод, формат, неподходящий для дальнейшей обработки (речь идет об ошибках в программных интерфейсах, явно напрашивается вывод - выделить их в раздел: «Ошибки взаимодействия программ»), слишком мало или слишком много выходной информации, абсурдная степень точности, невозможность форматирования заголовков таблиц и подписей рисунков, невозможность изменения масштаба графиков. Необходимо отметить, что последние 2 пункта являются слишком частными, поэтому вызывает сомнение необходимость включать настолько частные ошибки в общую классификацию.

Авторы работы [5] подчеркивают, что вопросы производительности нельзя рассматривать без учета работы пользователя, поэтому выделяются такие «узкие места», как: все, что повышает вероятность ошибок пользователя, громоздкая схема исправления ошибок, все, что ставит пользователя в тупик, неоправданное увеличение количества действий, необходимых для достижения определенного результата.

Обработка ошибок.

Предотвращение ошибок. Программа должна быть защищена от недопустимого ввода и неправильной эксплуатации. Должна быть предусмотрена проверка вводимых данных. Можно использовать методы аппаратного обнаружения и исправления ошибок.

Выделяются подпункты:

неверное начальное состояние;

неадекватная проверка пользовательского ввода;

неадекватная защита от испорченных данных;

не выполнена проверка переданных параметров;

недостаточная защита от ошибок операционной системы;

не выполняется проверка версии;

недостаточная защита от неправильного использования («защита от дурака»).

Выявление ошибок. Программа должна контролировать правильность данных.

Выделяются подпункты:

переполнение;

невозможные значения;

непроверенные данные;

флаги ошибок;

аппаратные сбои;

сравнение данных;

восстановление после ошибок;

автоматическое исправление ошибок;

отсутствие сообщения об ошибке;

не установлен флаг ошибки;

куда возвращается управление? (Ошибки передачи управления после сбоя);

прекращение выполнения программы из-за ошибки. Имеются в виду возможные ошибки из-за не корректной обработки такой ситуации;

обработка аппаратных отказов;

ну нет у меня нужного диска! Программа должна предусматривать какой-то выход из ситуации, когда пользователь не в состоянии выполнить требуемое действие.

Ошибки, связанные с граничными условиями.

Выделяют следующие типы таких ошибок:

неправильная обработка граничного значения;

неверное граничное условие;

неправильная обработка данных, не соответствующих граничным условиям.

Выделяются следующие подпункты:

числовые ограничения;

ограничения на равенство;

количественные ограничения;

пространственные ограничения;

ограничения времени (имеются в виду вопросы, связанные с поведением системы на границах заданных в программе временных интервалов);

условия циклов;

ограничения объема памяти;

ограничения, связанные со структурой данных;

ограничения, связанные с аппаратным обеспечением;

невидимые границы.

Раздел представляется очень эклектичным. Напрашивается вывод о вынесении ошибок, связанных с циклами, использованием памяти, ошибок в структурах данных в отдельные разделы. Представляется, что наличие того или иного ограничения не может являться главным критерием классификации. Также все ошибки, связанные с аппаратным обеспечением должны быть собраны в отдельном разделе и там структурированы.

Ошибки вычислений.

Авторы работы [5] выделяют следующие причины возникновения таких ошибок:

неверная логика (может быть следствием, как ошибок проектирования, так и кодирования);

неправильно выполняются арифметические операции (как правило – это ошибки кодирования);

неточные вычисления (могут быть следствием, как ошибок проектирования, так и кодирования). Очень сложная тема, надо выработать свое отношение к ней с точки зрения разработки безопасного ПО.

Выделяются подпункты:

устаревшие константы;

ошибки вычислений;

неверно расставленные скобки;

неправильный порядок операторов;

неверно работает базовая функция;

переполнение и потеря значащих разрядов;

ошибки отсечения и округления;

путаница с представлением данных;

неправильное преобразование данных из одного формата в другой;

неверная формула;

неправильное приближение.

Начальное и последующие состояния (Ошибки инициализации).

Представляется не очень обоснованным их выделение в самостоятельный раздел, хотя они важны.

Выделяются подпункты:

не присвоены начальные значения;

не инициализирована переменная, управляющая циклом;

не инициализирован указатель;

не очищена строка;

не инициализированы регистры;

не сброшен флаг;

данные должны были инициализироваться в другом месте;

не выполнена повторная инициализация;

предположение (не верное), что данные не были инициализированы;

путаница со статическими и динамическими переменными;

не предполагавшаяся модификация данных, выполняемая другими подпрограммами;

ошибочная инициализация;

зависимость от инструментальных средств, которых может не быть.

Ошибки управления потоком.

В этот раздел относится все то, что связано с последовательностью и обстоятельствами выполнения операторов программы.

Выделяются подпункты:

очевидно неверное поведение программы;

переход по GOTO;

логика, основанная на определении вызывающей подпрограммы;

использование таблиц переходов;

выполнение данных (вместо команд). Ситуация возможна из-за ошибок работы с указателями, отсутствия проверок границ массивов, ошибок перехода, вызванных, например, ошибкой в таблице адресов перехода, ошибок сегментирования памяти;

переход к подпрограмме, которая отсутствует в памяти. Ошибки связаны с ошибками в организации оверлейных программ;

реентерабельность. Реентерабельная программа может вызывать сама себя или быть вызвана несколькими параллельными процессами одновременно. Такая возможность может не поддерживаться языком программирования. Если она поддерживается, то нужно обеспечить защиту данных, используемых одним процессом, от их модификации другим;

путаница имен переменных и команд;

неверное предположение о состоянии программы или данных после вызова;

обработка ошибок выполнения процедур (имеются в виду ошибки, когда программист не предусмотрел такую обработку);

возврат не в ту точку кода (сюда включены несколько видов ошибок: испорченный стек, переполнение и выход за нижнюю границу стека, выход из подпрограммы по GOTO вместо RETURN);

прерывания (сюда включены несколько видов ошибок: неверная таблица прерываний, ошибки, связанные с модификацией программами таблицы прерываний, ошибки, связанные с блокированием прерываний, неудачное возобновление работы программы после прерывания);

завершение работы программы;

«зависание» компьютера;

синтаксические ошибки, сообщения о которых отображаются во время выполнения программы (имеются в виду программы, написанные на интерпретируемом языке программирования);

ожидание невозможных условий или комбинаций условий (примерами таких ошибок являются: проблемы ввода/вывода, взаимная блокировка, простая логическая ошибка в условиях);

неверный приоритет пользователя или процесса;

циклы (сюда включены несколько видов ошибок: бесконечный цикл, неверное начальное значение переменной управления циклом, случайное изменение переменной управления циклом, ошибочный критерий выхода из цикла, команды, которые должны или не должны выполняться внутри цикла, ошибка вложенности циклов);

условные операторы (Сюда включены несколько видов ошибок: неправильное сравнение, неверные результаты сравнений, условный оператор не учитывает модификации программы, ошибки сравнения значений переменных с плавающей точкой из-за округлений, спутаны логические операторы, присваивание вместо сравнения, ошибки в использовании конструкции THRN/ELSE, команды, которые не входят ни в одно из предложений, не проверен флаг, не сброшен флаг. Кроме этого в этом же подразделе рассматривается сложный условный оператор, содержащий многочисленные варианты ветвления. В этом случае возможны следующие ошибки: пропущен блок, выполняемый во всех остальных случаях, неверно определены действия для всех остальных случаев, пропущенные варианты, требуется подразделение одного варианта на несколько, пересекающиеся условия, неверные условия и невозможные случаи).

Ошибки обработки или интерпретации данных.

Выделяются подпункты:

проблемы при передаче данных между подпрограммами (сюда включены несколько видов ошибок: параметры указаны не в том порядке или пропущены, несоответствие типов данных, псевдонимы и различная интерпретация содержимого одной и той же области памяти, неправильная интерпретация данных, неадекватная информация об ошибке, перед аварийным выходом из подпрограммы не восстановлено правильное состояние данных, устаревшие копии данных, связанные переменные не синхронизированы, локальная установка глобальных данных (имеется в виду путаница локальных и глобальных переменных), глобальное использование локальных переменных, неверная маска битового поля, неверное значение из таблицы);

границы расположения данных (сюда включены несколько видов ошибок: не обозначен конец нуль-терминированной строки, неожиданный конец строки, запись/чтение за границами структуры данных или ее элемента, чтение за пределами буфера сообщения, чтение за пределами буфера сообщения, дополнение переменных до полного слова, переполнение и выход за нижнюю границу стека данных, затирание кода или данных другого процесса);

проблемы с обменом сообщений (сюда включены несколько видов ошибок: отправка сообщения не тому процессу или не в тот порт, ошибка распознавания полученного сообщения, недостающие или несинхронизированные сообщения, сообщение передано только N процессам из N+1, порча данных, хранящихся на внешнем устройстве, потеря изменений, не сохранены введенные данные, объем данных слишком велик для процесса-получателя, неудачная попытка отмены записи данных).

Ситуация гонок.

Выделяются подпункты:

гонки при обновлении данных;

предположение, что одно задание завершится до начала другого;

предположение, что в течение определенного короткого интервала времени не будет ввода данных;

предположение, что в течение определенного короткого интервала времени не будет прерываний;

ресурс только что стал недоступен;

предположение, что человек, устройство или процесс ответят быстро;

реальный набор опций в процессе перерисовки экрана;

задание начинается до того, как выполнены подготовительные действия;

сообщения приходят одновременно или не в том порядке, в котором они были отправлены.

Повышенные нагрузки.

При повышенных нагрузках или нехватке ресурсов могут возникнуть дополнительные ошибки. Выделяются подпункты:

требуемый ресурс недоступен;

не освобожден ресурс;

нет сигнала об освобождении устройства;

старый файл не удален с накопителя;

системе не возвращена неиспользуемая память;

лишние затраты компьютерного времени;

нет свободного блока памяти достаточного размера;

недостаточный размер буфера ввода или очереди;

не очищен элемент очереди, буфера или стека;

потерянные сообщения;

снижение производительности;

повышение вероятности ситуационных гонок;

при повышенной нагрузке объем необязательных данных не сокращается;

не распознается сокращенный вывод другого процесса при повышенной загрузке;

не приостанавливаются задания с низким приоритетом;

задания с низким приоритетом вообще не выполняются.

В этом разделе хотелось бы обратить внимание на следующее:

1) Часть ошибок из этого раздела могут проявляться и при не очень высоких нагрузках, но, возможно, они будут проявляться реже и через более длительные интервалы времени;

2) Многие ошибки из 2-х предыдущих разделов уже в своей формулировке носят вероятностный характер, поэтому следует предположить возможность использования вероятностных моделей и методов для их выявления.

Аппаратное обеспечение.

В разделе рассматриваются ошибки взаимодействия программного и аппаратного обеспечения. Выделяются подпункты:

неверное устройство;

неверный адрес устройства;

устройство недоступно;

устройство возвращено не в тот пул;

данному пользователю или программе использование устройства запрещено;

данный уровень привилегий не позволяет получить доступ к устройству;

шумы;

прерывание связи;

проблемы тайм-аута;

неверный накопитель;

не проверяется содержимое текущего диска;

не закрыт файл;

неожиданный конец файла;

ошибки, связанные с длиной файлов и дисковыми секторами;

неверный код операции или команды;

неверно интерпретирован код состояния или возврата;

ошибка протокола обмена с устройством;

неполное использование возможностей устройства;

игнорирование или неправильно используется механизм страничного управления памятью;

игнорирование ограничений канала;

предположения о наличии или отсутствии устройства или его инициализации;

программируемые функциональные клавиши.

Необходимо отметить, что в качестве моделей ошибок данного раздела подойдут вероятностные модели. Оправдано моделировать ошибки программы и аппаратуры совместно.

Контроль версий и идентификаторов.

Выделяются подпункты:

таинственным образом появляются старые ошибки;

обновление не всех копий данных или программных файлов;

отсутствие заголовка;

отсутствие номера версии;

неверный номер версии в заголовке экрана;

отсутствующая или неверная информация об авторских правах;

программа, скомпилированная из архивной копии, не соответствует проданному варианту;

готовые диски содержат неверный код или данные.

Ошибки тестирования.

Являются ошибками сотрудников группы тестирования, а не программы. Выделяются подпункты:

пропущенные ошибки в программе;

не замечена проблема (отмечаются следующие причины этого: тестировщик не знает, каким должен быть правильный результат, ошибка затерялась в большом объеме выходных данных, тестировщик не ожидал такого результата теста, тестировщик устал и невнимателен, ему скучно, механизм выполнения теста настолько сложен, что тестировщик уделяет ему больше внимания, чем результатам);

пропуск ошибок на экране;

не документирована проблема (отмечаются следующие причины этого: тестировщик неаккуратно ведет записи, тестировщик не уверен в том, что данные действия программы являются ошибочными, ошибка показалась слишком незначительной, тестировщик считает, что ошибку не будет исправлена, тестировщика просили не документировать больше подобные ошибки);

не выполнен запланированный тест (отмечаются следующие причины этого: тестовые материалы и записи плохо организованы, тестировщику скучно выполнять однотипные примеры, в одном тесте объединено слишком много действий);

не описаны временные зависимости появления ошибок;

слишком сложный тест (не позволяет ошибку и добиться ее воспроизведения);

преувеличения;

личные выпады.

Ошибка выявлена и забыта.

Описываются ошибки использования результатов тестирования. По-моему, раздел следует объединить с предыдущим. Выделяются подпункты:

не составлен итоговый отчет;

серьезная проблема не документирована повторно;

не проверено исправление;

перед выпуском продукта не проанализирован список нерешенных проблем.

Необходимо заметить, что изложенные в 2-х последних разделах ошибки тестирования требуют для устранения средств автоматизации тестирования и составления отчетов. В идеальном случае, эти средства должны быть проинтегрированы со средствами и технологиями проектирования ПО. Они должны стать важными инструментальными средствами создания высококачественного ПО. При разработке средств автоматизированного тестирования следует избегать ошибок, которые присущи любому ПО, поэтому нужно потребовать, чтобы такие средства обладали более высокими характеристиками надежности, чем проверяемое с их помощью ПО.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]