Реферат: Проектирование процесса тестирования программного обеспечения

Курсовая работа

ПРОЕКТИРОВАНИЕПРОЦЕССА ТЕСТИРОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Студент группы

очного отделения

Научный руководитель:

Тамбов 2009


Содержание

Введение

1 Разновидности тестирования

1.1 Тестирование дефектов

1.2 Тестирование методом черного ящика

1.3 Структурное тестирование

1.4 Тестирование ветвей

1.5 Тестирование сборки

1.6 Нисходящее и восходящее тестирование

1.7 Тестирование интерфейсов

1.8 Тестирование с нагрузкой

2. Тестирование объектно-ориентированных систем

2.1 Тестированиеклассов объектов

2.2 Интеграцияобъектов

2.3 Инструментальные средства тестирования

Заключение


/>Введение

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

Цель исследования:спроектировать процесс тестирования программного обеспечения.

Задачи исследования:

-         найтии изучить материал по тестированию программного обеспечения;

-         разработатьтесты программного обеспечения;

-         спроектироватьпроцесс тестирования программного обеспечения;

Объект исследования:разработка программного обеспечения.

Предмет исследования:тестирование программного обеспечения.

Тип данногоисследования: разработка.


/>1. Разновидности тестирования

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

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

/>

Рисунок 1 – Этапытестирования ПО

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

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

Приразработке некритических, «обычных» систем подробные спецификации длякаждого системного компонента, как правило, не создаются. Определяются толькоинтерфейсы компонентов, причем за проектирование, разработку и тестированиеэтих компонентов несут ответственность отдельные программисты или группыпрограммистов. Таким образом, тестирование компонентов, как правило,основывается только на понимании разработчиками того, что должен делатькомпонент [1,2].

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

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

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

2.        Вобъектно-ориентированных системах, как правило, нет такой четкой иерархииобъектов, как в функционально-ориентированных системах. Поэтому такие методыинтеграции систем, как нисходящая или восходящая сборка (1.5), часто неподходят для объектно-ориентированных систем [1,3].

Такимобразом, в объектно-ориентированных системах между тестированием компонентов итестированием сборки нет четких границ. В таких системах процесс тестированияявляется продолжением процесса разработки, где основной системной структуройявляются объекты. Несмотря на то, что большая часть методов тестированияподходит для систем любых видов, для тестирования объектно-ориентированныхсистем необходимы специальные методы. Такие методы рассмотрены в разделе 2[1,2].

/>1.1 Тестирование дефектов

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

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

/>

Рисунок 2 – Процесстестирования дефектов

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

Изопыта тестирования (и эксплуатации) больших программных продуктов, таких, кактекстовые процессоры или электронные таблицы, вытекает, что необычныекомбинации функций иногда могут вызывать ошибки, но наиболее часто используемыефункции всегда работают правильно.[2,3].


1.2 Тестирование методом черного ящика

Тестированиеметодом черного ящика базируется на том, что все тесты основываются наспецификации системы или ее компонентов. Система представляется как«черный ящик», поведение которого можно определить только посредствомизучения ее входных и соответствующих выходных данных. Другое название этогометода – функциональное тестированиесвязано с тем, что испытательпроверяет не реализацию ПО, а только его выполняемые функции[2,3].

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

Основнаязадача испытателя – подобрать такие входные данные, чтобы среди них с высокойвероятностью присутствовали элементы множества 1е. Во многих случаяхвыбор тестовых данных основывается на предварительном опыте испытателя. Однакодополнительно к этим эвристическим знаниям можно также использоватьсистематический метод выбора входных данных, обсуждаемый в следующем разделе[2,3].

/>

Рисунок 3 –Тестирование методом черного ящика

/>1.3 Структурноетестирование

Методструктурного тестирования (рисунок 4) предполагает создание тестов на основеструктуры системы и ее реализации. Такой подход иногда называют тестированиемметодом «белого ящика», «стеклянного ящика» или«прозрачного ящика», чтобы отличать его от тестирования методомчерного ящика [3].

/>

Рисунок4 – Структурное тестирование

Какправило, структурное тестирование применяется к относительно небольшимпрограммным элементам, например к подпрограммам или методам, ассоциированным собъектами. При таком подходе испытатель анализирует программный код и дляполучения тестовых данных использует знания о структуре компонента. Например,из анализа кода можно определить, сколько контрольных тестов нужно выполнитьдля того, чтобы в процессе тестирования все операторы выполнились, по крайнеймере, один раз [2-4].

/> 

1.4Тестирование ветвей

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

Количествоветвей в программе обычно пропорционально ее размеру. После интеграциипрограммных модулей в систему, методы структурного тестирования оказываютсяневыполнимыми. Поэтому методы тестирования ветвей, как правило, используютсяпри тестировании отдельных программных элементов и модулей [2,3].

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

Методтестирования ветвей основывается на графе потоков управления программы. Этотграф представляет собой скелетную модель всех ветвей программы. Граф потоковуправления состоит из узлов, соответствующих ветвлениям решений, и дуг,показывающих поток управления. Если в программе нет операторов безусловногоперехода, то создание графа – достаточно простой процесс. При построении графапотоков все последовательные операторы (операторы присвоения, вызова процедур иввода-вывода) можно проигнорировать. Каждое ветвление операторов условногоперехода (if-then-elseили case) представленоотдельной ветвью, а циклы обозначаются стрелками, концы которых замкнуты наузле с условием цикла. На рисунке 5 показаны циклы и ветвления в графе потоковуправления программы бинарного поиска [3].


/>

Рисунок5 – Граф потоков управления бинарного поиска

Цельструктурного тестирования – удостовериться, что каждая независимая ветвь программывыполняется хотя бы один раз. Независимая ветвь программы – это ветвь, котораяпроходит, по крайней мере, по одной новой дуге графа потоков. В терминахпрограммы это означает ее выполнение при новых условиях. С помощью трассировкив графе потоков управления программы бинарного поиска можно выделить следующиенезависимых ветвей [3].

1,2,3,8,9

1,2, 3, 4, 6, 7, 2

1,2,3,4,5,7,2

1,2,3,4,6,7,2,8,9

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

Количествонезависимых ветвей в программе можно определить, вычислив цикломатическое числографа потоков управления программы [1-4]. Дипломатическое число С любогосвязанного графа G вычисляется поформуле

С(G) = количестводуг — количество узлов + 2

Дляпрограмм, не содержащих операторов безусловного перехода, значениецикломатического числа всегда больше количества проверяемых условий. Всоставных условиях, содержащих более одного логического оператора, следуетучитывать каждый логический оператор. Например, если в программе шестьоператоров if и один цикл while,то цикломатическое число равно 8. Если одно условное выражение являетсясоставным выражением с двумя логическими операторами (объединенными операторамиand или or),то цикломатическое число будет равно 10. Цикломатическое число программыбинарного поиска равно 4.

Послеопределения количества независимых ветвей в программе путем вычисленияцикломатического числа разрабатываются контрольные тесты для проверки каждойветви. Минимальное количество тестов, требующееся для проверки всех ветвейпрограммы, равно цикломатическому числу [3,4].

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

Динамическиеанализаторы программ – это инструментальные средства, которые работаютсовместно с компиляторами. Во время компилирования в сгенерированный коддобавляются дополнительные инструкции, подсчитывающие, сколько раз выполняетсякаждый оператор программы. Чтобы при выполнении отдельных контрольных тестовувидеть, какие ветви в программе выполнялись, а какие нет, распечатываетсярабочий профиль программы, где видны непроверенные участки [3].

/>1.5 Тестирование сборки

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

Вовремя тестирования сборки возникает проблема локализации выявленных ошибок.Между компонентами системы существуют сложные взаимоотношения, и приобнаружении аномальных выходных данных бывает трудно установить источникошибки. Чтобы облегчить локализацию ошибок, следует использовать пошаговыйметод сборки и тестирования системы. Сначала следует создать минимальнуюконфигурацию системы и ее протестировать. Затем в минимальную конфигурациюнужно добавить новые компоненты и снова протестировать, и так далее до полнойсборки системы [2,3,4].

Впримере на рисунке 6 последовательность тестов T1,Т2 и ТЗ сначала выполняется в системе, состоящей из модулей А и В (минимальнаяконфигурация системы). Если во время тестирования обнаружены дефекты, ониисправляются. Затем в систему добавляется модуль С. Тесты T1,T2 и ТЗ повторяются, чтобыубедиться, что в новой системе нет никаких неожиданных взаимодействий междумодулями А и В. Если в ходе тестирования появились какие-то проблемы, то,вероятно, они возникли во взаимодействиях с новым модулем С. Источник проблемылокализован, таким образом упрощается определение дефекта и его исправление.Затем система запускается с тестами Т4. На последнем шаге добавляется модуль Dи система тестируется еще раз выполняемыми ранее тестами, а затем новымитестами Т5 [3,4].

/>

Рисунок6 – Тестирование сборки

Конечно,на практике редко встречаются такие простые модели. Функции системы могут бытьреализованы в нескольких компонентах. Тестирование новой функции, такимобразом, требует интеграции сразу нескольких компонентов. В этом случаетестирование может выявить ошибки во взаимодействиях между этими компонентами идругими частями системы. Исправление ошибок может оказаться сложным, так как вданном случае ошибки влияют на целую группу компонентов, реализующих конкретнуюфункцию. Более того, при интеграции нового компонента может изменитьсяструктура взаимосвязей между уже протестированными компонентами. Вследствиеэтого могут выявиться ошибки, которые не были выявлены при тестировании болеепростой конфигурации [2-4].


/>1.6 Нисходящее ивосходящее тестирование

Методикинисходящего и восходящего тестирования (рисунок 7) отражают разные подходы ксистемной интеграции. При нисходящей интеграции компоненты высокого уровняинтегрируются и тестируются еще до окончания их проектирования и реализации.При восходящей интеграции перед разработкой компонентов более высокого уровнясначала интегрируются и тестируются компоненты нижнего уровня [2].

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


/> 

Рисунок7 – Нисходящее и восходящее тестирование

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

Нисходящееи восходящее тестирование можно сравнить по четырем направлениям.

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

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

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

4.        Наблюдение за ходом испытаний. Принисходящем и восходящем тестировании могут возникать проблемы, связанные снаблюдениями за ходом тестирования. В большинстве систем, разрабатываемыхсверху вниз, более верхние уровни системы, которые реализованы первыми, негенерируют выходные данные, однако для проверки этих уровней нужны какие-либовыходные результаты. Испытатель должен создать искусственную среду длягенерации результатов теста. При восходящем тестировании также может возникнутьнеобходимость в создании искусственной среды (тестовых драйверов) дляисследования компонентов нижних уровней [2-4].

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

/>1.7 Тестированиеинтерфейсов

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

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

Данныйтип тестирования особенно важен в объектно-ориентированном проектировании, вчастности при повторном использовании объектов и классов объектов. Объекты взначительной степени определяются с помощью интерфейсов и могут повторноиспользоваться в различных комбинациях с разными объектами и в разных системах.Во время тестирования отдельных объектов невозможно выявить ошибки интерфейса,так как они являются скорее результатом взаимодействия между объектами, чемизолированного поведения одного объекта [4].


/>

Рисунок8 – Тестирование интерфейсов

Междукомпонентами программы могут быть разные типы интерфейсов и соответственноразные типы ошибок интерфейсов [4,5].

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

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

3. Процедурныеинтерфейсы. Интерфейсы, в которых одна подсистемаинкапсулирует набор процедур, вызываемых из других подсистем. Такой типинтерфейса имеют объекты и абстрактные типы данных.

4. Интерфейсыпередачи сообщений. Интерфейсы, в которых одна подсистемазапрашивает сервис у другой подсистемы посредством передачи ей сообщения.Ответное сообщение содержит результаты выполнения сервиса. Некоторыеобъектно-ориентированные системы имеют такой тип интерфейсов; например, такработают системы клиент/сервер [4,5].

Ошибкив интерфейсах являются наиболее распространенными типами ошибок в сложныхсистемах [2] и делятся на три класса.

1.        Неправильное использование интерфейсов. Компонентвызывает другой компонент и совершает ошибку при использовании его интерфейса.Данный тип ошибки особенно распространен в параметрических интерфейсах;например, параметры могут иметь неправильный тип, следовать в неправильномпорядке или же иметь неверное количество параметров.

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

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

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

Другаяпроблема может возникнуть из-за взаимодействий между ошибками в разныхпрограммных модулях или объектах. Ошибки в одном объекте можно выявить только тогда,когда поведение другого объекта становится непредсказуемым. Например, дляполучения сервиса один объект вызывает другой объект и полагает, что полученныйответ правильный. Если объект неправильно понимает вычисленные значения,возвращаемое значение может быть достоверным, но неправильным. Такие ошибкиможно выявить только тогда, когда оказываются неправильными дальнейшиевычисления [4,5].

Несколькообщих правил тестирования интерфейсов:

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

2.        Еслимежду интерфейсами передаются указатели, всегда следует тестировать интерфейс снулевыми параметрами указателя.

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

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

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

6.        Обычностатические методы тестирования более рентабельны, чем специальное тестированиеинтерфейсов. В языках со строгим контролем типов, например Java,многие ошибки интерфейсов помогает обнаружить компилятор. В языках со слабымконтролем типов (например, С) ошибки интерфейса может выявить статическийанализатор, такой как LINT(обеспечивает статическую проверку, эквивалентную проверке компилятором). Крометого, при инспектировании программ можно сосредоточиться именно на проверкеинтерфейсов компонентов [3,5].

/>1.8 Тестирование снагрузкой

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

Некоторыеклассы систем проектируются с учетом работы под определенной нагрузкой.Например, система обработки транзакций проектируется так, чтобы обрабатывать100 транзакций в секунду; сетевая операционная система – чтобы обрабатыватьинформацию от 200 отдельных терминалов. При тестировании с нагрузкой выполнениетестов начинается с максимальной нагрузки, указанной в проекте системы, ипродолжается до тех пор, пока не произойдет сбой в работе системы. Данный типтестирования выполняет две функции [4].

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

2.        Чтобывыявить дефекты, которые не проявляются в обычных режимах работы, системаподвергается тестированию с нагрузкой. Хотя подобные дефекты не приводят кошибкам при обычном использовании системы, на практике могут возникнутьнеобычные комбинации стандартных условий; именно они воспроизводятся во времятестирования с нагрузкой [4].

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


/>2. Тестирование объектно-ориентированных систем

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

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

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

3.        Прианализе повторно используемых объектов их исходный код может быть недоступнымдля испытателей [3-5].

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

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

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

3.        Тестирование кластеров объектов. Нисходящаяи восходящая сборки оказываются не пригодными для создания групп связанныхобъектов. Поэтому здесь следует применять другие методы тестирования, напримероснованные на сценариях. Эти методы рассматриваются в разделе 2.2.

4.        Тестирование системы. Верификацияи аттестация объектно-ориентированной системы выполняется точно так же, как идля любых других типов систем [3,4,5].

Внастоящее время методы тестирования объектно-ориентированных систем достаточнохорошо разработаны [5]. В следующих разделах приведен обзор основных методовтестирования объектно-ориентированных систем.

/>2.1 Тестирование классовобъектов

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

1.        раздельноетестирование всех методов, ассоциированных с объектом;

2.        проверкувсех атрибутов, ассоциированных с объектом;

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

Использованиенаследования усложняет разработку тестов для классов объектов. Если класспредоставляет методы, унаследованные от подклассов, то необходимопротестировать все подклассы со всеми унаследованными методами. Понятие классовэквивалентности можно применить также и к классам объектов. Здесь тестовыеданные из одного класса эквивалентности тестируют одни и те же свойстваобъектов [5,6].

/>2.2 Интеграция объектов

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

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

1.        Тестирование сценариев и вариантов использования. Вариантыиспользования или сценарии описывают какой-либо один режим работы системы.Тестирование может базироваться на описании этих сценариев и кластеровобъектов, реализующих данный вариант использования.

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

3.        Тестирование взаимодействий между объектами. Этометод тестирования групп взаимодействующих объектов [4,6]. Этот промежуточныйуровень тестирования сборки системы основан на определении путей«метод-сообщение», отслеживающих последовательности взаимодействиймежду объектами.

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

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

/>2.3 Инструментальныесредства тестирования

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

Нарисунке 9 показаны возможные инструментальные средства тестирования и отношениямежду ними.

1.        Организатор тестов. Управляетвыполнением тестов. Он отслеживает тестовые данные, ожидаемые результаты итестируемые функции программы.

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

3.        Оракул. Генерирует ожидаемыерезультаты тестов. В качестве оракулов могут выступать предыдущие версиипрограммы или исследуемого объекта. При тестировании параллельно запускаютсяоракул и тестируемая программа и сравниваются результаты их выполнения.

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

5.        Генератор отчетов. Формируетотчеты по результатам проведения тестов.

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

7.        Имитатор. Существует несколькотипов имитаторов. Целевые имитаторы моделируют машину, на которой будетвыполняться программа. Имитатор пользовательского интерфейса – это программа,управляемая сценариями, которая моделирует взаимодействия с интерфейсомпользователя. Имитатор ввода/вывода генерирует последовательности повторяющихсятранзакций [4,5].


/>

Рисунок9 – Инструментальные средства тестирования

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

Длясоздания полного комплекса инструментального средства тестирования, какправило, требуется много сил и времени. Весь набор инструментальных средств,показанных на рис. 9, используется только при тестировании больших систем. Длятаких систем полная стоимость тестирования может достигать 50% от всейстоимости разработки системы. Вот почему выгодно инвестировать разработку высококачественныхи производительных CASE-средствтестирования [4,5,6].


/>Заключение

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


/>СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1.        Соммервилл,И. Инженерия программного обеспечения / пер. с англ. А.А. Минько, А.А. Момотюк,Г.И. Сингаевская. – М.: ВИЛЬЯМС, 2002. – 624 с., ил.

2.        Тестированиепрограмм / В.В. Липаев. – М.: Радио и связь, 1986. – 437 с.

3.        Брауде,Э. Технология разработки программного обеспечения / пер. с англ… – Спб.:ПИТЕР, 2004. – 655 с., ил.

4.        Орлов,С. Технологии разработки программного обеспечения / С.А. Орлов. – Спб.: ПИТЕР,2002. – 464 с., ил.

5.        Липаев,В. Надежность программных средств. – М.: СИНТЕГ, 1998. – 358 с.

6.        Вигерс,К. Разработка требований к программному обеспечению / пер. с англ… – М.:«Русская Редакция», 2004. – 576 с., ил.

еще рефераты
Еще работы по информатике, программированию