Реферат на тему:


Воспользуйтесь поиском к примеру Реферат        Грубый поиск Точный поиск






Загрузка...

Реферат на тему:

Тестирование и отладка программ

Тестирование и отладка программ

Тестирование обнаруживает только наличие, но никак не отсутствие ошибок.

Е. Дейкстра

Программа, свободная от ошибок это абстрактное теоретическое понятие.

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

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

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

Отладка программ.

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

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

Трудно сказать, какому подхода следует отдавать предпочтение. Скорее всего это определяется характером программы и личными привязанностями ее автора.

Защитное программирование

Итак, ошибка это реальное и неизбежное явление в любой программе. Поэтому вполне естественной выглядит принцип защитного программирования [9]. Защитное программирование это методология создания программ, которая уменьшает вероятность ошибок в программе. Основная иИдея заключается в том, чтобы предусмотреть в программе как можно больше средств контроля ошибок.

Лозунгом защитного программирования может считаться известный закон Мерфи:

Все, что может испортиться, портится обязанности обязательно. Все, что не может испортиться, портится тоже.

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

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

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

На последнем пункте нужно остановиться более подробно. Известно, что все вычисления в программировании выполняются приближенно. Вследствие этого может возникать явление, которое называется патологией чисел. Хуже в этом то, что такие ситуации невозможно точно смоделировать. Для упрощения приведем примеры для действительных чисел, занимающих четыре разряда. Пусть надо вычислить значение переменной b = (1.0 / 3) 3. С учетом ограниченности разрядов это даст b = 0.3333 3 = 0.9999. Понятно, что в таком случае проверка (b = 1) всегда будет давать результат false. Пусть x = 999.0, y = 1000, z = 0.0001. С учетом ограниченности разрядов имеем парадоксальный результат:
 ((X + y) + z) + 1 = ((-1) + 0,0001) + 1 = 0.0001, но
 (X + (y + z)) + 1 = 999 + (-1000) + 1 = 0
Подобные проблемы возникают тогда, когда добавляются числа, близкие к минимальных и максимальных для разрядной сетки.

Некоторые типичные ошибки в программах.

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

И если о синтаксические ошибки пиклуетвозможной области значений переменных;

элементы информации, которые должны иметь фиксированную длину (индекс, номер телефона), не соответствуют этому условию;

налог превышает сумму, на которую он начисляется ...

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

Тестирование программ.

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

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

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

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

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

Некоторые принципы тестирования программ.

Используйте подход защитного программирования. То есть вносите еще во время написания программы обработку ситуаций, которые "не могут произойти ни при каких обстоятельствах". И во время тестирования обязанности обязательно убедитесь, что программа, защищенная от некорректных данных. Хорошим примером здесь может служить проверка на нулевой или даже от емкий размер массива в программе вычисления среднего значения элементов этого массива.

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

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

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

используйте табличные данные;

сравните с резесть тщательного же приготовления тестовых данных. Можно выделить три основных вида тестовых данных.

Тестовые данные готовятся программистом. К ним относятся специально подготовленные контролируемые данные и случайные данные, сгенерированные некоторой программой.

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

Реальные данные в полном объеме можно использовать для заключительных тестовых испытаний.

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

Каждый из трех этапов должен гарантировать получение верных результатов при верных входных данных и сообщение об ошибке (причем с деталировкой вида ошибки) при неверных данных.

Ниже в таблице приведены примеры тестирования программы, которая должна вычислять длину главной диагонали прямоугольного параллелепипеда со сторонами A, B, C.

Номер теста | Тестовые данные

(A, B, C) | Комментарий

1 | 1, 1, 1 | Дымовой тест

2 | 1, 2, 3 | Нормальные условия

3 | 0, 0, 0 | Нулевой тест (результат должен быть равен нулю!)

4 | 0, 1, 2 | Критические условия

Это не параллелепипед! Что выдаст программа?

5 | 1, 2, 0

6 | 1, 0, 2

7 | 1, 6, 3 | Экстремальные условия (неверные данные). Что выдаст программа?

Напомним главное правило тестирования программы необходимо тестировать!

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

Желаем успехов в создании и тестировании ваших программ!

ЛИТЕРАТУРА

Н. Вирт. Систематическое программирование. М .: Мир, 1977. 183 с.

Ален И. Голуб. С и С ++. Правила программирования. М .: БИНОМ, 1996. 272 с.

В. Дал, Э. Дейкстра, К. Хоор. Структурное программирование. М .: Мир, 1973. 247 с.

Э. Дейкстра. Дисциплина программирования. М .: Мир, 1978. 275 с.

Д. Ван Тассел. Стиль, разработка, эффективность, отладка и испытание программ. М .: Мир, 1985. 332 с.

М. Зелковиц, А. Шоу, Дж. Гэннона. Принципы разработки программного обеспечения. М .: Мир, 1982. 368 с.

Г. С. Иванова. Основы программирования: Учебник для вузов. М .: Изд-во МГТУ им. Н.Э. Баумана, 2002. 416 с.

Г. С. Иванова. Технология программирования: Учебник для вузов. М .: Изд-во МГТУ им. Н.Э. Баумана, 2002. 320 с.

Э. Йодан. Структурное проектирование и конструирование программ. М .: Мир, 1979. 415 с.

Б. Керниган, Р. Пайк. Практика программирования. СПб .: Невский диалект, 2001. 381 с.

Э.Б. Коффман. Turbo Pascal. М .: Издательский дом «Вильямс», 2002. 896 с.

Загрузка...