Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



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

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

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

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

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

Прикладное ПО предназначено для решения повседневных задач обработки информации:

создания документов, графических объектов, баз данных;

проведения расчетов;

ускорения процесса обучения;

Проведения досуга.

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

Примеры прикладных программ:

Средства управления базами данных, текстовые редакторы,

графические редакторы, электронные таблицы;

Музыкальные редакторы

обучающие программы;

программы тестирования;

программы статистических расчетов;

компьютерные игры;

интегрированные пакеты;

Телекоммуникационные и сетевые программы.


По типу

· программные средства общего назначения

    • Текстовые редакторы
    • Текстовые процессоры
    • Системы компьютерной вёрстки
    • Графические редакторы
    • СУБД
    • Электронные таблицы
    • Веб-браузеры
  • программные средства развлекательного назначения
    • Медиаплееры
    • Компьютерные игры
  • программные средства специального назначения
    • Экспертные системы
    • Трансляторы
    • Мультимедиа-приложения (медиаплееры, программы для создания и редактирования видео, звука, text-to-speech и пр.)
    • Гипертекстовые системы (электронные словари, энциклопедии, справочные системы)
    • Системы управления содержимым
  • профессиональные программные средства
    • САПР
    • АРМ
    • АСУ
    • АСУ ТП
    • АСНИ
    • Геоинформационные системы
    • Биллинговые системы
    • CRM
    • CTRM/ETRM — системы управления складом
    • SRM (Supplier Relationship Management) — системы управления взаимоотношениями с поставщиками
    • BI (Business Intelligence) — аналитические системы
    • DMS (Document Management System) — СЭД (системы электронного документооборота)
    • CMS (Content Management System) — системы управления содержанием (контентом)
    • WMS (Warehouse Management System) — системы управления складом (СУС)
    • ERP-системы — системы планирования ресурсов предприятия
    • EAM-системы — системы управления основными фондами предприятия
    • MRM-системы — системы управления маркетинговыми ресурсами
    • MES-системы — системы оперативного (цехового) управления производством и ремонтами
    • Интеграционные шины данныx (ESB)

 

По сфере применения

  • Прикладное программное обеспечение предприятий и организаций. Например, финансовое управление, система отношений с потребителями, сеть поставок. К этому типу относится также ведомственное ПО предприятий малого бизнеса, а также ПО отдельных подразделений внутри большого предприятия. (Примеры: управление транспортными расходами, служба IT-поддержки)
  • Программное обеспечение, обеспечивающее доступ пользователя к устройствам компьютера.
  • Программное обеспечение инфраструктуры предприятия. Обеспечивает общие возможности для поддержки ПО предприятий. Это системы управления базами данных, серверы электронной почты, управление сетью и безопасностью.
  • Программное обеспечение информационного работника. Обслуживает потребности индивидуальных пользователей в создании и управлении информацией. Это, как правило, управление временем, ресурсами, документацией, например, текстовые редакторы, электронные таблицы, программы-клиенты для электронной почты и блогов, персональные информационные системы и медиаредакторы.
  • Программное обеспечение для доступа к контенту. Используется для доступа к тем или иным программам или ресурсам без их редактирования (однако может и включать функцию редактирования). Предназначено для групп или индивидуальных пользователей цифрового контента. Это, например, медиа-плееры, веб-браузеры, вспомогательные браузеры и др.
  • Образовательное программное обеспечение по содержанию близко к ПО для медиа и развлечений, однако в отличие от него имеет четкие требования по тестированию знаний пользователя и отслеживанию прогресса в изучении того или иного материала. Многие образовательные программы включают функции совместного пользования и многостороннего сотрудничества.
  • Имитационное программное обеспечение. Используется для симуляции физических или абстрактных систем в целях научных исследований, обучения или развлечения.
  • Инструментальные программные средства в области медиа. Обеспечивают потребности пользователей, которые производят печатные или электронные медиаресурсы для других потребителей, на коммерческой или образовательной основе. Это программы полиграфической обработки, верстки, обработки мультимедиа, редакторы HTML, редакторы цифровой анимации, цифрового звука и т. п.
  • Прикладные программы для проектирования и конструирования. Используются при разработке аппаратного и программного обеспечения. Охватывают автоматизированное проектирование (computer aided design — CAD), автоматизированный инжиниринг (computer aided engineering — CAE), редактирование и компилирование языков программирования, программы интегрированной среды разработки (Integrated Development Environments).

 

3. Жизненный цикл прикладной программы

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

анализ требований;

проектирование;

кодирование (программирование);

тестирование и отладка;

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

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

Постановка задачи

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

Разработка программы

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

Отладка

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

Внедрение

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


 

ТЕОРИЯ ПЕРВИЧНЫХ ПРОГРАММ

 

Теория первичных программ была предложена Маддуксом в качестве обобщения методологии структурного программи­рования для определения однозначной иерархической декомпози­ции блок-схем. В этой теории предполагается, что графы программ могут содержать три класса узлов (рис. 2):

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

узлы принятия решения - изображаются в виде ромбов с одной входящей дутой и двумя выходящими (истина и ложь). Эти узлы представляют предикаты, и управление из узла принятия решения передается дальше либо по ветви истина, либо по ветви ложь;

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

 

Любая блок-схема состоит только из этих трех компонентов.

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

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

 

 

На рис. 3 изображены все первичные программы, которые включают в себя не более четырех узлов. Первичные программы а, б, д, и представляют собой последовательности функциональных узлов. Первичная программа е — конструкция if-then, .ж — do-while, з - repeat-until, к - if-then-else, л - do-while-do.

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

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

10. ПОНЯТИЕ АЛГОРИТМА И ЕГО СВОЙСТВА

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

Алгоритм - это точное, сформулированное на определенном языке, конечное описание того или иного способа действия, осно­ванного на применении исполнимых элементарных однозначно трактуемых шагов.

Любой алгоритм имеет пять особенностей.

1) Конечность алгоритма (финитность). Означает, что алго­ритм всегда должен заканчиваться после конечного числа шагов.

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

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

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

2) Определенность алгоритма. Каждый шаг алгоритма должен быть точно определен, то есть действия, которые необходимо про­извести должны быть недвусмысленно определены в каждом воз­можном случае.

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

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

3) Наличие входных данных. Алгоритм имеет некоторое число
входных величин, заданных ему до начала работы.

Иногда это число может равняться нулю, однако это означает, что входные величины должны быть описаны как часть алгоритма. Например, алгоритм сложения числа 777 с числом 333. В этом слу­чае шаги 1 и 2 должны быть записаны так:

Шаг 1. Записать число 777.

Шаг 2. Под ним записать число 333

………

То есть, если даже входные величины отсутствуют, то какие-то величины будут описаны в самом алгоритме. В противном случае алгоритм не может быть выполнен.

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

5) Эффективность алгоритма. Алгоритм, который выполняет действие за меньшее число шагов признается более эффективным.

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


 

АЛГОРИТМ ДВОИЧНОГО ПОИСКА

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

Реализовать эту стратегию можно с помощью следующего алго­ритма, в котором учитывается возможность получения пустого списка.

procedure Search (< список>, < искомое_значение> ) if (< список> пуст)

then (Объявить поиск неудачным)

else

(Выбрать " средний" элемент в < список> в качестве

< проверяемый_элемент> )

(Выполнить один из следующих трех блоков инструкций, в зависимости от того, является ли < искомое значение> равным, меньшим или большим, чем < проверяемый элемент> )

Case 1: < искомое_значение> = < проверяемый_элемент> (Объявить поиск успешным)

Case 2: < искомое_значение> < < проверяемый_элемент> (Применить процедуру Search, чтобы определить, есть ли в части списка, предшествующей элементу < проверяемый элемент>, элемент < искомое_значение>, и if (тот поиск успешен

then (Объявить этот поиск успешным) else (Объявить этот поиск неудачным) Case 3: < искомое_значение> > < проверяемый__элемент> (Применить процедуру Search, чтобы определить, есть ли в части списка, следующей за элементом < проверяемый_элемент>, элемент < искомое_значение> и if (тот поиск успешен)

then (Объявить этот поиск успешным) else (Объявить этот поиск неудачным)

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

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

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

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


ОПТИМИЗАЦИЯ

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

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

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

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

К этому виду преобразований относятся также «чистки» тел ре­курсивных процедур, когда выражения в соответствующем цикле (или теле многократно вызываемой процедуры) выносятся и раз­мещаются перед входом в участок повторяемости — это так назы­ваемая чистка вверх.

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

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

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

Total: = Summa + Summa + Summa;

эффективнее выражения: Total: = 3 * Summa;

а операцию деления Summa: = Summa/2; лучше заменить на более быстрое умножение, которое приведет к тому же самому результату Summa: = Summa * 0.5;

Чистка программы. Данный способ повышает качество программы за счет удаления из нее ненужных объектов и конст­рукций. Набор преобразований этого типа включает в себя сле­дующие варианты оптимизации:

удаление несущественных операторов, то есть операторов, не влияющих на результат программы;

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

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

удаление идентичных операторов;

удаление процедур, к которым нет обращений.

Необходимость в такого рода чистках возникает потому, что очень часто программист «захлебывается» в общем количестве пе­ременных и процедур одного слишком большого модуля. Подчас он объявляет переменные, которые потом нигде в программе не использует.

Например, программист может объявить целочисленную пере­менную для организации цикла, а затем, спустя какое-то время, для организации другого цикла объявляет еще одну переменную, забыв о существовании предыдущей и возможности ее повторного ис­пользования.

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

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

Это так называемая экономия на типе переменной. Существует и еще ряд способов более экономного расходования памяти:

1) Глобальная экономия памяти подразумевает совмещение по памяти не существующих одновременно статических переменных. Модульное программирование также подразумевает разнесение объявлений несвязанных переменных в различные модули.

2) Изменение области существования переменной.

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

4) Экономия стека: при передаче массива в качестве параметра подпрограммы, следует использовать ссылку на массив. Помимо экономии памяти это приводит также и к экономии времени за счет того, что система не создает копии передаваемого массива в стеке.

 


 

25. Виды тестирования, разработка и выполнение тестов

Тестирование (testing) - любой вид деятельности, в рам­ках которого путем реального выполнения каких-либо задач прове­ряется соответствующая работа либо системы в целом, либо состав­ной ее части.

Тестирование программы (program testing) - проверка, которая проводится в ходе прогона программы с целью убедиться, работает ли она так, как требуется. Это осуществляется при выполнении од­ного или нескольких тестовых прогонов, при которых в программ­ную систему подаются входные (тестовые данные), а реакция сис­темы фиксируется для последующего анализа. Может осуществ­ляться как с ЭВМ, так и без ЭВМ.

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

Для обеспечения достаточной степени надежности тестирова­ния должен быть специальный отдел в фирме или привлечены про­граммисты из сторонних организаций. Первоначально разработчик сам устраняет мелкие ошибки. Когда компиляция модуля заверша­ется, и компилятор выдает соответствующее сообщение «Compile successful", программист обычно запускает откомпилированный фрагмент и производит несколько тестов.

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

Статистика свидетельствует, что стоимость тестирования со­ставляет не менее 50% всей стоимости начальной разработки.

Сколько бы сил, времени и денег не было потрачено на тести­рование, один из главных законов программирования действует с неотвратимостью рока: «Тесты могут доказать наличие ошибок в программе, но они не могут доказать их отсутствия» (Э. Дейкстра «Заметки по структурному программированию»).

При тестировании могут возникать следующие вопросы:

1) Искать все ошибки или грубейшие?

2)Если не все, то как установить порог допустимости ошибки?

3)Когда завершать тестирование?

4)Что делать, если сроки поджимают или нет ресурсов на дальнейшее тестирование?

5) Где остановиться в документировании тестов?

Ответы на них во многом зависят от того, что считать качест­венной программой?

Качественная программа - это программа, выполняющая зара­нее объявленные действия известным способом и не выполняющая никаких необъявленных действий.

Под объявленными действиями понимаются, в том числе, и ал­горитмы обработки данных. Таким образом, тестирование должно выполняться до тех пор, пока программа не избавится от всех не­объявленных действий (частным случаем которых является невер­ная обработка, то есть, в сущности, просто порча данных).

ХОД ТЕСТИРОВАНИЯ

В процессе тестирования программного обеспечения осуществляются следующие виды деятельности:

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

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

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

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

МЕТОДЫ ТЕСТИРОВАНИЯ

Существует два крайних подхода к проектированию тестов. Сторонники первого подхода создают тесты, исследуя вне­шние спецификации сопряжения программы или модуля, который необходимо протестировать. В этом случае программа является как бы «черным ящиком». Необходимо проверить все возможные ком­бинации и значения на входе. Обычно их слишком много даже для простейших алгоритмов. Для программы расчета среднего арифме­тического четырех чисел надо готовить 107 тестовых данных.

Сторонники второго подхода связывают тесты только с логикой программы. При этом стремятся, чтобы каждая команда была бы выполнена хотя бы один раз. Цикл должен выполняться один раз, ни разу, максимальное число раз. Такое тестирование всех путей извне также недостижимо. В программе из двух последовательных циклов, внутри каждого из которых включено ветвление на десять путей имеется 1018 путей расчета.

Чтобы построить разумную стратегию тестирования надо ра­зумно сочетать оба этих подхода и пользоваться математическими доказательствами.

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

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

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

Метод большого скачка. Каждый модуль тестируется автономно. По окончании автономного тестирования все модули интегрируются в готовую программную систему. Этот метод при­меняется, если программа мала и хорошо спроектирована по со­пряжениям.

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

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

АКСИОМЫ ТЕСТИРОВАНИЯ

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

1) хорошим считается тот тест, в котором высока вероятность обнаружения ошибок;

2)тестирование собственной программы существенно ослож­няется психологическими причинами;

3) необходимой частью тестов считается описание выходных результатов;

4)нужно готовить тесты как для правильных, так, и для непра­вильных данных; ,

5) нельзя тестировать «с лету», наскоком;

6) необходимо тщательно изучать результаты каждого теста;

7) по мере обнаружения все большего числа ошибок в про­грамме, возрастает вероятность обнаружения в ней еще большего числа ошибок;

8) тестирование программ должны осуществлять самые лучшие и опытные программисты;

9)одной из главных задач разработчиков программы является возможность осуществления ее тестирования;

10)нельзя изменять программу только с целью облегчить про­цесс ее тестирования;

11)чем раньше спроектирован тест, тем выше вероятность вы­явления ошибок. Лучше всего готовить тесты еще на этапе проек­тирования системы;


Поделиться:



Последнее изменение этой страницы: 2017-03-14; Просмотров: 660; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.134 с.)
Главная | Случайная страница | Обратная связь