Тестирование по принципу «черного ящика» 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Тестирование по принципу «черного ящика»



Лабораторная работа № 12

(2 часа)

«Тестирование и отладка»

Цели работы:

1. Разрабатывать тесты для приложений;

2. Тестировать приложения методом черного ящика;

3. Тестировать приложения методом белого ящика.

Теоретическая часть:

Стратегия тестирования

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

- постановка задачи для тестов;

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

- написание(кодирование) тестов;

- тестирование тестов;

- выполнение тестов;

- изучение результатов тестирования.

Стратегия тестирования может лежать между двумя крайними проявлениями:

Тестирование модуля.

Цель тестирования модуля – выявление несоответствия между логикой работы модуля и его внешними спецификациями (описанием функций, входных и выходных данных, внешних эффектов). Сначала модуль рассматривается как «Черный ящик», после чего исследуется внутреннее устройство для подготовки дополнительных тестов.

 

Процесс состоит из 4 шагов:

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

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

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

4) Проверить чувствительность к входным данным (возникновение ситуаций деления на ноль и т.д.)

Выполнение тестов.

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

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

Тестирование внешних функций – выполняется после тестирования модулей и сопряжений между ними. Назначение - найти несоответствие программной системы и ее внешних спецификаций.

Спецификации программной системы составляются для отдельных функций на этапе проектирования.

 

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

 

Основу метода составляют два положения:

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

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

1) выделение классов эквивалентности;

2) построение тестов.

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

Граничные условия - это ситуации, возникающие на, выше или ниже границ входных классов эквивалентности.

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

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

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

Тем не менее, существует несколько общих правил этого метода:

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

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

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

4) Использовать правило 2 для каждого выходного условия. Если вход или выход программы есть упорядоченное множество (например, последовательный файл, линейный список, таблица), то сосредоточить внимание на первом и последнем элементах этого множества. Попробовать свои силы в поиске других граничных условий. Анализ y = 0 (в зависимости от того, какой тест был выбран по методу граничных условий) - тест также можно совместить с предыдущими 6 тестами; 2.4. По методу предположения об ошибке добавим тест: все коэффициенты - нули. Всего получили 20 тестов по всем четырем методикам. Если еще попробовать вложить независимые проверки, то возможно число тестов можно еще сократить. (Не забудьте для каждого теста заранее указывать результат!).

 

Стратегия тестирования

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

- постановка задачи для тестов;

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

- написание(кодирование) тестов;

- тестирование тестов;

- выполнение тестов;

- изучение результатов тестирования.

Стратегия тестирования может лежать между двумя крайними проявлениями:

Тестирование модуля.

Цель тестирования модуля – выявление несоответствия между логикой работы модуля и его внешними спецификациями (описанием функций, входных и выходных данных, внешних эффектов). Сначала модуль рассматривается как «Черный ящик», после чего исследуется внутреннее устройство для подготовки дополнительных тестов.

 

Процесс состоит из 4 шагов:

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

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

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

4) Проверить чувствительность к входным данным (возникновение ситуаций деления на ноль и т.д.)

Выполнение тестов.

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

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

Тестирование внешних функций – выполняется после тестирования модулей и сопряжений между ними. Назначение - найти несоответствие программной системы и ее внешних спецификаций.

Спецификации программной системы составляются для отдельных функций на этапе проектирования.

 

Класс исключений Exception -базовый класс всех исключений в Delphi.(Модуль SysUtils).

Все предопределенные в Delphi классы исключений являются прямыми или косвенными наследниками класса Exception. Класс Exception наследует также все функции своего базового класса TObject, в частности, полезную для идентификации неизвестного исключения функцию ClassName.

2. Для написания защищенного кода в Delphi используются следующие структуры как try … except … end и try … finalli … end.

Рассмотрим первую структуру:

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

Раздел except может использоваться двумя способами. При первом способе в нем могут располагаться любые выполняемые операторы, кроме обработчиков исключений on...do. Это могут быть операторы сообщений об ошибке, операторы освобождения ресурсов и т.д. Второй и главный способ использования раздела except - обработка исключений. В этом случае в него могут включаться только обработчики исключений: операторы on...do и необязательный обработчик любых исключений, предваряемый ключевым словом else. При наличии такого обработчика блок имеет вид:

try

{Исполняемый код}

except

on............;

on............;

else <обработчик всех не перехваченных ранее событий>;

end;

 

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

3. Операторы on … do

Оператор on...do служит для обработки исключений в разделе except блока try...except. Он имеет две формы:

 

on < класс исключения> do <оператор>;

и

on <имя>: <класс исключения>

do <операторы, в которых можно использовать конструкцию

<имя>.<имя свойства>>

 

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

После обработки исключения оно разрушается.

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

Задание 1

Тестирование программы решения квадратного уравнения (Тестирование условных переходов).

Задание 2

Тестирование программы вычисления факториала. (Тестирование цикла)

2.1 Создать форму с компонентами: EditN, BtnRes, StRes.:

 

2.2   Набрать обработчик на кнопку BtnRes:

 

procedure TForm1.BtnResClick(Sender: TObject);

var n,i: integer; F: real;

begin

try

n:= StrToInt(EditN.Text);

except

showmessage('Ошибка в типе данных!');

exit;

end;

F:= 1;

for i:= 1 to n do begin

F:= F * i;

end;

StRes.Caption:= FloatToStr(F);

end;

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

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

 

Контрольные примеры:

 

Значение а а!
5 125
0 1
1 1
-5 ошибка ввода!!!
м ошибка ввода!!!

2.4. Сделать вывод о правильности работы программы и перечислить все найденные ошибки в работе программы.


Оценивание работы:

На оценку «4» - Задание 1

На оценку «5» - Задание 1, Задание 2

Лабораторная работа № 12

(2 часа)

«Тестирование и отладка»

Цели работы:

1. Разрабатывать тесты для приложений;

2. Тестировать приложения методом черного ящика;

3. Тестировать приложения методом белого ящика.

Теоретическая часть:

Стратегия тестирования

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

- постановка задачи для тестов;

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

- написание(кодирование) тестов;

- тестирование тестов;

- выполнение тестов;

- изучение результатов тестирования.

Стратегия тестирования может лежать между двумя крайними проявлениями:

Тестирование модуля.

Цель тестирования модуля – выявление несоответствия между логикой работы модуля и его внешними спецификациями (описанием функций, входных и выходных данных, внешних эффектов). Сначала модуль рассматривается как «Черный ящик», после чего исследуется внутреннее устройство для подготовки дополнительных тестов.

 

Процесс состоит из 4 шагов:

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

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

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

4) Проверить чувствительность к входным данным (возникновение ситуаций деления на ноль и т.д.)

Выполнение тестов.

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

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

Тестирование внешних функций – выполняется после тестирования модулей и сопряжений между ними. Назначение - найти несоответствие программной системы и ее внешних спецификаций.

Спецификации программной системы составляются для отдельных функций на этапе проектирования.

 

Тестирование по принципу «черного ящика»

 

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

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

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

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

 

Стратегия "черного ящика" включает в себя следующие методы формирования тестовых наборов:

- эквивалентное разбиение;

- анализ граничных значений;

- анализ причинно-следственных связей;

- предположение об ошибке.

 

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

 

Основу метода составляют два положения:

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

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

1) выделение классов эквивалентности;

2) построение тестов.



Поделиться:


Последнее изменение этой страницы: 2021-03-09; просмотров: 245; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.196.217 (0.061 с.)