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

Тестирование-книга. Ю. Н. Артеменко Научный редактор


Скачать 6.27 Mb.
НазваниеЮ. Н. Артеменко Научный редактор
Дата09.10.2019
Размер6.27 Mb.
Формат файлаpdf
Имя файлаТестирование-книга.pdf
ТипКнига
#89291
страница43 из 49
1   ...   39   40   41   42   43   44   45   46   ...   49
4 8 8 Часть III: Управление проектами и группами
результаты подобных операций, однако некоторые продукты этого не де­
лают.
Невозможные значения
Программа должна проверять переменные, чтобы удостовериться, что хранящиеся в них данные не являются заведомо неверными. Например, программа не должна принимать такие даты, как 31 февраля. Если про­
грамма выполняет одно действие, когда некоторая переменная имеет зна­
чение 0, и другое, когда она имеет значение 1, и никаких других значений переменная иметь не может, следует все же проверить ее содержимое перед принятием решения, а не считать, что, если в переменной не 0, значит, 1.
Непроверенные данные
Кто-то может попытаться снять со своего счета 10 млн долларов, однако программа должна запросить разрешение на такую транзакцию еще у не­
скольких людей.
Флаги ошибок
Программа вызывает подпрограмму, в которой происходит сбой. Под­
программа заносит информацию об этом в определенную переменную, называемую флагом ошибки. После вызова программа может проверить флаг, а может и забыть это сделать — такое случается довольно часто.
Возвращенные подпрограммой испорченные данные будут использованы как правильный результат.
Аппаратные сбои
Программа должна учитывать, что устройства, к которым она подклю­
чается, могут сбоить. Многие устройства достаточно интеллектуальны, чтобы сообщить о неудачном выполнении переданных им команд. В этом случае программа должна прекратить взаимодействие с устройством и со­
общить о произошедшем пользователю.
Сравнение данных
Подводя баланс своих доходов и расходов, вы сверяете предполагаемый остаток денег с реальным содержимым своего кошелька. Если суммы не сходятся, значит, в ваших записях допущена ошибка. У программ также часто имеется возможность сверить два набора данных или результаты проведенных двумя способами вычислений.
Восстановление после ошибок
Происходит ошибка, программа замечает ее и пытается что-то предпри­
нять. Часто код, выполняющий восстановление после нестандартных ситу-
Приложение: Распространенные программные ошибки 4 8 9
аций, бывает очень плохо отлажен, а иногда даже не протестирован вовсе.
В то же время ошибки в подсистемах восстановления обычно имеют крайне неприятные последствия для пользователя.
Автоматическое исправление ошибок
Некоторые программы способны не только выявлять ошибки, но и исправлять их, никого не беспокоя, на основе других данных или опреде­
ленных правил. Это замечательная способность при условии, что исправ­
ление всегда выполняется правильно.
Отсутствие сообщения об ошибке
Программа должна обязательно сообщать о любой своей ошибке, даже если ошибка внутренняя и ее последствия исправлены автоматически. Не обязательно сообщать об ошибке пользователю, иногда достаточно сооб­
щить о произошедшем администратору многопользовательской системы или внести запись в файл журнала.
Не установлен флаг ошибки
Если в подпрограмме происходит ошибка, предполагается, что подпрог­
рамма установит соответствующий флаг. Если она этого не сделает, вызы­
вающая программа будет считать, что возвращенные ей данные верны, что приведет к новым ошибкам.
Куда возвращается управление?
Если в определенном фрагменте кода происходит сбой, пусть даже правильно обработанный, куда будет передано управление после этого?
Особенно остро эта проблема стоит в программах, в которых используют­
ся не вызовы подпрограмм, а переходы по команде GOTO.
Прекращение выполнение программы из-за
ошибки
Ошибка в программе может быть такой серьезной, что либо програм­
ма прекратит свою работу сама, либо это сделает пользователь. Будут ли при этом закрыты все открытые файлы? Будет ли сделана необходимая запись в файле журнала? Короче говоря, завершит ли программа свою работу корректно или оставит после себя полнейший хаос?
Обработка аппаратных отказов
Программа должна разумно вести себя в случае аппаратных сбоев и отказов. Если диск переполнен, она должна уметь записать данные на другой носитель, а не потерять их. Если устройство долгое время не отве-

4 9 0 Часть III: Управление проектами и группами
чает, она должна предположить, что оно отключено, а не сидеть и ждать вечно.
Ну нет у меня нужного диска!
Предположим, что программа просит пользователя вставить диск с необходимыми ей файлами. Если пользователь вставляет не тот диск или же диск не читается, программа сообщает об этом и просит вставить дру­
гой диск. Однако, если другого диска у пользователя нет, должна быть возможность сообщить об этом программе и продолжить работу, а не пе­
резагружать систему.
Ошибки, связанные с граничными
условиями
Граничное условие определяет поведение программы. Если это условие касается данных, то с одной стороны определяемой условием границы данные обрабатываются одним способом, а с другой — другим. Вот три очень распространенных примера ошибок, связанных с граничными усло­
виями.
Неправильная обработка граничного значения. Если программа увели­
чивает на 1 любое число, которое меньше 100, и отвергает числа, которое больше 100, что она будет делать, если пользователь введет число 100?
Неверное граничное условие. В спецификации сказано, что программа должна увеличивать на 1 любое число, которое меньше 100, но от­
вергать все числа больше 95.
Неправильная обработка данных, не соответствующих граничным усло­
виям. Значения с одной стороны границы невозможны, нежелатель­
ны, недопустимы или невероятны. Для их обработки вообще не написано никакого кода. Что делает программа, если пользователь вводит число, которое больше 100, — корректно его отвергает или разрушается?
На самом деле концепция граничных условий гораздо шире. Она охва­
тывает не только данные, но вообще любые аспекты поведения програм­
мы, к которым может быть применено понятие границ. Любые фрагменты кода, определяющие что-либо как наибольшее, самое старое, первое, самое длинное, произошедшее впервые и т.п., потенциально могут содержать одни и те же ошибки. А раз так, почему бы не применять к ним одинако­
вые термины.
Приложение: Распространенные программные ошибки 4 9 1
Числовые ограничения
Одни числовые ограничения относительно произвольны, другие пред­
ставляют собой естественные границы обрабатываемых программой значе­
ний. У треугольника ровно три стороны (не больше и не меньше). Сумма величин его углов равна 180 градусам. В одном байте могут храниться значения от 0 до 255. Если символ является буквой, его код находится в диапазоне о 65 до 90 или от 97 до 122.
Ограничения на равенство
Элементы списка могут отличаться, а могут быть и одинаковыми. Как сработает сортировка в каждом из случаев? Если в списке содержатся чис­
ла, как на их основе будут вычислены результаты статистических функций, в частности те, алгоритм вычисления которых в случае одинаковых пара­
метров включает деление на 0?
Количественные ограничения
Длина входной строки не должна превышать 80 символов. Что будет, если пользователь введет 79, 80 или 81 символ?
Может ли в списке быть только один элемент? Ни одного? Какова величина среднего отклонения для списка чисел, состоящего из одного элемента? (Оно может быть нулевым или неопределенным.)
Пространственные ограничения
Если, например, программа рисует график в прямоугольнике опреде­
ленного размера, что будет, если одну из точек графика нарисовать вне прямоугольника?
Ограничения времени
Предположим, что программа отображает запрос, 60 секунд ожидает ответа, а затем, если ответа нет, отображает меню. Что произойдет, если пользователь начнет что-то вводить в процессе отображения меню?
Предположим, что у пользователя есть 30 секунд для ответа на телефон­
ный звонок. Через 30 секунд телефон перестает звонить и вызов перенап­
равляется оператору. Что будет, если снять трубку на 30-й секунде? Можно ли ответить на звонок по истечении 30 секунд, но до того, как на него ответит оператор?
Предположим, что вы нажимаете на клавишу <Пробел> в то время, как операционная система загружает с диска программу. Что произойдет?
Информация о нажатии клавиши может быть проигнорирована, сохране­
на операционной для загружаемой программы или передана другой актив­
ной в этот момент программе. А может быть, произойдет нечто совсем уж неожиданное, например, разрушение системы.

4 9 2 Часть III: Управление проектами и группами
Условия гонок представляют собой граничные значения времени.
Условия циклов
Вот пример цикла:
10 IF CountVar < 45
THEN PRINT "Это цикл"
SET CountVar TO CountVar + 1
GOTO 10
ELSE QUIT
Программа печатает слова "Это цикл" и увеличивает значение перемен­
ной CountVar на 1 до тех пор, пока ее значение не станет равным 45. После этого программа прекращает работу. Выражение CountVar < 45 является условием выполнения цикла. Граничное значение (в данном случае мак­
симальное) представляет в нем число 45. Возможно также наличие в условии цикла минимального граничного значения, а также обоих: 10 < CountVar < 45.
О тестировании условий циклов подробно рассказывает Бейзер (Beizer, 1990).
Ограничения объема памяти
Каковы максимальный и минимальный объемы памяти, с которыми может работать программа? (Да-да, существуют программы, которые не могут работать со слишком большим объемом памяти.) Как программа использует свою память: разбивает на страницы, сегментирует? Не теряют­
ся ли первый или последний байты сегмента? (Кстати говоря, начинается ли их нумерация с 0 или с 1?) Используется ли программой виртуальная память, т.е. выгружается ли часть страниц данных на диск? Если да, как выполняется чтение данных? Возможно так: страница — из памяти, стра­
ница — с диска, страница — из памяти, страница — с диска и т.д. Как это отражается на производительности программы?
Ограничения, связанные со структурой данных
Предположим, что программа хранит данные в виде записей. Каждая запись состоит из имени сотрудника, его учетного номера и оклада. Пра­
вильно ли программа читает с диска первую запись? Последнюю? Как программа отмечает конец одной записи и начало следующей? Все ли дан­
ные соответствую этому формату? Что, если у двух служащих окажутся одинаковые учетные номера?
Ограничения, связанные с аппаратным обеспечением
Если мэйнфрейм способен обслуживать до сотни терминалов, что будет при подключении 99, 100, 101-го. Что, если 100 человек одновременно попытаются к нему подключится?
Приложение: Распространенные программные ошибки 4 9 3
Что произойдет, когда диск заполнится до отказа? Если в каталоге может храниться до 128 файлов, что будет, если попытаться сохранить в нем 127, 128 и 129-й файл? Если у принтера имеется входной буфер, что будет, если программа заполнит его, но у нее останутся еще неотправлен­
ные данные? Что будет, если в принтере закончится бумага или картридж?
Невидимые границы
Не все граничные условия программы видны извне. Например, под­
программа может вычислять результат по одной формуле, если значение аргумента больше 100, и по другой в противном случае. Очевидно, что 100 в данном случае является граничным значением, но вы можете даже не по­
дозревать об использовании такого алгоритма вычислений.
Ошибки вычислений
Программа что-то вычисляет и получает неверный результат. Этому могут быть три причины.
Неверная логика. Ее причиной может быть опечатка, например, А-А вместо А+А. Возможно также, что программист неаккуратно разбил сложное выражение на несколько более простых. Возможно, он воспользовался неверной или неприменимой к данной ситуации формулой. (Это, впрочем, уже ошибка проектирования — код делает именно то, что хотел программист, но его представление о том, что должно быть сделано, неверно.)
Неправильно выполняются арифметические операции. Возможно, что допущена ошибка при кодировании базовых функций, например, сложения или умножения. Такая ошибка может проявляться при каждом выполнении данной операции (например, 2+2=5), а может только в некоторых случаях. Как бы там ни было, при работе про­
граммы, использующей неверно закодированную функцию, возмож­
ны ошибки.
Неточные вычисления. Если программа выполняет арифметические операции над числами с плавающей запятой, возможны ошибки округления и отсечения. После ряда промежуточных округлений 2+2 может оказаться равным 5, даже если в программе нет логических ошибок.
Данная область настолько велика, что в этом приложении мы рассмат­
риваем ошибки вычислений лишь самым поверхностным образом. Для начального ознакомления с этим вопросом можно порекомендовать книги таких авторов, как Конте и Де Буа (Conte & deBoor, 1980) и Кнут (Knuth,
1981). Для его дальнейшего изучения подойдут книги Конте и Де Буа,
Карнахана (Carnahan), Лютера и Уилкеса (Luter & Wilkes, 1969).

4 9 4 Часть III: Управление проектами и группами
Устаревшие константы
Иногда константы используются в программах непосредственно. При­
мерами могут служить следующие значения: к компьютеру может быть подключено до 64 терминалов; длина конфигурационного файла не долж­
на превышать 706 байтов; первыми двумя цифрами года являются 19. Когда эти значения меняются, приходится менять и программу. При этом случа­
ется, что, изменив значение в одном месте программы, забывают изменить его в другом, что является источником множества ошибок.
Ошибки вычислений
Некоторые ошибки очень просты, например, выполнение сложения вместо вычитания или перестановка параметров функции. Исправить их обычно не составляет труда. Если программа запрашивает входные данные, выполняет вычисления, а затем отображает результат, выполните те же вычисления самостоятельно и сравните полученные данные.
Неверно расставленные скобки
(А + (В + С) * (D + (А / С - В Е / (В+ (F + 18 /
(А - F ) ) ) ) ) )
Выражения с обилием скобок очень трудно проверять и в них легко ошибиться, особенно когда некоторое время спустя после написания про­
граммы в нее вносятся изменения.
Неправильный порядок операторов
Программа может выполнять вычисления не в том порядке, в каком ожидает программист. Например, если ** означает возведение в степень, так что 5 ** 3 означает 5 в кубе, будет ли 2 * 5 ** 3 равно 1000 (10 в кубе) или 250 (5 в кубе умноженное на 2)?
Неверно работает базовая функция
Коммерческие языки и средства разработки программ обычно постав­
ляются с определенным набором базовых функций, таких как функции, выполняющие сложение и умножение. Кроме того, некоторое количество таких функций программисты могут написать самостоятельно, и эти фун­
кции могут содержать ошибки, вероятность возникновения которых прямо пропорциональна сложности функции. (Строго говоря, даже встроенные функции языка не гарантированы от ошибок, хотя обычно они очень тща­
тельно протестированы.) Иногда, желая сделать код более быстрым или коротким, программисты пользуются неточными формулами аппроксима­
ции.
Приложение: Распространенные программные ошибки 4 9 5
Переполнение и потеря значащих разрядов
Переполнение (overflow) — это ситуация, когда результаты вычислений слишком велики, чтобы программа могла их обработать. Предположим для примера, что программа хранит все числа в целом формате, выделяя для них по одному байту. С числами от 0 до 255 все получается прекрасно.
Однако сложить 255 и 255 такая программа не может, поскольку результат не помещается в один байт. Подобные вещи происходят и при вычислени­
ях с плавающей точкой, когда дробная часть оказывается слишком боль­
шой.
Переполнение может возникнуть и в случае, когда результат вычисле­
ния оказывается слишком маленьким. Как программе сохранить число
0,34674335, если для хранения дробной части выделен только один байт? В этом случае программы поступают по-разному — отсекают непоместивши- еся цифры или преобразуют результат в 0. В обоих случаях имеет место
потеря значащих разрядов (underflow).
Ошибки отсечения и округления
Предположим, что программа может хранить числа длиной не более двух цифр. В числе 5,19 три цифры. Если программа просто отсечет циф­
ру 9, она сохранит 5,1. Вместо этого она может округлить число, и тогда будет сохранено 5,2, что гораздо ближе к исходному значению.
Если язык программирования позволяет хранить до двух десятичных знаков, говорят, что он работает с точностью до двух цифр. Выполняемые им вычисления будут неточными. Например, 2,05 6
равняется приблизитель­
но 74. Однако если округлить 2,05 до 2,1, тогда 2,05 6
будет равно прибли­
зительно 86. Если отсечь цифру 5, получив 2,0, результатом возведения в степень будет 64.
Языки, работающие с точностью до двух цифр, нам неизвестны, а вот работающие с точностью до шести цифр встречались. Вычисления такой точности годятся для простых расчетов, но в сложных математических программах они могут привести к очень серьезным ошибкам.
Путаница с представлением данных
Одно и то же число может быть представлено несколькими способами, которые нельзя путать. Предположим, например, что программа просит вас ввести число между 0 и 9. Вы вводите 1. Программа может сохранить это число в формате с фиксированной точкой в одном байте. В байте 8 битов, так что его содержимое будет таким: 0000 0001. Программа может посту­
пить и иначе и сохранить ASCII-код введенной цифры. ASCII-код едини­
цы равен 49 или ООН 0001 в двоичном формате. В обоих случаях результат помещается в одном байте. Позднее можно перепутать способы хранения

4 9 6 Часть III: Управление проектами и группами
и интерпретировать содержимое этого байта как число вместо кода или наоборот. Это только один из множества возможных примеров.
1   ...   39   40   41   42   43   44   45   46   ...   49


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