Оптимизация – модификация системы для улучшения ее эффективности. Система может быть одиночной компьютерной программой, набором компьютеров или даже целой сетью, такой как интернет.
Отладка – специальный этап в разработке программы, состоящий
в выявлении и устранении программных ошибок, факт существования которых уже установлен.
2. Отладка и тестирование программ …………………………………………8
3. Классификация ошибок в программах …..………………………………. 22
4. Способы обнаружения ошибок..……………………………………………25
Список используемых источников……………………………….………. …27
Министерство образования и науки
ФГБОУ ВПО «ВОРОНЕЖСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
ФАКУЛЬТЕТ ВЕЧЕРНЕГО И ЗАОЧНОГО ОБУЧЕНИЯ
Кафедра высшей математики
И физико-математического моделирования
По дисциплине «Информатика»
Тема: Оптимизация, отладка и тестирование программ
Выполнил студент ЛП-111 Р.С. Головенько
группа подпись инициалы, фамилия
Руководитель В.В. Пешков
Тестирование и отладка решения задачи «Минимальная строка»
подпись инициалы, фамилия
подпись инициалы, фамилия
На курсовую работу по информатике
Тема: Оптимизация, отладка и тестирование программ.
1. Составить на языке Турбо Паскаль программу, выводящую на экран точку, пересекающую с постоянной скоростью экран параллельно его горизонтальной оси и отражающуюся от боковых границ экрана.
2. В новой рабочей книге MS Excel создать таблицу результатов сессии для некоторой группы (внести 10-15 чел). Найти следующие показатели сессии: средний балл по итогам сессии для каждого студента; средний балл группы по каждому предмету; количество пятерок, четверок, троек, двоек по каждому предмету (использовать функцию СЧЁТЕСЛИ); процент успеваемости группы по каждому предмету (т.е. процент удовл. оценок и выше), процент качества (т.е. процент хороших и отличных оценок). Построить диаграммы, отражающие относительное число отличных, хороших и т.д. оценок для группы по каждому предмету.
2. Отладка и тестирование программ …………………………………………8
3. Классификация ошибок в программах …..………………………………. 22
4. Способы обнаружения ошибок..……………………………………………25
Список используемых источников……………………………….………. …27
Оптимизация – модификация системы для улучшения ее эффективности. Система может быть одиночной компьютерной программой, набором компьютеров или даже целой сетью, такой как интернет.
Отладка – специальный этап в разработке программы, состоящий
в выявлении и устранении программных ошибок, факт существования которых уже установлен.
Тестирование – процесс выполнения программы (или части программы) с намереньем (или целью) найти ошибки
Эти три пункта помогут создать надежную и стабильно работающую программу, которая сможет отвечать вашим требованиям.
1. Оптимизация программ
Всегда желательно иметь компилятор, который создает эффективно работающие объектные программы. Как правило, программа в кодах машины, полученная в результате трансляции, будет занимать больший объем памяти и работать медленнее, чем такая же программа, написанная опытным программистом. Термин «оптимизация» применяется к попыткам сделать выходные программы более «эффективными», т.е. быстрее работающими или более компактными. Таким образом, оптимизацией называется улучшение выходной программы, а часть транслятора, выполняющая эту функцию
Отладка и тестирование программ
— оптимизирующей частью транслятора.
Оптимизирующая часть транслятора выполняет следующие
действия:
1. Устраняет недостатки программы, вызванные небрежностью или низкой квалификацией программиста. Примером может служить вынесение из цикла операторов, не зависящих от управляющих переменных цикла, что приведет к сокращению времени выполнения программы, поскольку вынесенные операторы будут выполняться только один раз, а не многократно.
2. Устраняет излишние вычисления, неизбежно возникающие в процессе трансляции даже при самом тщательном написании программы на языке высокого уровня. Например, устранение повторного вычисления индексных выражений для элементов массива сокращает время выполнения программы и ее длину.
Промежуточный язык.
Для повышения эффективности программы можно произвести над ней последовательность преобразований в различные моменты процесса компиляции. Например, можно оперировать с входной программой, со структурами, порождаемыми на стадии синтаксического анализа, с кодом, порождаемым в качестве выхода фазы генерации кода. Однако оптимизировать программу, уже протранслированную в коды машины, трудно по следующим причинам:
во-первых, единицы действия программы в кодах команд слишком мелки, что уже само по себе затрудняет анализ,
во-вторых, при трансляции входной программы в коды машины возможна потеря имеющейся в ней информации. Например, засылка промежуточных результатов в разные рабочие ячейки памяти делает практически невозможной идентификацию одинаковых частей программы;
в-третьих из-за нестандартности форматов различных элементов языка и рекурсивных конструкций, широко применяемых в текстах программ.
Поэтому, если транслятор производит оптимизацию программы, необходимо делать специальный проход, переводящий программу с исходного языка на промежуточный.
Строго сформулировать требования, предъявляемые к промежуточному языку, трудно. Однако уже из самого обоснования необходимости промежуточного языка видно, что:
а) операторы языка не должны быть слишком мелкими;
б) символы, идентификаторы и числа должны иметь фиксированный формат;
в) в строении операторов желательно отсутствие рекурсивности;
г) должна сохраняться вся информация, необходимая для оптимизации, которая есть во входном языке;
д) язык должен быть приспособлен к выполнению оптимизирующих преобразований и удобен для последующей трансляции в коды вычислительной машины.
Требования пп. «г» и «д» показывают, что разработать единый универсальный промежуточный язык для трансляции с любого языка программирования в коды любой вычислительной машины трудно. В качестве промежуточного языка можно использовать польскую запись, тетрады, триады, синтаксические деревья.
При рассмотрении вопросов оптимизации будем считать, что программа протранслирована с входного на некоторый промежуточный язык, оператор которого имеет следующий общий вид:
(mi) код операции аргументы оператора,
где mi — указатель оператора, а также идентификатор результата команды при отсутствии его присваивания некоторой переменной.
Необходимо различать переменные, введенные программистом (программные переменные), и переменные, генерируемые в процессе
трансляции на промежуточный язык (mi — идентификаторы). Между
определением программной переменной и ее использованием в качестве операнда существует следующая зависимость:
— если программная переменная, используемая в области, не определена в ней, то предполагается, что она определена во всех путях, ведущих к области;
— если программная переменная определена и используется в области, то внутри области существует путь между определением переменной и каждым ее использованием ;
— если программная переменная определена в области, то, вообще говоря, это не значит, что она определена на каждом выходном пути.
Помимо программы на промежуточном языке, состоящей из последовательности операторов, для проведения оптимизации формируются следующие таблицы:
1. Таблицы идентификаторов и констант с обычной информацией о переменных и константах.
2. Таблица блоков, определяющая номера блоков (блоки нуме-
руются в произвольном порядке), их границы, непосредственно предшествующие и следующие блоки, а также любую информацию о частоте повторения блока.
3. Таблица последовательности операторов, определяющая линейную последовательность операторов в блоке. Она содержит последовательность указателей операторов mi. Эта таблица необходима, поскольку один указатель может принадлежать нескольким операторам.
3.Элементы топологии программы .
Вопросы оптимизации обычно связаны с топологией программы, т.е. со способом ее построения. Для того, чтобы локализовать процессы оптимизации и не связывать их с конкретным входным языком, они проводятся внутри отдельных участков программы, называемых блоками и сильно связанными областями.
Блок (линейный участок) — выполняемая по порядку последовательность операторов, имеющая единственную точку входа — первый оператор с меткой, на который может быть передано управление, и единственную точку выхода — последний оператор.
Формально модель линейного участка может быть представлена следующим образом:
блок B — это тройка вида (P,I,U),где
(1) P — список операторов S1,S2. Sn (n>=0),
(2) I — множество входных переменных,
(3) U — множество выходных переменных.
При этом оператором называется цепочка (в общем случае) вида
A
где A,B1. Br — переменные,Q — операция.
Здесь оператор присваивает значение переменной А и ссылается на B1. Br.
Если оператор Sj ссылается на А, то либо А — входная переменная, либо осуществлено присваивание ей значения некоторым оператором до Sj, (т. е. некоторым оператором Si.
Оператор S в программе называется входом в линейный участок, если он либо первый оператор в программе, либо помечен идентификатором, появляющимся в операторе перехода, либо непосредственно следует за условным оператором.
Линейный участок, относящийся к входу в участок S, состоит из S и всех операторов, следующих за ним вплоть до оператора останова, включая его, или вплоть до входа в следующий блок.
2. Отладка и тестирование программ
1. Отладка программы
Отладка, как мы уже говорили, бывает двух видов:
Синтаксическая отладка. Синтаксические ошибки выявляет компилятор, поэтому исправлять их достаточно легко.
Семантическая (смысловая) отладка. Ее время наступает тогда, когда синтаксических ошибок не осталось, но результаты программа выдает неверные. Здесь компилятор сам ничего выявить не сможет, хотя в среде программирования обычно существуют вспомогательные средства отладки, о которых мы еще поговорим.
Отладка — это процесс локализации и исправления ошибок в программе.
Как бы тщательно мы ни писали, отладка почти всегда занимает больше времени, чем программирование.
2. Локализация ошибок
Локализация — это нахождение места ошибки в программе.
В процессе поиска ошибки мы обычно выполняем одни и те же действия:
прогоняем программу и получаем результаты;
сверяем результаты с эталонными и анализируем несоответствие;
выявляем наличие ошибки, выдвигаем гипотезу о ее характере и месте в программе;
проверяем текст программы, исправляем ошибку, если мы нашли ее правильно.
Способы обнаружения ошибки:
Аналитический — имея достаточное представление о структуре программы, просматриваем ее текст вручную, без прогона.
Экспериментальный — прогоняем программу, используя отладочную печать и средства трассировки, и анализируем результаты ее работы.
Оба способа по-своему удобны и обычно используются совместно.
3. Принципы отладки
Принципы локализации ошибок:
Большинство ошибок обнаруживается вообще без запуска программы — просто внимательным просматриванием текста.
Если отладка зашла в тупик и обнаружить ошибку не удается, лучше отложить программу. Когда глаз «замылен», эффективность работы упорно стремится к нулю.
Чрезвычайно удобные вспомогательные средства — это отладочные механизмы среды разработки: трассировка, промежуточный контроль значений. Можно использовать даже дамп памяти, но такие радикальные действия нужны крайне редко.
Экспериментирования типа «а что будет, если изменить плюс на минус» — нужно избегать всеми силами. Обычно это не дает результатов, а только больше запутывает процесс отладки, да еще и добавляет новые ошибки.
Принципы исправления ошибок еще больше похожи на законы Мерфи:
Там, где найдена одна ошибка, возможно, есть и другие.
Вероятность, что ошибка найдена правильно, никогда не равна ста процентам.
Наша задача — найти саму ошибку, а не ее симптом.
Это утверждение хочется пояснить. Если программа упорно выдает результат 0,1 вместо эталонного нуля, простым округлением вопрос не решить. Если результат получается отрицательным вместо эталонного положительного, бесполезно брать его по модулю — мы получим вместо решения задачи ерунду с подгонкой.
Исправляя одну ошибку, очень легко внести в программу еще парочку. «Наведенные» ошибки — настоящий бич отладки.
Исправление ошибок зачастую вынуждает нас возвращаться на этап составления программы. Это неприятно, но порой неизбежно.
4. Методы отладки
Силовые методы
— Использование дампа (распечатки) памяти.
Это интересно с познавательной точки зрения: можно досконально разобраться в машинных процессах. Иногда такой подход даже необходим — например, когда речь идет о выделении и высвобождении памяти под динамические переменные с использованием недокументированных возможностей языка. Однако, в большинстве случаев мы получаем огромное количество низкоуровневой информации, разбираться с которой — не пожелаешь и врагу, а результативность поиска — исчезающе низка.
— Использование отладочной печати в тексте программы — произвольно и в большом количестве.
Получать информацию о выполнении каждого оператора тоже небезынтересно. Но здесь мы снова сталкиваемся со слишком большими объемами информации. Кроме того, мы здорово захламляем программу добавочными операторами, получая малочитабельный текст, да еще рискуем внести десяток новых ошибок.
— Использование автоматических средств отладки — трассировки с отслеживанием промежуточных значений переменых.
Пожалуй, это самый распространенный способ отладки. Не нужно только забывать, что это только один из способов, и применять всегда и везде только его — часто невыгодно.
Сложности возникают, когда приходится отслеживать слишком большие структуры данных или огромное их число. Еще проблематичнее трассировать проект, где выполнение каждой подпрограммы приводит к вызову пары десятков других. Но для небольших программ трассировки вполне достаточно.
Источник: www.myunivercity.ru
Тестирование и отладка программ
Тестирование – выполнение программы с целью обнаружения ошибок.
Дейкстра: «Никакое тестирование не может подтвердить правильность программы: в лучшем случае, оно может показать только ее ошибочность».
Отладка – локализация и исправление ошибок.
Виды программных ошибок Способы их обнаружения
1. Синтаксические Статический контроль и диагностика компилятором и компоновщиком
2. Ошибки выполнения, выявляемые Динамический контроль:
а) переполнение, потеря порядка, . — аппаратурой процессора (Вопрос 1)
б) несоответствие типов — run-time системы программирования
в) зацикливание — операционной системой – по превы-
шению лимита времени задачи
3. Программа не соответствует специ- Целенаправленное тестирование
4. Спецификация не соответствует Испытания, бета-тестирование
требованиям – ошибка спецификации
Глубина контроля 1-го вида зависит и от языка, и от компилятора. Строгая типизация весьма полезна: DO 3 I = 1.3 – “точка стоимостью 800 млн $” (вместо запятой) – ошибка в Фортран-программе бортового вычислителя ракеты к Венере [1]. Вопрос 2.
Набор ошибок 2-го вида может быть расширен программистом: контроль можно программировать с помощью утверждений (asserts) проверок, вставляемых в код. Это полезно для проверки правдоподобности промежуточных результатов вычислений и допустимости значений фактических параметров подпрограмм.
Собственно процесс тестирования направлен на выявление ошибок 3 и 4 видов. Большинство программистов сами исправляют 99% своих текущих ошибок. Однако порядка одной ошибки на 100 строк кода обычно еще остается, когда программист сдает работу тестеру, утверждая, что ошибок в ней нет [2].
Тест – это набор контрольных входных данных совместно с ожидаемыми результатами. К входным данным здесь относятся не только конкретные значения ввода, но и события, их последовательность и временные параметры. Ожидаемые результаты берутся из спецификации программы, а на этапе приемо-сдаточных испытаний это – ожидания пользователей.
Ключевой вопрос – полнота тестирования: какое количество каких тестов гарантирует возможно более полную проверку программы ? Исчерпывающая проверка на всем множестве входных данных недостижима. Пример: программа, вычисляющая функцию двух переменных: Y = f (X, Z). Если X, Y, Z – real, то полное число тестов (2 32 ) 2 = 2 64 ≈ 10 31 . Если на каждый тест тратить 1 мс, то 10 31 мс = 800 млн лет (отсюда видно, что ошибка FDIV Pentium’а вполне простительна). Все траектории выполнения кода также невозможно воспроизвести. В [1] приведена программа из двадцати строк кода (цикл и несколько операторов IF), у которой 10 17 возможных путей выполнения.
- В любой нетривиальной программе на любой стадии ее готовности содержатся необнаруженные ошибки
- Продолжительность тестирования – технико-экономическая проблема: компромисс между временем и полнотой. Поэтому нужно возможно меньшее количество хороших тестов с желательными свойствами:
- Детективность: тест должен с большой вероятностью обнаруживать возможные ошибки.
- Покрывающая способность: один тест должен выявлять как можно больше ошибок.
- Воспроизводимость: ошибка должна выявляться независимо от изменяющихся условий (например, от временных соотношений) – это трудно достижимо для время-зависимых программ, реультаты которых часто невоспроизводимы.
Это благие пожелания; для направленного выбора руководствуются критериями выбора тестов. Критерий должен показать, когда некоторое конечное множество тестов достаточно для проверки программы с некоторой полнотой.
Два вида критериев:
- Функциональные – если тесты составляются исходя из спецификации программы (тестирование черного ящика). Проверяется правильность выполнения программой всех ее заданных функций. Именно этим критериям в основном и следуют при независимом тестировании.
- Структурные – если тесты составляются исходя из текста программы (тестирование прозрачного ящика). Проверяется правильность работы при прохождении всех участков кода. Эту работу программисты выполняют постоянно в ходе разработки.
Вид критерия Что должно обеспечивать множество тестов
1. Тестирование классов вх. данных ! Содержать представителей всех вх или вых
2. Тестирование классов вых. данных ! классов и точки на границах классов
3. Тестирование функций Каждая функция внешнего интерфейса должна быть проверена >= 1раза
- Тестирование команд Каждая команда (оператор) д.б. выполнена
- Критерий С1 – тестир. ветвей Каждая ветвь д.б. выполнена >= 1раза
- Критерий С2 – тестир. путей Каждый путь в графе программы д.б.
выполнен >= 1раза (Вопрос 3)
На рис 10-1 а) видно отличие тестирования команд (достаточен один тест) от С1 (необходимы два теста как минимум). Рис 10-1 б) иллюстрирует отличие С1 (достаточно двух тестов, покрывающих пути 1, 4 или 2, 3) от С2 (необходимо 4 теста для всех четырех путей). С2 в принципе недостижим в реальных программах из-за их цикличности, поэтому ограничиваются тремя путями для каждого цикла: 0, 1 и N повторений цикла.
Идея назначения классов эквивалентности вх/вых данных для функционального тестирования основана на разумном предположении, что программа на всем классе ведет себя так же, как на его одном представителе. Классы назначаются исходя из семантики решаемой задачи. В таблице 1 дан пример тестирования классов выходных данных: минимальный набор тестов для программы нахождения вещественных корней квадратного уравнения ax 2 + bx + c = 0 (Грюнбергер, 1968).
Рис.10-1. Траектории вычислений при структурном тестировании
Источник: studfile.net
Лабораторная работа «Тестирование и отладка ПО»
Тема. Тестирование и отладка программного обеспечения.
Цель. Изучить процессы тестирования и отладки программного обеспечения.
Оборудование. ПК
1. Ознакомиться с теоретической частью.
2. Выполнить практическое задание.
3. Ответить на контрольные вопросы.
4. Оформить отчет.
Теоретическая часть
Отладка – это процесс локализации и исправления ошибок, обнаруженных при тестировании программного обеспечения.
Локализацией называют процесс определения оператора программы, выполнение которого вызвало нарушение нормального вычислительного процесса. Для исправления ошибки необходимо определить ее причину, т.е. определить оператор или фрагмент, содержащие ошибку. Причины ошибок могут быть как очевидны, так и очень глубоко скрыты. В целом сложность отладки обусловлена следующими причинами:
— требует от программиста глубоких знаний специфики управления используемыми техническими средствами, операционной системы, среды и языка программирования, реализуемых процессов, природы и специфики различных ошибок, методик отладки и соответствующих программных средств;
— психологически дискомфортна, так как необходимо искать собственные ошибки и, как правило, в условиях ограниченного времени;
— возможно взаимовлияние ошибок в разных частях программы, например, за счет затирания области памяти одного модуля другим из-за ошибок адресации;
— отсутствуют четко сформулированные методики отладки.
Классификация ошибок
В соответствии с этапом обработки, на котором появляются ошибки, различают:
— синтаксические ошибки – ошибки, фиксируемые компилятором (транслятором, интерпретатором) при выполнении синтаксического и частично семантического анализа программы;
— ошибки компоновки – ошибки, обнаруженные компоновщиком (редактором связей) при объединении модулей программы;
— ошибки выполнения – ошибки, обнаруженные операционной системой, аппаратными средствами или пользователем при выполнении программы.
Методы отладки программного обеспечения
Отладка программы в любом случае предполагает обдумывание и логическое осмысление всей имеющейся информации об ошибке. Большинство ошибок можно обнаружить по косвенным признакам посредством тщательного анализа текстов программ и результатов тестирования без получения дополнительной информации. При этом используют различные методы:
Метод ручного тестирования
Это – самый простой и естественный способ данной группы. При обнаружении ошибки необходимо выполнить тестируемую программу вручную, используя тестовый набор, при работе с которыми была обнаружена ошибка. Метод очень эффективен, но не применим для больших программ, программ со сложными вычислениями и в тех случаях, когда ошибка связана с неверным представлением программиста о выполнении некоторых операций. Данный метод часто используют как составную часть других методов отладки.
Общая методика отладки программных продуктов, написанных для выполнения в операционных системах MS DOS и Win32:
1 этап – изучение проявления ошибки;
2 этап – определение локализации ошибки;
3 этап – определение причины ошибки;
4 этап – исправление ошибки;
5 этап – повторное тестирование.
Процесс отладки можно существенно упростить, если следовать основным рекомендациям структурного подхода к программированию:
— программу наращивать «сверху-вниз», от интерфейса к обрабатывающим подпрограммам, тестируя ее по ходу добавления подпрограмм;
— выводить пользователю вводимые им данные для контроля и проверять их на допустимость сразу после ввода;
— предусматривать вывод основных данных во всех узловых точках алгоритма (ветвлениях, вызовах подпрограмм).
Спецификация программы , программная спецификация (program specification) — точная и полная формулировка определенной задачи или группы задач, содержащая сведения, необходимые для построения алгоритма их решения. Содержит описание результата, который должен быть достигнут с помощью конкретной программы, а также действий, выполняемых программой для достижения конечного результата без упоминания того, как указанный результат достигается
Практическая часть
Задание 1. Запишите вариант в отчет.
Задание 2. Согласно поставленной задаче выполните ручную отладку:
— Опишите математическую модель задачи с указанием имен и назначения переменных;
— Опишите спецификацию программы;
— Запишите алгоритм программы;
— Выполните отладку логики программы методом «грубой силы» с помощью соседа;
— Составьте тестовые наборы для проверки функционала системы.
Задание 3. Результаты выполнения практического задания запишите в отчет.
Контрольные вопросы
1. Какие методы тестирования вы знаете?
2. В чем заключаются методы «черного» и «белого» ящика?
3. На каком этапе проводится ручная отладка?
4. Опишите методы отладки.
Варианты заданий
Создать Windows-приложение , реализующие линейный и разветвляющий ся алгоритмы, которые размещены на разных вкладках окна формы. На вкладке линейного алгоритма предусмотреть поля ввода значений переменных и поле вывода результата вычисления. На вкладке разветвляющегося алгоритма предусмотреть поля для ввода значений переменных, поле вывода результатов расчета по одной из трех формул в зависимости от результата выполнения условия. В качестве f ( x ) использовать по выбору: cos ( x ) или x 2 или e x . Пример рабочей формы представлен на рисунке 1.
Рисунок 1 – Windows-приложение
Линейный алгоритм:
1. .
2. .
3. .
4.
5. .
6. .
7. .
Разветвляющийся алгоритм:
1. 2.
3. 4.
5. 6.
7. 8.
3. Результат выполнения практического задания.
4. Ответы на контрольные вопросы.
Скачано с www.znanio.ru
Практическая работа № 3 Тема
Процесс отладки можно существенно упростить, если следовать основным рекомендациям структурного подхода к программированию: — программу наращивать «сверху-вниз», от интерфейса к обрабатывающим подпрограммам, тестируя ее по…
Линейный алгоритм: 1. . 2
Лабораторная работа «Тестирование и отладка ПО»
Лабораторная работа «Тестирование и отладка ПО»
Лабораторная работа «Тестирование и отладка ПО»
Лабораторная работа «Тестирование и отладка ПО»
Лабораторная работа «Тестирование и отладка ПО»
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.
Источник: znanio.ru