|
||||||||
|
Тестирование.Тестирование Тестирование и отладка идут рука об руку, так что большинство программистов просто не воспринимают их как отдельные этапы разработки программ. Однако путь к успеху лежит через разделение процесса отладки и тестирования на два разных этапа работы над программой, и вам следует четко представлять себе, что цель тестирования ? определить наличие (или отсутствие) ошибок, В то время как цель отладки ? определить местоположение ошибок и устранить их. Поскольку цели этих двух этапов разработки программ различны, различны и используемые для этого методы и инструменты. Создание
надежного приложения
DataSet:= GetData; //Получение
данных для сортировки.
Если определен символ Debug, код принимает следующий вид. DataSet:= GetData; //Получение
данных для сортировки.
Если же символ Debug не определен при создании коммерческого варианта программы, код вырождается в алгоритм быстрой сортировки без дополнительных проверок DataSet:= GetData; //Получение
данных для сортировки.
Как видите, использование условной компиляции ? простои способ создания как отладочной, так и коммерческой версий приложения Вы можете определить символ условной компиляции двумя путями. Первый ? глобальное определение символа в опциях проекта. Выберите команду Project/Options и в диалоговом окне Project Options, во вкладке Directories/Conditionals, введите символ в поле Conditional defines. На рис 2.1 показано определение двух символов (Debug и Alpha) Щелкните на кнопке ОК для подтверждения вашего ввода
Совет: Изменив символы условной компиляции, перекомпилируйте проект с помощью команды Project/Build All для того, чтобы учесть внесенные изменения. Другой метод определения символа условной компиляции ? вставить в ваш исходный код директиву. {$define Debug} Вероятно, вы не захотите возиться с каждым файлом, входящим в проект, и предпочтете определить символ глобально. Однако возможна ситуация, когда, включив символ условной компиляции глобально, вы захотите отключить его в некоторых модулях. Для этого используйте в файле директиву {$undef Debug} Она отключает действие
директивы Debug до тех пор, пока не встретится соответствующая директива
$DEFINE или конец текущего файла.
Конечно, вы можете использовать эти директивы сколь угодно часто и в тех
местах, где сочтете нужным.
Ниже приведено описание этих опций. Optimization. Эта опция управляет оптимизацией компилятора. Рекомендуется оставить эту опцию включенной и выключать ее, если вы полагаете, что оптимизация вносит ошибки в вашу программу. Управлять оптимизацией локально вы можете с помощью директив компилятора $0+ и $0-. Stack Frames. Если эта установка включена, компилятор всегда включает в функцию код для генерации кадра стека, даже если код не использует стек. Как и в случае оптимизации, вам вряд ли стоит изменять эту установку. Локальные директивы компилятора? $W-t и $W-. Range Checking. Проверка диапазона перехватывает ошибки, вызванные выходом за пределы массива или строки. Однако дополнительный код сдерживает выполнение программы и, по всей видимости, вы отключите эту опцию в коммерческой версии. Директивы компилятора для включения и отключения проверки? $R+ и $R-. Assertions (С). Эта опция более полно описана в следующем разделе. Использование данного типа проверок позволяет быстро и просто добавить проверки в код Естественно, в коммерческой версии вы захотите отключить эту возможность. Директивы компилятора? $С+ и $С-. Overflow checking (Q). Проверка на переполнение позволяет выяснить, не является ли результат выполнения целочисленной операции слишком большим для размещения его в переменной. Подобно опции Range Checking, данная опция полезна только при отладке, и в коммерческой версии, как правило, отключается. Директивы компилятора? $Q+ и $Q-. Отладочная версия вашего кода, вероятно, будет больше по размеру и медленнее коммерческой версии. Поэтому не передайте случайно конечному пользователю отладочную версию! Использование
директивы Assert
Assert (<логическое выражение) Вы можете использовать проверку, например, в начале процедуры для выяснения корректности параметров, как показано ниже. procedure
Foo(Count: Cardinal);
Если выражение окажется
ложным, появится сообщение об ошибке, подобное показанному на рис. 2.3.
Конечно же, у вас уже вертится на языке вопрос, чем же это отличается от
конструкции if... else. Дело в том, что управлять генерацией кода для оператора
Assert очень легко и просто с помощью директивы компилятора. Для применения
описанных возможностей используйте директиву $ASSERTIONS ON или $С
+, а для отключения действия Assert? $ASSERTIONS
OFF или $С - (при этом компилятор игнорирует
операторы Assert и код для них не генерируется).
Поскольку вы явно захотите включить эту возможность в отладочную версию и исключить ее из коммерческой, используйте код, подобный приведенному ниже. {$ifdef Debug}
Какого типа выражения могут использоваться в операторе Assert? Любого (конечно, если оно возвращает логическое значение). Однако тут есть свои маленькие подводные камушки, о которые легко поцарапаться. Представьте себе, что у вас есть некоторая функция, например выясняющая, сколько раз она была вызвана. function CountMe:
Integer;
Предположим, что вы вызываете ее в операторе Assert. Таким образом, в коммерческой версии, которая игнорирует все операторы Assert, количество вызовов функции будет не таким, как в отладочной версии. Так что будьте внимательны и осторожны. Модульное
тестирование
Ну, и наконец, философское замечание о следствии из закона Мэрфи для программирования "В любой работающей программе есть хотя бы одна ошибка, при исправлении которой вносится, по крайней мере, еще две ошибки". Даже в наилучших коммерческих программах содержатся ошибки, а потому вопрос о нахождении и исправлении всех ошибок не может даже быть поставлен. Но следует сделать все возможное, чтобы обнаружить и ликвидировать как можно больше ошибок. Следующий раздел этой главы посвящен описанию инструментов Delphi для локализации и исправления ошибок.
| ||||||||
За содержание страницы отвечает Гончарова М.Н. © Кафедра СПиКБ, 2002-2017 |