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


Практическая работа № 2.14. Тестовые примеры. Классы эквивалентности. Ручное



Pdf көрінісі
бет13/26
Дата12.10.2022
өлшемі2,59 Mb.
#152842
түріМетодические указания
1   ...   9   10   11   12   13   14   15   16   ...   26
Байланысты:
тестилеу лек русс

Практическая работа № 2.14. Тестовые примеры. Классы эквивалентности. Ручное 
тестирование в MVSTE 
Цель работы: Изучение классов и тестирование в MVSTE. 
Разработка тестовых примеров 
Непосредственно для тестирования программного обеспечения необходимо определить 
проверочные задания, выполняемые системой или ее отдельной частью. Такие задачи 
называются тестовыми примерами. 
Можно выделить два подхода к созданию тестовых примеров – исходя из 
функциональных требований (или из любой другой документации описывающей систему) и 
исходя из кода. Построение тестовых примеров, исходя из кода, и построение покрытия кода 
мы будем изучать позднее, а сейчас рассмотрим подробнее первый случай. При тестировании 
функциональности программы применяется подход "черного ящика", то есть для каждого 
требования к системе формируются тест-требования, которые, как правило, детализируют 
функциональные требования так, что на одно функциональное требование может приходиться 
несколько тест-требований. Сами тест-требования определяют, что должно быть 
протестировано, но не определяют, как. Конкретные значения задаются в тестовых примерах. 
Таким образом, одному тест-требованию может соответствовать сразу несколько тестовых 
примеров. 
Каждый тестовый пример состоит из набора входных значений и набора ожидаемых 
выходных значений. Рассмотрим спецификацию из "Место верификации среди процессов 
разработки программного обеспечения" . 
Начнем мы с тестирования отдельных составляющих программы (в данном случае – 
модуль математика) на допустимые данные и, в частности, на допустимые граничные данные. 


43 
Рассмотрим пример.
Требование: Для чисел, меньших либо равных MAXINT и больших либо 
равных MININT, частное которых меньше либо равна MAXINT и больше либо 
равна MININT и делитель не равен 0, функция деления должна возвращать правильное 
частное с точки зрения математики. 
Функция, которую будем тестировать: 
///  
/// частное 
///
 
///
делимое
///
делитель
/// частное 
public static long Div(long a, long b) 
В принципе, тестирование такой функции легко автоматизируется при помощи Unit 
Testing, так как у нее уровень доступа public, т.е. к ней можно обратиться из любого класса. К 
тому же она является статической, что позволит вызывать ее, не создавая экземляр 
класса CalcClass. Однако на этом семинаре мы рассмотрим ручное тестирование. 
Прежде всего по этому функциональному требованию составим тест-требования. На 
первый взгляд, очевидно, что вопрос для проверки звучит так: "Проверить, что для чисел, 
меньших либо равных MAXINT и больших либо равных MININT, частное которых меньше 
либо равно MAXINT и больше либо равно MININT и делитель не равен 0, функция деления 
возвращает правильное частное с точки зрения математики". Однако, это не совсем так. Фраза 
"меньших либо равных" сразу же наводит на мысль о проверке двух случаев – 1) хотя бы одно 
из чисел строго равно MAXINT и 2) все числа меньше, чем MAXINT. 
Замечание. Стоит заметить, что сейчас мы пишем очень подробные тест-требования, 
которые практически сразу можно отобразить в тестовые примеры. Такая ситуация 
наблюдается, например, в проектах, в которых тест-требования отсутствуют, а тестовые 
примеры пишутся сразу на основании функциональных требований. 
Тест-требования 
Проверить, что для чисел, меньших MAXINT и больших 0, функция деления возвращает 
правильное частное с точки зрения математики. 
Проверить, что для делимого, меньшего MAXINT и большего 0, и делителя, 
меньшего 0 и большего MININT, функция деления возвращает правильное частное с точки 
зрения математики. 
Проверить, что для делимого, меньшего 0 и большего чем MININT, и делителя, 
большего 0 и меньшего MAXINT, функция деления возвращает правильное частное с точки 
зрения математики. 
Проверить, что для чисел, меньших 0 и больших MININT, функция деления возвращает 
правильное частное с точки зрения математики. 
Проверить, что для делимого, равного 0, и делителя, меньшего MAXINT и большего 0, 
функция деления возвращает правильное частное с точки зрения математики. 
Проверить, что для делимого, равного 0, и делителя, большего MININT и меньшего 0, 
функция деления возвращает правильное частное с точки зрения математики. 
Проверить, что для делимого, равного MAXINT, и делителя, меньшего MAXINT и 
большего MININT, функция деления возвращает правильное частное с точки зрения 
математики. 
Проверить, что для делимого, равного MININT, и делителя, меньшего MAXINT и 
большего MININT, функция деления возвращает правильное частное с точки зрения 
математики. 
Проверить, что для делителя, равного MAXINT, и делимого, меньшего MAXINT и 
большего MININT, функция деления возвращает правильное частное с точки зрения 
математики. 


44 
Проверить, что для делителя, равного MININT, и делимого, меньшего MAXINT и 
большего MININT, функция деления возвращает правильное частное с точки зрения 
математики. 
Проверить, что для делителя, равного MAXINT, и делимого, равного MININT, функция 
деления возвращает правильное частное с точки зрения математики. 
Проверить, что для делителя, равного MAXINT, и делимого, равного MAXINT, функция 
деления возвращает правильное частное с точки зрения математики. 
Проверить, что для делителя, равного MININT, и делимого, равного MININT, функция 
деления возвращает правильное частное с точки зрения математики. 
Проверить, что для делителя, равного MININT, и делимого, равного MAXINT, функция 
деления возвращает правильное частное с точки зрения математики. 
Замечание: на самом деле, еще можно проверить, что функция корректно работает с 
однозначными и многозначными числами. К тому же надо убедиться, что она правильно 
обрабатывает все цифры в числах, а, например, не генерирует исключение, если одно из чисел 
содержит цифру 9, или результат ее работы не зависит от того, делится ли одно число на 
другое нацело или нет. 
Составим тестовые примеры и запишем их в виде таблицы. 
Таблица 4 
№ Входные 
значения: 
делимое, делитель 
Ожидаемый 
результат 
Номер тест-
требования 
Примечания 
1) 
43 / 21 

1) 
Самый частый случай – 
корректные 
входные 
данные 
2) 
87/-56 
-1 
2) 
-//- 
3) 
-9/2 
-4 
3) 
-//- 
4) 
-4321/-50 
86 
4) 
-//- 
5) 
0/1234567890 

5) 
Часто 
ошибки 
проявляются 
при 
нулевых 
значениях 
переменных 
6) 
0/-1098765432 

6) 
-//- 
7) 
2147483647/95 
22605091 
7) и 1) 
Проверка 
граничных 
условий 
8) 
-2147483648/9 
-238609294 
8) и 2) 
-//- 
9) 
99/2147483647 

9) и 1) 
-//- 
10) -87/-2147483648 

10) и 4) 
-//- 
11) -2147483648/2147483647 
-1 
11) 
А здесь - ошибка 
12) 2147483647/2147483647 

12) 
-//- 
13) -2147483648/-2147483648 

13) 
Ошибка 
14) 2147483647/-2147483648 

14) 
Ошибка 
Примечание. Здесь стоит так или иначе сымитировать работу функции и исследовать ее 
функциональность вместе со студентами. 
Заметим, что, мы не можем точно сказать, где произошла ошибка, — это хорошо видно 
из рис. 23


45 
Рисунок 24 
Части рисунка, помеченные вопросом – те части программы, в которых могла быть 
ошибка. Это сами вычисления, преобразование типов, ошибка GUI или передачи параметров 
(возможно, с некорректным преобразованием типов). О выявленных ошибках составляется 
отчет, который отдается разработчикам. При этом исправление ошибки в обязанности 
тестировщика 
не 
входит, 
так как 
он 
занимается 
именно тестированием, 
а 
не отладкой приложения. 
В первом тесте мы ввели два числа и получили верный результат. Все остальные тесты 
точно такие же. Но перебрать их все не получится, так как всевозможных комбинаций 
– 429496736 * 429496735= 184467445805156960. Очевидно, что большинство входных 
значений приведут к одному и тому же результату, и нет смысла проверять их все. Если 
программа пройдет первый тест, то она, вероятнее всего, пройдет и остальные. 
Если от двух тестовых примеров ожидается получить один и тот же результат, значит, 
они принадлежат одному классу. Такие множества примеров называются классами 
эквивалентности. Классы эквивалентности — это, в первую очередь, способ уменьшения 
необходимого числа тестовых примеров. При тестировании достаточно выполнить только 
один тестовый пример для каждого класса эквивалентности. Разбиение на классы 
эквивалентности особенно полезно, когда на вход системы может быть подано большое 
количество различных значений; тестирование каждого возможного значения привело бы к 
слишком большому объему тестирования. 
Классы эквивалентности 
Рассмотрим другой пример. 
Требование: Для чисел, каждое из которых меньше либо равно MAXINT и больше либо 
равно MININT, функция суммирования должна возвращать правильную сумму с точки зрения 
математики. 
Функция, которую будем тестировать: 
///  
/// Сложение 
///
 
///
слагаемое
///
слагаемое
/// сумма 
public static long Add(long a, long b) 
По сравнению с предыдущим требованием у этого явно есть недостатки. Здесь ничего не 
говорится об ограничениях на сумму. Можно легко подобрать два таких числа, которые будут 
удовлетворять заявленному требованию, а их сумма будет выходить за границы int. Скорее 
всего, это ошибка проектирования программы. Тогда необходимо исправить спецификацию и 
сообщить об этом остальным участникам разработки, прежде всего ее составителю. 
После исправлений функциональное требование будет выглядеть так: 
Требование: Для чисел, меньших либо равных MAXINT и больших либо 
равных MININT, сумма которых меньше либо равна MAXINT и больше либо равна MININT, 
функция суммирования должна возвращать правильную сумму с точки зрения математики. 


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

класса 
эквивалентности: MININT, MAXINT и промежуточное значение. Если подходить более 
серьезно, то можно выделить 7 допустимых классов эквивалентности: MININT, MININT+1, 
отрицательное не граничное число, 0, положительное не граничное число, MAXINT-
1, MAXINT. 
Учитывая то, что у нас два идентичных входных параметра, для полного рассмотрения 
всех классов эквивалентности необходимо составить и проверить 7*7=49 тестовых примеров, 
что все равно гораздо меньше, чем полный перебор. 
При этом, как показал тест с делением, ошибка может проявиться лишь в нескольких из 
этих 
примеров, 
которые 
не 
сильно 
отличаются 
от 
остальных граничных 
классов эквивалентности. 
Некоторые классы эквивалентности не удовлетворяют требованию так как выводят 
сумму за допустимые пределы. Поведение метода на таких входных данных описано в 
требовании 
На рис. 24 показано возможное выделение классов эквивалентности (цветами 
изображены области корректных и некорректных значений, а кружками — сами классы 
эквивалентности): 
Рисунок 25 
Иногда удобнее составить классы эквивалентности по выходному параметру (в данном 
случае их будет 7) и уже по ним подбирать входные данные и составлять тестовые примеры. 
Основной способ поиска дефектов – передача системе данных, не предусмотренных 
требованиями: слишком длинных или слишком коротких строк, неверных символов, чисел за 
пределами вычислимого диапазона и т.п. Неверные данные, как и допустимые, также можно 

Достарыңызбен бөлісу:
1   ...   9   10   11   12   13   14   15   16   ...   26




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет