Содержание курса
МДК.01.02 Поддержка и тестирование программных модулей
Содержание урока:

Категории программных ошибок

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

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

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

Рассмотрим 13 категорий ошибок в ПО, которые охватывают все возможные варианты:

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

Функциональность (если задачу, которая предусмотрена программой, трудно выполнить, она решается «криво» или при каких-либо обстоятельствах вовсе может быть решена):
• а. В программе нет функций, описанной в спецификации или очевидно необходимой функции;
• b. функция программы должна делать одно (как правило, описанное в спецификации), а выполняет что-то другое.

Взаимодействие программы с пользователем (UI, UX). Насколько трудно пользователю понять, как работать с ПО ? Есть ли подсказки на экране ? Понятны ли они ? Есть ли в программе справка и полезна ли она ? Насколько корректно программа показывает пользователю его ошибки и поясняет, как их исправлять ? Есть ли в программе элементы, которые могут вызвать раздражение пользователя ?
а. Нет названия программы;
b. Нет индикатора оставшегося времени обработки задания;
c. После выбора пользователем определенного режима или команды на экране остается информация предыдущего режима, большая часть которой — излишняя или не относится к делу;
d. Ошибки в правописании;
e. Одна и та же функция не может иметь несколько значений: либо «ОК», либо «Сохранить» — надо выбирать;
f. В сообщениях об ошибках не должно быть восклицательных знаков, слов «авария», «сбой», «нарушение», «потеря данных», шрифта красного цвета;
g. Сообщение об ошибке должно быть информативным: содержать причину и способ решения. Сообщения типа «ERROR 010» — недопустимы;
h. Не выделены активные элементы экрана.

Организация программы. Легко ли потеряться в вашей программе ? Нет ли похожих или одинаковых команд ? Какие ошибки чаще всего совершает юзер ? На что тратится больше всего времени и по какой причине ? 
a. Плохое меню: связанные команды должны быть объединены в одну группу. Группы должны четко отделяться друг от друга;
b. Диалоговые окна должны появляться в одном и том же месте дисплея, а их текст должен иметь одинаковый шрифт и выравнивание. Заголовок окна должен отображать название команды, которая его открыла. Поля ввода и выбора должны иметь одинаковое выравнивание;
c. Гармоничное сочетание цветов;
d. Предсказуемость поведения программы при возникновении ошибки. Программа не должна внезапно завершаться, перезапускаться, выдавать белый экран;
e. В меню не должно быть невозможных для выполнения команд. На экране будет написано: «Для получения справки нажмите <F1>» — а когда пользователь нажмет на эту клавишу, которая скажет: «К сожалению, справка по данной теме отсутствует»;
f. Множество путей к одному и тому же месту. Если создается ощущение, что в программе можно откуда захочешь попасть куда угодно, значит ее внутренняя структура требует реорганизации. Также эта ситуация чревата «тухлыми ссылками», если тестируемая программа — веб сайт.

Пропущенные команды. Чего в программе не хватает ? Нет ли у некоторых действий странных или неэффективных способов ? Допускается ли хотя бы небольшая настройка ? 
a. Пользователь должен иметь возможность отменить последнее действие;
b. Пользователь должен иметь возможность прервать текущее задание и вернуться к начальному состоянию;
c. При удалении больших объемов данных ПО обязательно должно спрашивать у пользователя подтверждение действий;
d. Средства защиты программы не должны быть навязчивыми;
e. При ошибке в середине длинной последовательности действий некоторое ПО заставляет юзера все повторить сначала.

Производительность. Важный момент в интерактивном ПО — скорость. Есть ли у пользователя впечатление, что ПО функционирует медленно, с большой задержкой реакции ?
a. Низкая скорость работы ПО;
b. Медленное отображение вводимых данных: заторможенное перемещение курсора, голосовой ввод;
c. Программа, которая занята другими приложениями, не распознает ввод текста. Надо, чтобы программа запоминала вводимые данные и отображала их чуть позже;
d. Надоедливые напоминания и вопросы вроде: «Диск заполнен на 89%. Пожалуйста, освободите место»;
e. Длинное меню и красивые картинки должны мгновенно прорисовываться.

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

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

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

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

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

Числовые значения. У треугольника ровно 3 стороны, сумма его углов равна 180 градусам. В одном байте могут храниться значения от 0 до 255;

Количественные ограничения. Длина строки — 80 символов. Что произойдет при вводе 79, 80, 81;

Пространственные ограничения. Программа выводит график в прямоугольнике определенного размера. Что произойдет, если в одну из точек графика нарисовать вне прямоугольника ?

Ограничения времени. Допустим, есть 30 секунд для ответа на телефонный звонок. Через 30 секунд телефон перестает звонить, и вызов перенаправляется оператору. Что произойдет, если трубку снимут на 30 секунде ?

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

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

Даже самые простые арифметические операции всегда чреваты ошибками.
Самые распространенные — ошибки округления.
• Выполнение сложения место вычитания;
• Выражения с большим количеством скобок;
• Неправильный порядок операторов;
• Переполнение и потеря значащих разрядов;
• Ошибки отсечения и округления;
• Неверная формула.

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

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

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

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

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

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

Ее сложно не заметить: в худшем случае в работе программы будет сбой.
«Зависание» компьютера. Причина: бесконечные циклы, бесконечное ожидание ответа какого-либо устройства;
Завершение работы программы.
Неверно определены действия для всех остальных случаев. Предположим, программист полагает что переменная VAR может принимать только четыре значения. Он явно указывает три из них, а четвертое обрабатывает как «остальные». Но будут ли запрограммированные на этот случай действия правильными, если переменная примет пятое или шестое значение ? 
Установленные условия проверок не должны пересекаться.
Неверно заданные условия проверки. Программа выполняет Задание_16, только когда (VAR < 6) AND (VAR > 18). Это означает, что Задание_16 не выполняется никогда.

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

Модули могут передавать данные между собой или другим программам множество раз, и в какой-то момент они могут быть потеряны или неправильно интерпретированы. Изменения, которые внесены одной частью программы, могут потеряться или достичь не всех частей программы, где они имеют важность.
Неправильная интерпретация данных. Программа передает подпрограмме температуру по Цельсию, а та интерпретирует ее по Фаренгейту;
Неадекватная информация об ошибке. Столкнувшись с ошибкой, программа не установила ее флаг. Или выдала сигнал ошибки без сопутствующей информации, в результате чего вызывающая программа не может знать, как ее обработать;
Затирание кода другого процесса. Может возникнуть в случае, когда два процесса имеют доступ к одной и той же области памяти;
Не сохранены введенные данные. Запрошенные у пользователя данные не сохраняются программой. Причина: недоступность файла, в котором должна сохраняться эта информация.

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

Классическая ситуация гонок описывается так: с системе ожидаются два события, А и Б. Первым может произойти любое из них. Но если первым происходит событие А, программа выполнение продолжает, а если Б, то происходит сбой.

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

Гонки пои обновлении данных. Клиент банка получил $500 и потратил $100, а до этого на его счете было $1000. Первая процедура считала с диска остаток в $1000 и вычла из него $100. До того, как она записала результат на диск, вторая процедура считала остаток и добавила к нему $500. Затем первая процедура записала свой результат, а вторая — свой. В результате вместо $1400 остаток получился равным $1500.

9. Перегрузки

ПО не удается справиться с повышенными нагрузками. Например, программа может не выдерживать работу с большим объемом данных. Сбои Могут возникать из-за нехватки памяти или других нужных ресурсов. У каждой программы свои пределы. Вопрос в том, соответствует ли реальные возможности и требования программы к ресурсам ее спецификации, и как программа себя поведет при перегрузках.
• Требуемый ресурс недоступен (диск или стек полон, очередь печати заполнена, в принтере нет ленты);
• Потеря информации о нажатых клавишах из-за недостаточного размера буфера ввода или очереди.

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

Программы могут запрашивать у устройств неверные данные, игнорировать их сообщения об ошибках, пытаться воспользоваться занятыми или отсутствующими устройствами. Программа не должна «глючить» при попытке обращения к устройствам.
• Неверный адрес устройства;
• Устройство недоступно;
• Данной программе или устройству доступ к устройству запрещен.

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

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

Также надо убедиться, что корректны все сообщения об авторских правах, названии и номере версии ПО. Контроль программы и исходного кода обычно производит группа контроля качества.
• В программе всплывают старые ошибки, которые раннее были устранены (программист собрал старую версию одной программы с новыми версиями остальных);
• Ошибка, которую исправили в одном месте, обнаружилась в другом (программист применял один и тот де код в нескольких модулях. В одном месте изменил, а про другие — забыл);
• Неверный номер версии программы в заголовке экрана.

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

Документация — это часть программного продукта. Если она плохо написана, у пользователя может появится мысль, что и сама программа не лучше.

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

Если программист допускает по полторы ошибки на каждую строку программного кода, то сколько их допускает тестировщик на каждый тест ?

Поиск ошибок, которые допустили тестировщики — дело обычное. Бывают случаи, что и ошибки тестировщика указывают на проблемы пользовательского интерфейса: если программа вынуждает пользователя совершать ошибки, то с ней что-то не так.

Конечно, множество ошибок тестирования обусловлены неверными тестовыми данными.
• Пропущены ошибки в программе. После этого надо улучшить процедуру тестирования;
• Не задокументирована ошибкапроблема;
• Не выполнен запланированный тест;
• Не обратили внимание на предложения программистов — программист знает, что писалось в спешке, какие тесты выявили больше важных ошибок, и где в программе могут встретится ошибки подобного рода;
• Документирование ошибки, которой нет на самом деле. Может оказаться, что проблема связана с неправильными действиями тестировщика, его непониманием программы: «После залогирования в системе в браузере IE, в браузере Firefox авторизационные данные не вводятся автоматически»;
• Ошибка выявлена и забыта.