Вход

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

Курсовая работа* по программированию
Дата добавления: 22 августа 2004
Язык курсовой: Русский
Word, rtf, 1.3 Мб (архив zip, 96 кб)
Курсовую можно скачать бесплатно
Скачать
Данная работа не подходит - план Б:
Создаете заказ
Выбираете исполнителя
Готовый результат
Исполнители предлагают свои условия
Автор работает
Заказать
Не подходит данная работа?
Вы можете заказать написание любой учебной работы на любую тему.
Заказать новую работу
* Данная работа не является научным трудом, не является выпускной квалификационной работой и представляет собой результат обработки, структурирования и форматирования собранной информации, предназначенной для использования в качестве источника материала при самостоятельной подготовки учебных работ.
Очень похожие работы



Министерство образования Российской Федерации

Государственное образовательное учреждение
среднего профессионального образования

Петровский колледж

Филиал г. Мурманск


Рассмотрено и одобрено цикловой комиссией программирования и ИТ

Председатель ________________

«______» _____________ 2003 г

.ЗАДАНИЕ

для курсового проекта студенту колледжа

Тимониной Зои Викторовне

группа № 423 отделение 2203 «Программное обеспечение вычислительной техники и автоматизированных систем»

Наименование темы: «Составление программы и тестирование ее по методу эквивалентных разбиений с указанием возможных ошибок»

Задание: Составить программу и оттестировать ее по методу эквивалентных разбиений (указать возможные ошибки). Тесты составить только для неправильных классов эквивалентности.

Пусть имеется несколько функций одного аргумента Х. Для каждой из них требуется распечатать таблицу значений на некотором отрезке. Отрезок [a,b] для каждой функции свой, также для каждой задан шаг изменения аргумента dX.

Функции:

F1(X) = X*sin(X) a=0.0 b=1.0 dX=0.1

F2(X) = X*cos(X) a=0.5 b=2.1 dX=0.2

F3(X) = a=2.0 b=4.75 dX=0.25



Руководитель работы__________________

_____________________________________

Дата выдачи задания___________________

Дата сдачи проекта____________________





Содержание:


Введение

  1. Общая часть

    1. Теоретические основы тестирования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    2. Обоснование выбора комплекса технических средств,

используемых для решения задачи. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    1. Обоснование выбора комплекса программных средств,

используемых для решения задачи. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

  1. Специальная часть

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

    2. Метод тестирования программы методом эквивалентных разбиений. . . . . . . . 25

    3. Спецификация программы, спецификация переменных. . . . . . . . . . . . . . . . . . . . . .30

    4. Алгоритм программы и его описание. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30

    5. Описание программы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

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

    7. Контрольный пример. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32

    8. Инструкция пользователю. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

Заключение

Приложение 1

Приложение 2

Список используемой литературы





Введение


В данном курсовом проекте рассматривается тестирование программного обеспечения, используемого для решения математической задачи нахождения ………. Тестирование программы является частью предмета «Технология разработки программного продукта», который рассматривает процессы: проектирования, кодирования, тестирования, эксплуатации и сопровождения программного обеспечения. Так как процесс тестирования по разным данным занимает от 20% до 50% ресурсных затрат на создание программного обеспечения, то тестированию уделено особое внимание в курсовом проекте. Тестирование – это один из наиболее трудоемких этапов создания программ (его трудоемкость составляет от 30 до 60% общей трудоемкости). Кроме того, доля его стоимости в общей стоимости программ имеет тенденцию возрастать при увеличении сложности комплексов программ и повышении требований к их качеству. Тестирование – это процесс исполнения программы с целью обнаружения ошибок. Исходя из термина «тестирование» можно сделать вывод, что программа тестируется не для того, чтобы показать, что она работает, а наоборот тестирование начинается с того, что делается предположение, что в программе есть ошибки (это предположение справедливо практически для любой программы).

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



1.Общая часть

1.1 Теоретические основы тестирования

Проектирование теста

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

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

Изучение методологий проектирования тестов дает ответ на этот вопрос.

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

Методологии, обсуждаемые в настоящей главе, представлены ниже.

Черный ящик Белый ящик

Эквивалентное разбиение Покрытие операторов

Анализ граничных значений Покрытие решений

Применение функциональных Покрытие условий

диаграмм Покрытие решений/условий

Предложение об ошибке Комбинаторное покрытие условий

Хотя перечисленные методы будут рассматриваться по отдельности, при проектировании эффективного теста программы рекомендуется использовать если не все эти методы, то по крайне мере большинство из них, так как каждый метод имеет определенные достоинства и недостатки (например, возможность обнаруживать и пропускать различные типы ошибок). Правда, эти методы весьма трудоемки, поэтому некоторые специалисты, ознакомившись с ними, могут не согласиться с данной рекомендацией. Однако следует представлять себе, что тестирование программы – чрезвычайно сложная задача. Для иллюстрации этого приведем известное изречение: «Если вы думаете, что разработка и кодирование программы – вещь трудная, то вы еще ничего не видели».

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

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

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

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


a

Y c

N

b



e

Y

N

d


Эквивалентная программа, написанная на языке PL/1, имеет вид:

M: PROCEDURE (A,B,X);

IF ((A>1) & (B=0)) THEN DO;

X=X/A;

END;

IF ((A=2) | (X>1)) THEN DO;

X=X+1;

END; END;

Можно выполнить каждый оператор, записав один – единственный тест, который реализовал бы путь ace. Иными словами, если бы в точке а были установлены значения A=2, B=0 и X=3, каждый оператор выполнялся бы один раз (в действительности Х может принимать любое значение).

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

Более сильный критерий покрытия логики программы известен как покрытие решений, или покрытие переходов. Согласно данному критерию должно быть записано достаточное число тестов, такое, что каждое решение на этих тестах примет значение истина и ложь по крайне мере один раз. Иными словами, каждое направление перехода должно быть реализовано по крайне мере один раз. Примерами операторов перехода или решений являются операторы DO (или PERFORM UNTIL в Коболе), IF, многовыходные операторы GO TO.

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

Изложенное выше предполагает только двузначные решения или переходы и должно быть модифицировано для программ, содержащих многозначные решения. Примерами таких программ являются программы на PL/1, включающие операторы SELECT (CASE) или операторы GO TO, использующие метку – переменную, программы на Фортране с арифметическими операторами IF, вычисляемыми операторами GO TO или операторами GO TO по предписанию, и программы на Коболе, содержащие операторы GO TO или операторами GO TO по предписанию, и программы на Коболе, содержащие операторы GO TO вместе с ALTER или операторы GO – TO – DEPENDING – ON. Критерием для них является выполнение каждого возможного результата всех решений по крайне мере один раз.

В программе, представленной на рисунке выше, покрытие решений может быть выполнено двумя тестами, покрывающими либо пути ace и abd, либо пути acd и abe. Если мы выбираем последнее альтернативное покрытие, то входами двух тестов являются А = 3, В = 0, Х =3 и А = 2, В = 1, Х = 1.

Покрытие решений – более сильный критерий, чем покрытие операторов, но и он имеет свои недостатки. Например, путь, где Х не изменяется (если выбрано первое альтернативное покрытие), будет проверен с вероятностью 50%. Если во втором решении существует ошибка (например, Х < 1 вместо Х > 1), то ошибка не будет обнаружена двумя тестами предыдущего примера.

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

DO K = 0 TO 50 WHILE (J + K < QUEST);

cодержит два условия: К меньше или равно 50 и J + K меньше, чем QUEST. Следовательно, здесь требуется тесты для ситуаций К 50, К > 50 (т.е. выполнение последней итерации цикла), J+K QUEST.

Программа на рисунке имеет четыре условия: А > 1, B = 0, A = 2 и Х > 1. Следовательно, требуется достаточное число тестов, такое, чтобы реализовать ситуации, где А > 1, A 1, B = 0 и В0 в точке а и А = 2, А2, X > 1 и X1 в точке b. Тесты, удовлетворяющие критерию покрытия условий, и соответствующие им пути:

  1. A = 2, B = 0, X = 4 ace.

  2. A = 1, B = 1, X =1 abd.

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

DO K=0 TO 50 WHILE (J+K

представляет собой двузначный переход (либо выполняется тело цикла, либо выход из цикла). Если использовать тестирование решений, то достаточно выполнить цикл при изменении К от 0 до 51 без проверки случая, когда условие в WHILE ложно. Однако при критерии покрытия условий необходим тест, который реализовал бы результат ложь условия J+K

Хотя применение критерия покрытия условий на первый взгляд удовлетворяет критерию покрытия решений, это не всегда так. Если тестируется решение IF (A&B), то при критерии покрытия условий требовались бы два теста – А есть истина, И есть ложь и А есть ложь, В есть истина. Но в этом случае не выполнялось бы THEN – предложение оператора IF. Тесты критерия покрытия условий для ранее рассмотренного примера покрывают результаты всех решений, но это только случайное совпадение. Например, два альтернативных теста

  1. A = 1, B = 0, X = 3.

  2. A = 2, B = 1, X = 1.

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













H Y I

N N

J Y


N

K Y





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

Недостатком критерия покрытия решений/условий является невозможность его применения для выполнения всех результатов всех условий; часто подобное выполнение имеет место вследствие того, что определенные условия скрыты другими условиями. В качестве примера рассмотрим приведенную схему передач управления в машинном коде программы на рисунке выше. Многоусловные решения исходной программы здесь разбиты на отдельные решения и переходы, поскольку большинство машин не имеет команд, реализующих решения с многими исходами. Наиболее полное покрытие тестами в этом случае осуществляется таким образом , чтобы выполнялись все возможные результаты каждого простого решения. Два предыдущих теста критерия покрытия решений не выполняют этого; они недостаточны для выполнения результат ложь решения Н и результата истина решения К. Набор тестов для критерия покрытия условий такой программы также является неполным; два теста (которые случайно удовлетворяют также и критерию покрытия решений/условий) не вызывают выполнения результата ложь решения I и результата истина решения К.

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

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

NOTFOUND=’1’ B;

DO I=1 TO TABSIZE WHILE (NOTFOUND); /*поиск в таблице*/

Последовательность операторов, реализующая процедуру поиска,

END;

  1. ITABSIZE и NOTFOUND есть истина.

  2. ITABSIZE и NOTFOUND есть ложь (обнаружение необходимого искомого значения до достижения конца таблицы).

  3. ITABSIZE и NOTFOUND есть истина (достижение конца таблицы без обнаружения искомого значения).

  4. ITABSIZE и NOTFOUND есть ложь (искомое значение является последней записью в таблице).

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

По этому критерию в программе должны быть покрыты тестами следующими восемь комбинаций:

  1. A > 1, B = 0.

  2. A >1, B 0.

  3. A 1, B = 0.

  4. A 0, B 0.

  5. A = 2, X > 1.

  6. A = 2, X 1.

  7. A 2, X > 1.

  8. A 2, X 1.


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

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

A = 2, B = 0, X = 4 покрывает 1,5

A = 2, B = 1, X = 1 покрывает 2,6

A = 1, B = 0, X = 2 покрывает 3,7

A = 1, B = 1, X = 1 покрывает 4,8

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

IF ((X = Y) & (LENGTH(Z) = 0) & END) THEN J = 1;

ELSE I = 1;

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

Таким образом, для программ, содержащих только одно условие на каждое решение, минимальным является критерий, набор тестов которого 1) вызывает выполнение всех результатов каждого решения по крайне мере один раз и 2) передает управление каждой точке входа (например, точке входа, ON-единице) по крайне мере один раз (чтобы обеспечить выполнение каждого оператора программы по крайне мере один раз). Для программ, содержащих решения, каждое из которых имеет более одного условия, минимальный критерий состоит из набора тестов, вызывающих выполнение всех возможных комбинаций результатов условий в каждом решении и передающих управление каждой точке входа программы по крайне мере один раз. [Слово «возможных» употреблено здесь потому, что некоторые комбинации условий могут быть нереализуемыми; например, в выражении (A > 2) & (A<10) могут быть реализованы только три комбинации условий.]

Анализ граничных значений.

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

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

  2. При разработке тестов рассматривают не только входные условия (пространство входов), но и пространство результатов (т.е. выходные классы эквивалентности).

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

  1. Построить тесты для границ области и тесты с неправильными входными данными для ситуаций незначительного выхода за границы области, если входное условие описывает область значений. Например, если правильная область входных значений есть -1,0 - +1,0, то написать тесты для ситуаций -1,0, 1,0, -1,001 и 1,001.

  2. Построить тесты для минимального и максимального значений условий и тесты, большие и меньшие этих значений, если входное условие удовлетворяет дискретному ряду значений. Например, если входной файл может содержать от 1 до 255 записей, то получить тесты для 0,1, 255 и 256 записей.

  3. Использовать правило 1 для каждого выходного условия. Например, если программа вычисляет ежемесячный расход и если минимум расхода составляет 0,00 дол., а максимум – 1165,25 дол., то построить тесты, которые вызывают расходы с 0,00 дол. и 1165,25 дол. Кроме того, построить, если это возможно, тесты, которые вызывают отрицательный расход и расход больше 1165,25 дол. Заметим, что важно проверить границы пространства результатов, поскольку не всегда границы входных областей представляют такой же набор условий, как и границы выходных областей (например, при рассмотрении подпрограммы вычисления синуса). Не всегда также можно получить результат вне выходной области, но тем не менее стоит рассмотреть эту возможность.

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

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

  6. Попробовать свои силы в поиске других граничных условий.

Чтобы проиллюстрировать необходимость анализа граничных значений, можно использовать программу анализ треугольника, приведенную ранее. Для задания треугольника входные значения должны быть целыми положительными числами, и сумма любых двух из них должна быть больше третьего. Если определены эквивалентные разбиения, то целесообразно определить одно разбиение, в котором это условие выполняется, и другое, в котором сумма двух целых не больше третьего. Следовательно, двумя возможными тестами являются 3-4-5 и 1-2-4. Тем не менее, здесь есть вероятность пропуска ошибки. Иными словами, если выражение в программе было закодировано как А+В>=C вместо А+В>C, то программа ошибочно сообщила бы нам, что числа 1-2-3 представляют правильный равносторонний треугольник. Таким образом, существенное различие между анализом граничных значений и эквивалентным разбиением заключается в том, что анализ граничных значений исследует ситуации, возникающие на и в близи границ эквивалентных разбиений.

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



















MTEST есть программа, которая сортирует различную информацию об экзаменах. Входом программы является файл, названный OCR, который содержит 80-символьные записи. Первая запись представляет название; ее содержание используется как заголовок каждого выходного отчета. Следующее множество записей описывает правильные ответы на экзамене. Каждая запись этого множества содержит «2» в качестве последнего символа. В первой записи в колонках 1-3 задается число ответов (оно принимает значение от 1 до 999). Колонки 10-59 включают сведения о правильных ответах на вопросы с номерами 1-50 (любой символ воспринимается как ответ). Последующие записи содержат в колонках 10-59 сведения о правильных ответах на вопросы с номерами 51-100, 101-150 и т.д. Третье множество записей описывает ответы каждого студента; любая запись этого набора имеет число «3» в восьмидесятой колонке. Для каждого студента первая запись в колонках 1-9 содержит его имя или номер (любые символы); в колонках 10-59помещены сведения о результатах ответов студентов на вопросы с номерами 1-50. Если в тесте предусмотрено более чем 50 вопросов, то последующие записи для студента описывают ответы 51-100, 101-150 и т.д. в колонках 10-59. Максимальное число студентов – 200. Форматы входных записей показаны на рисунке выше. Выходными записями являются:

  • Отчет, упорядоченный в лексикографическом порядке идентификаторов студента (процент правильных ответов) и его ранг;

  • Аналогичный отчет, но упорядоченный по качеству;

  • Отчет, показывающий среднее значение, медиану и среднее квадратическое отклонение качества ответов;

  • Отчет, упорядоченный по номерам вопросов и показывающий процент студентов, отвечающих правильно на каждый вопрос. (Конец спецификации).

Начнем методичное чтение спецификации, выявляя входные условия. Первое граничное входное условие есть пустой входной файл. Второе входное условие – карта (запись) названия; граничными условиями являются отсутствие карты названия, самое короткое и самое длинное названия. Следующими входными условиями служат наличие записей о правильных ответах и наличие поля числа вопросов в первой записи ответов. 1-999 не является классом эквивалентности для числа вопросов, так как для каждого подмножества из 50 записей может иметь место что-либо специфическое (т.е. необходимо много записей). Приемлемое разбиение вопросов на классы эквивалентности представляет разбиение на два подмножества: 1-50 и 51-999. Следовательно, необходимы тесты, где поле числа вопросов принимает значения 0, 1, 50, 51 и 999. Эти тесты покрывают большинство граничных условий для записей о правильных ответах; однако существует три более интересные ситуации – отсутствие записей об ответах, наличие записей об ответах типа «много ответов на один вопрос» и наличие записей об ответах типа «мало ответов на один вопрос» (например, число вопросов – 60, и имеются три записи об ответах в первом случае и одна запись об ответах во втором). Таким образом, определены следующие тесты:

    1. Пустой входной файл

    2. Отсутствует запись названия

    3. Название длиной в один символ

    4. Название длиной в 80 символов

    5. Экзамен из одного вопроса

    6. Экзамен из 50 вопросов

    7. Экзамен из 51 вопроса

    8. Экзамен из 999 вопросов

    9. 0 вопросов на экзамене

    10. Поле числа вопросов имеет нечисловые значения

    11. После записи названия нет записей о правильных ответах

    12. Имеются записи типа «много правильных ответов на один вопрос»

    13. Имеются записи типа «мало правильных ответов на один вопрос»

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

    1. 0 студентов

    2. 1 студент

    3. 200 студентов

    4. 201 студент

    5. Есть одна запись об ответе студента, но существуют две записи о правильных ответах

    6. Запись об ответе вышеупомянутого студента первая в файле

    7. Запись об ответе вышеупомянутого студента последняя в файле

    8. Есть две записи об ответах студента, но существует только одна запись о правильном ответе

    9. Запись об ответе вышеупомянутого студента первая в файле

    10. Запись об ответе вышеупомянутого студента последняя в файле

Можно также получить набор тестов для проверки выходных границ, хотя некоторые из выходных границ (например, пустой отчет 1) покрываются приведенными тестами. Граничными условиями для отчетов 1 и 2 являются: 0 студентов (так же, как тест 14); 1 студент (так же, как тест 15); 200 студентов (так же, как тест 16).

    1. Оценки качества ответов всех студентов одинаковы

    2. Оценки качества ответов всех студентов различны

    3. Оценки качества ответов некоторых, но не всех студентов одинаковы (для проверки правильности вычисления рангов)

    4. Студент получает оценку качества ответа 0

    5. Студент получает оценку качества ответа 100

    6. Студент имеет идентификатор наименьшей возможной длины (для проверки правильности упорядочения)

    7. Студент имеет идентификатор наибольшей возможной длины

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

    9. Число студентов таково, что отчет располагается на одной странице

Граничные условия отчета 3 (среднее значение, медиана, среднее квадратическое отклонение):

    1. Среднее значение максимально (качество ответов всех студентов наивысшее)

    2. Среднее значение равно 0 (качество ответов всех студентов равно 0)

    3. Среднее квадратическое отклонение равно своему максимуму (один студент получает оценку 0, а другой 100)

    4. Среднее квадратическое отклонение равно 0 (все студенты получают одну и ту же оценку)

Тесты 33 и 34 покрывают и границы медианы. Другой полезный тест описывает ситуацию, где существует 0 студентов (проверка деления на 0 при вычислении математического ожидания), но он идентичен тесту 14.

Проверка отчета 4 дает следующие тесты граничных значений:

    1. Все студенты отвечают правильно на первый вопрос

    2. Все студенты неправильно отвечают на первый вопрос

    3. Все студенты правильно отвечают на последний вопрос

    4. Все студенты отвечают на последний вопрос неправильно

    5. Число вопросов таково, что размер отчета несколько больше одной страницы

    6. Число вопросов таково, что отчет располагается на одной странице


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


Применение функциональных диаграмм.

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

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

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

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

  1. Спецификация разбивается на «рабочие» участки. Это связано с тем, что функциональные диаграммы становятся слишком громоздкими при применении данного метода к большим спецификациям. Например, когда тестируется система разделения времени, рабочим участком может быть спецификация отдельной команды. При тестировании компилятора в качестве рабочего участка можно рассматривать отдельный оператор языка программирования.

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

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

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

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

  6. Столбцы таблицы решений преобразуются в тесты.




Базовые символы для записи функциональных диаграмм.


Каждый узел диаграммы может находиться в двух состояниях: 0 или 1. 0 означает, отсутствует, 1 – присутствует.

  1. Функция тождества




Эта функция устанавливает, что если значение «а» есть 1, то и значение «в» есть 1. В противном случае, если «а» - 0, «в» тоже 0.

  1. Функция НЕ. Она устанавливает, что если значение «а» есть 1, то «в» есть 0. И, если «а» - 0, то «в» есть 1.







  1. Функция ИЛИ. Она устанавливает, что если или «а», или «в» есть 1, то «с» есть 1. В противном случае «с» есть 0.






  1. Функция И. Она устанавливает, что если и «а», и «в» есть 1, то «с» тоже есть 1. В противном случае «с» есть 0.






Функции И, ИЛИ разрешают иметь любое число входов.


Пример:

Спецификация: Символ в колонке 1 должен быть буквой – а или в, а символ в колонке 2 должен быть цифрой, в этом случае файл обновляется. Если первый символ не правильный, то выводится сообщение с кодом x12, а если второй символ не правильный, то выводится сообщение с кодом x13.

Причины:

  1. Символ а в колонке 1;

  2. Символ в в колонке 1;

  3. Цифра в колонке 2.

Следствие:

  1. - Файл обновляется

  2. – Выдается сообщение с кодом x12

  3. – Выдается сообщение с кодом x13

Функциональная диаграмма:









На диаграмме создан промежуточный узел 11. Хотя эта диаграмма отображает спецификацию, она содержит невозможную комбинацию причин – причины 1 и 2 не могут быть установлены в 1 одновременно. В большинстве программ определенные комбинации причин невозможны из-за каких-либо ограничений (например, символ не может принимать значение «а» или «в» одновременно). В этом случае используется дополнительные логические ограничения.


Еависключает


Iавсвключает


Одно и только одно















  1. Ограничение Е устанавливает, что Е должно быть истинным, если хотя бы одна из причин а или в принимает значение 1 (а и в не могут принимать значение 1 одновременно)

  2. Ограничение I устанавливает, что, по крайней мере, одна из величин а или в или с всегда должна быть равной 1 (а, в и с не могут принимать значение 0 одновременно)

  3. Ограничение О устанавливает, что одна и только одна из величин а или в должна быть равна 1

  4. Ограничение R устанавливает, что, если а принимает значение 1, то и в должно принимать значение 1 (т.е. невозможно, чтобы а=1, а в=0)




Ограничения для следствий:








Ограничение М устанавливает, что, если следствие а имеет значение 1, то следствие в должно принимать значение 0.

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

Функциональная диаграмма с ограничением «исключает»










Составим таблицу решений в соответствии с функциональной диаграммой. Причины имеют номера 1-3, следствие – 70-72.


№ теста

1

2

3

4

5

6

Причины

1

2

3

1

0

1

0

1

1

0

0

1

1

0

0

0

1

0

1

1

0

Следствие

70

71

72

1

0

0

1

0

0

0

1

0

0

0

1

0

0

1

0

0

1

Шестой тест можно не составлять, т.к. по входу ограничение Е, когда причины 1 и 2 не могут быть равны 1 одновременно.

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















1.2 Обоснование выбора комплекса технических средств используемых для решения задач

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

Наименование.

Модель.

PC

AD031001

CASE

ATX

MB

JW 663as – ultra

CPU

600 Pentium

Memory

192, 133 Dimm

HDD

6.200. W. D.

FDD

1.44

CD-ROM

Asus 8x

Video

M16 tht 132

Keyboard

St ps/2

Mouse

Gen G-06

Monitor

Samsung SyncMaster 500s


1.3 Обоснование выбора комплекса программных средств используемых для решения задач.

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










2. Специальная часть

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

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

Пусть имеется несколько функций одного аргумента Х. Для каждой из них требуется распечатать таблицу значений на некотором отрезке. Отрезок [a,b] для каждой функции свой, также для каждой задан шаг изменения аргумента dX.

Функции:

F1(X) = X*sin(X) a=0.0 b=1.0 dX=0.1

F2(X) = X*cos(X) a=0.5 b=2.1 dX=0.2

F3(X) = a=2.0 b=4.75 dX=0.25


    1. Метод тестирования программы

Эквивалентное разбиение.

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

Правильно выбранный тест этого подмножества должен обладать двумя свойствами:

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

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

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

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

Разработка тестов методом эквивалентного разбиения осуществляется в два этапа: 1) выделение классов эквивалентности и 2) построение тестов.

Выделение классов эквивалентности.

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

Входные условия

Правильные классы эквивалентности

Неправильные классы эквивалентности





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

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

  1. Если входное условие описывает область значений (например «целое данное может принимать значения от 1 до 999»), то определяются один правильный класс эквивалентности (1 значение целого данного 999) и два неправильных (значение целого данного < 1 и значение целого данного > 999).

  2. Если входное условие описывает число значений (например, «в автомобиле могут ехать от одного до шести человек»), то определяются один правильный класс эквивалентности и два неправильных ( ни одного и более шести человек).

  3. Если входное условие описывает множество входных значений и есть основание полагать, что каждое значение программы трактует особо (например, «известны способы передвижения на АВТОБУСЕ, ГРУЗОВИКЕ, ТАКСИ, ПЕШКОМ или МОТОЦИКЛЕ»), то определяется правильный класс эквивалентности для каждого значения и один неправильный класс эквивалентности (например, « НА ПРИЦЕПЕ»).

  4. Если входное условие описывает ситуацию «должно быть» (например, «первым символом идентификатора должна быть буква»), то определяются один правильный класс эквивалентности (первый символ – буква) и один неправильный (первый символ – не буква).

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

Построение тестов.

Второй шаг заключается в использовании классов эквивалентности для построения тестов. Этот процесс включает в себя:

  1. Назначение каждому классу эквивалентности уникального номера.

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

  3. Запись тестов, каждый из которых покрывает один и только один из непокрытых неправильных классов эквивалентности, до тех пор пока все неправильные классы эквивалентности не будут покрыты тестами.

Причина покрытия неправильных классов эквивалентности индивидуальными тестами состоит в том, что определенные проверки с ошибочными входами скрывают или заменяют другие проверки с ошибочными входами. Например, спецификация устанавливает «тип книги при поиске (ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА, ПРОГРАММИРОВАНИЕ или ОБЩИЙ) и количество (1-9999)». Тогда тест

XYZ 0

отображает два ошибочных условия (неправильный тип книги и количество) и, вероятно, не будет осуществлять проверку количества, так как и программа может ответить: «XYZ – НЕСУЩЕСТВУЮЩИЙ ТИП КНИГИ» и не проверять остальную часть входных данных.

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

Оператор DIMENSION используется для определения массивов. Форма оператора DIMENSION:

DIMENSION ad[,ad]…,

где ad есть описатель массива в форме

n(d[,d]…),

n – символическое имя массива, а d – индекс массива. Символические имена могут содержать от одного до шести символов – букв или цифр, причем первой должна быть буква. Допускается от одного до семи индексов. Форма индекса:

[lb:] ub,

где lb и ub задают нижнюю и верхнюю границы индекса массива. Граница может быть либо константой, принимающей значения от –65534 до 64535, либо целой переменной (без индексов). Если lb определена, то она может иметь отрицательное, нулевое или положительное значение. Как и все операторы, оператор DIMENSION может быть продолжен на нескольких строках (Конец спецификации).

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

Следующий шаг – построение теста, покрывающего один или более правильных классов эквивалентности, Например, тест

DIMENSION А (2)

Покрывает классы 1,4,7,10,12,15,24,28,29 и 40. Далее определяется один или более тестов, покрывающих оставшиеся правильные классы эквивалентности. Так, тест

DIMENSION А12345 (I,9,J4XXXX,65535,1,KLM,

X 100),BBB (-65534 : 100,0 : 1000,10 : 10,I : 65535)

покрывает оставшиеся классы. Перечислим неправильные классы эквивалентности и соответствующие им тесты:

(3) : DIMENSION

(5) : DIMENSION (10)

(6) : DIMENSION А234567 (2)

(9) : DIMENSION А.1 (2)

(11) : DIMENSION IA (10)

(13) : DIMENSION B

(14) : DIMENSION B (4,4,4,4,4,4,4,4)

(17) : DIMENSION B (4,A(2))

(18) : DIMENSION B (4,,7)

(21) : DIMENSION C (I.,10)

(23) : DIMENSION C (10,1J)

(25) : DIMENSION D (-65535:1)

(26) : DIMENSION D (65536)

  1. : DIMENSION D (4:3)

(37) : DIMENSION D (A(2):4)

(38) : DIMENSION D (.:4)

Эти классы эквивалентности покрываются 18 тестами. Читатель может при желании сравнить данные тесты с набором тестов, полученным каким-либо специальным методом.

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

Входные условия

Правильные классы эквивалентности

Неправильные классы эквивалентности

Число описателей массивов

Один (1), > одного (2)

Ни одного (3)

Длина имени массива

1-6 (4)

0 (5), >6 (6)

Имя массива

Имеет в своем составе буквы (7) и цифры (8)

Содержит что-то еще (9)

Имя массива начинается с буквы

Да (10)

Нет (11)

Число индексов

1-7 (12)

0 (13), >7 (14)

Верхняя граница

Константа (15), целая переменная (16)

Имя элемента массива (17), что-то иное (18)

Имя целой переменной

Имеет в своем составе буквы (19), и цифры (20)

Состоит из чего-то еще (21)

Целая переменная начинается с буквы

Да (22)

Нет (23)

Константа

-65534-65535 (24)

<-65534 (25), >65535 (26)

Нижняя граница определена

Да (27), нет (28)


Верхняя граница по отношению к нижней границе

Больше (29), равна (30)

Меньше (31)

Значение нижней границы

Отрицательное (32), нуль (33), >0 (34)


Нижняя граница

Константа (35), целая переменная (36)

Имя элемента массива (37), что-то иное (38)

Оператор расположен на нескольких строках

Да (39), нет (40)



    1. Спецификация программы. Спецификация переменных.

Название задачи: Вычисление;

Название программы: Functions;

Компьютер: IBM PC 286 и выше;

Программное обеспечение: Turbo Pascal 7.0.


Идентификатор

переменных

Назначение

Тип данных

Диапазон

a,b,dx,x,f1,f2,f3

a – начало диапазона

b – конец диапазона

dx – шаг

x – аргумент функции

f1,f2,f3 – значения функций

real

2,9*10-39…1,7*1038


    1. Алгоритм программы и его описание.

Блок – схема алгоритма приведена а Приложении 1 лист 001,002,003.

Блок №1 – Описание переменных.

Блок №2,8,14 – Присвоение переменным значений.

Блок №3,9,15 – Проверка условия.

Блок №4,10,16 – Расчет функции.

Блок №5,11,17 – Изменение х с шагом.

Блок №6,7,12,13,18,19 – Вывод расчетов на экран.


    1. Описание программы.

Текст программы смотри Приложение 2.

1 – Название программы.

2 – Подключение модуля очистки экрана.

3,4,5 – Блок объявления переменных.

6 – Пустая строка.

7 – Объявление процедуры.

8 – Начало процедуры.

9,10 – Присвоение значений переменным.

11 – Проверка условия.

12 – Расчет функции.

13 – Вывод на экран.

14 – Изменение шага.

15 – Конец цикла.

16 – Вывод пустой строки на экран.

17 – Конец процедуры.

18 – Пустая строка.

19 – Объявление процедуры.

20 – Начало процедуры.

21,22 – Присвоение значений переменным.

23 – Проверка условия.

24 – Расчет функции.

25 – Вывод на экран.

26 – Изменение шага.

27 – Конец цикла.

28 – Вывод пустой строки на экран.

29 – Конец процедуры.

30 – Пустая строка.

31 – Объявление процедуры.

32 – Начало процедуры.

33,34 – Присвоение значений переменным.

35 – Проверка условия.

36 – Расчет функции.

37 – Вывод на экран.

38 – Изменение шага.

39 – Конец цикла.

40 – Вывод пустой строки на экран.

41 – Конец процедуры.

42 – Пустая строка.

43 – Начало основной программы.

44 – Очистка экрана.

45,46,47 – Запрос процедуры.

48 – Ожидание нажатия клавиши для просмотра результатов.

49 – Конец программы.


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

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

Входные условия

Правильные классы эквивалентности

Неправильные классы эквивалентности

Границы диапазона

2,9*10-39 до 1,7*1038 (1)

<2>-39 (2), >1,7*1038 (3)

Верхняя граница

Константа(4), вещественная переменная(5)

Что-то иное(6)

Имя вещественной переменной начинается с буквы

Да(7), Нет(8)

Что-то иное (9)

Нижняя граница определена

Да(10), нет(11)


Верхняя граница по отношению к нижней границе

Больше(12), равно(13)

Меньше(14)

Нижняя граница

Константа(15), вещественная переменная(16)

Что-то иное(17)

Шаг изменения диапазона границы

Константа(18), единица(19)

Что-то иное(20)


Неправильные классы эквивалентности и соответствующие им тесты:

(2) a= 3,0*10-39;

(3) b= 1,8*1038;

(6) a= t;

    1. []x: real;

(14) a=2.0; b=1.0;

(17) k:integer;

    1. dx=p;


    1. Контрольный пример.

Входные данные:

a=0.0; b=1.0; dx=0.1


Выходные данные:

x=0.00 f1=0.00

x=0.10 f1=0.01

x=0.20 f1=0.04

x=0.30 f1=0.09

x=0.40 f1=0.16

x=0.50 f1=0.24

x=0.60 f1=0.34

x=0.70 f1=0.45

x=0.80 f1=0.57

x=0.90 f1=0.70

Входные данные:

a=0.5; b=2.1; dx=0.1

Выходные данные:

x=0.50 f2=0.44

x=0.70 f2=0.54

x=0.90 f2=0.56

x=1.10 f2=0.50

x=1.30 f2=0.35

x=1.50 f2=0.11

x=1.70 f2=-0.22

x=1.90 f2=-0.61

Входные данные:

a=2.0; b=4.75; dx=0.25

Выходные данные:

x=2.00 f3=1.41

x=2.25 f3=1.50

x=2.50 f3=1.58

x=2.75 f3=1.66

x=3.00 f3=1.73

x=3.25 f3=1.80

x=3.50 f3=1.87

x=3.75 f3=1.94

x=4.00 f3=2.00

x=4.25 f3=2.06

x=4.50 f3=2.12

x=4.75 f3=2.18

    1. Инструкция пользователю.

Программа предоставляется в виде исходного текста (.pas). Для того чтобы программа работала в среде Паскаль, ее необходимо откомпилировать. Это делается следующим образом:

  1. Необходимо нажать следующее сочетание клавиш ALT+F9, CTRL+F9

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



  1. При необходимости рассчитать другой диапазон с другим шагом, необходимо изменить значения переменных a, b, dx в функциях fun1, fun2, fun3. Затем сохранить программу нажав клавишу F2. Далее смотри пункт 1,2.


























Приложение 1

Лист 001
















































Лист 002



001

8





















































Лист 003



002

14

Приложение 2

program Functions; (1)

uses crt; (2)

var (3)

a,b,dx,x:real; (4)

f1,f2,f3:real; (5)

(6)

procedure fun1; (7)

begin (8)

a:=0.0; b:=1.0; dx:=0.1; (9)

x:=a; (10)

while (x>=a) and (x<=b) do begin (11)

f1:=x*sin(x); (12)

writeln(' x=',x, ' f1=' ,f1); (13)

x:=x+dx; (14)

end; (15)

writeln; (16)

end; (17)

(18)

procedure fun2; (19)

begin (20)

a:=0.5; b:=2.1; dx:=0.2; (21)

x:=a; (22)

while (x>=a) and (x<=b) do begin (23)

f2:=x*cos(x); (24)

writeln(' x=' ,x, ' f2=' ,f2); (25)

x:=x+dx; (26)

end; (27)

writeln; (28)

end; (29)

(30)

procedure fun3; (31)

begin (32)

a:=2.0; b:=4.75; dx:=0.25; (33)

x:=a; (34)

while (x>=a) and (x<=b) do begin (35)

f3:=sqrt(x); (36)

writeln(' x=' ,x, ' f3=' ,f3); (37)

x:=x+dx; (38)

end; (39)

writeln; (40)

end; (41)

(42)

begin (43)

clrscr; (44)

fun1; (45)

fun2; (46)

fun3; (47)

readkey; (48)

end. (49)






























































Заключение.

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

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




































Список использованной литературы.

  1. Г. Майерс «Искусство тестирования программ» 1982 г.

  2. Б.В. Архангельский «Поиск устойчивых ошибок в программах» 1989 г.



© Рефератбанк, 2002 - 2024