Учебник по тестированию. Guide to Software Test Design
Скачать 2.51 Mb.
|
Методика Шаги для тестирования методом классов эквивалентности просты. Во-первых, определите классы эквивалентности. Во-вторых, создайте тестовый сценарий для каждого класса эквивалентности. Вы можете создать дополнительный тестовый сценарий для каждого класса эквивалентности , если у вас есть время и деньги. Дополнительные тестовые сценарии могут дать вам чувство тепла и комфорта, но они редко находят дефекты, которые не смог найти первый сценарий. Понимание Icon На одном из моих уроков студентка, назовем ее Джуди, чувствовала себя очень не комфортно из-за того, что имела только один тестовый сценарий в каждом классе эквивалентности. Она хотела как минимум два для этого ощущения тепла и комфорта. Я показал, что если у нее есть время и деньги, то этот подход хорош, но предложенные дополнительные тесты, вероятнее всего, будут не эффективны. Я попросил ее проследить, как много раз дополнительные тесты находят дефекты, которые первый тест не нашел, и дать мне об этом знать. Я никогда не слышал Джуди снова. Разные типы входных данных требуют разных типов классов эквивалентности. Давайте рассмотрим четыре возможности. Давайте примем философию оборонительного тестирования для тестирования как верных, так и не верных входных данных. Тестирование некорректных входных значений часто является огромным источником дефектов. Если входные данные являются непрерывным диапазоном значений, тогда, как правило, существует один класс допустимых значений и два класса некорректных значений (ниже допустимого класса и выше него). Рассмотрим ипотечную компанию "Гуфи" (ИКГ). Она будет выдавать ипотеки людям с доходами от $1000 до $83333 в месяц. Те, у кого доходы ниже $1000 в месяц, не имеют на это права. Тем, у кого доходы выше $83333 в месяц, не нужна ипотека, т.к. они просто рассчитываются наличными. Для корректного входного значения можно было бы выбрать $1342 в месяц. Для некорректных - $123 в месяц и $90000 в месяц. Рисунок 3-1: Непрерывные классы эквивалентности Если входное состояние принимает дискретные значения в пределах диапазона допустимых значений, то обычно существует один корректный и два некорректных класса. ИКГ выдаст ипотеку для покупки от одного до пяти домов (помните, что это "Гуфи"). Ноль или меньше домов, а также шесть и больше - не корректные 20 входные значения. Также это не могут быть ни дробные, ни десятичные значения, такие как 2 1/2 или 3,14159. Рисунок 3-2: Дискретные классы эквивалентности Для корректного входного значения мы могли бы выбрать два дома. Некорректными могут быть -2 и 8. ИКГ может выдавать ипотеки только человеку. Они не выдают ипотеки компаниям, трастам, партнерствам или другим легальным организациям. Рисунок 3-3: Классы эквивалентности с одним возможным значением. Для верных входных данных мы должны использовать "человек". Для неверных мы можем использовать "корпорация" или "траст" или любую другую случайную строку. Сколько тестовых сценариев с неверными 21 данными следует создать? По крайней мере один; но можно сделать дополнительные тесты, чтобы чувствовать себя тепло и комфортно. ИКГ выдают ипотеки под квартиры, таунхаусы и частные дома. Они не выдают ипотеки под дома на двух хозяев, передвижные дома, домики на дереве или другие типы жилья. Рисунок 3-4: Классы эквивалентности с несколькими возможными значениями. Для верных входных данных мы можем выбрать значение "квартира", "таунхаус" или "частный дом". Несмотря на то, что правило указывает выбрать один тест из класса эквивалентности, более комплексный подход заключается в создании тестового сценария на каждое значение в классе эквивалентности. Это имеет смысл, если список верных значений мал. Но, если у нас список из пятидесяти штатов, Штат Колумбия и различные территории США, будете ли вы тестировать все значения? Что, если в списке все страны мира? Правильный ответ, конечно, зависит от рисков организации, если, как тестировщики, мы пропустим что-либо жизненно важное. Очень редко у нас будет время на создание отдельных тестов для каждого отдельного класса эквивалентности всех входных данных, вводимых в нашу систему. Чаще мы будем создавать тестовые сценарии, которые будут проверять некоторое число полей ввода одновременно. Например, мы можем создать один тестовый сценарий для следующих комбинаций входных данных: Ежемесячный доход Количество жилых помещений Заявител ь Вид жилья Результат $5000 2 Человек Квартира корректное значение Таблица 3-1: Тестовый сценарий для верных входных данных. Ключевой момент Очень редко у нас будет время на создание отдельных тестов для каждого отдельного класса эквивалентности для каждого входного значения. 22 Каждое из этих значений в диапазоне допустимых, поэтому мы ожидаем корректной работы системы и успешного отчета о прохождении теста. Заманчиво использовать такой же подход к тестированию неверных значений. Ежемесячный доход Количество жилых помещений Заявитель Вид жилья Результат $100 8 Партнерство Домик на дереве некорректное значение Таблица 3-2: Тестовый сценарий неверных данных. Это плохой подход. Если система принимает эти данные как верные, то ясно, что система не проверяет все четыре поля для ввода как следует. Но если система отклонит эти данные как неверные, то тестировщик не сможет понять, какое поле было отклонено. Например: ERRROR: 653х-2.7 неверные входные данные Во многих случаях ошибки в одном поле ввода могут свести на нет или замаскировать ошибки в другом поле, в результате чего система принимает данные как корректные. Лучше было бы проверить одно недопустимое значение за раз, чтобы убедиться, что система распознает его корректно. Ежемесячный доход Количество жилых помещений Заявитель Вид жилья Результат $100 1 Человек Квартира некорректное значение $1342 0 Человек Частный дом некорректное значение $1342 1 Корпорация Таунхаус некорректное значение $1342 1 Человек Домик на дереве некорректное значение Таблица 3-3: Набор тест-кейсов, различающихся на одно недопустимое значение. Чтобы чувствовать себя тепло и комфортно, входные значения (как корректные, так и некорректные) могут варьироваться. Ежемесячный доход Количество жилых помещений Заявитель Вид жилья Результат $100 1 Человек Квартира некорректное значение $1342 0 Человек Частный дом некорректное значение 23 $5432 3 Корпорация Таунхаус некорректное значение $10000 2 Человек Домик на дереве некорректное значение Таблица 3-3: Набор тест-кейсов, различающихся на одно недопустимое значение, но с различающимися допустимыми значениями. Другой подход к использованию классов эквивалентности заключается в изучении не входных, а выходных значений. Разделите выходные значения на классы эквивалентности, и тогда можно будет определить, какие входные значения будут причиной этих выходных значений. Преимущество такого подхода в том, что тестировщик направляется исследовать и таким образом тестирует все различные типы выходных данных. Но этот подход может быть обманчивым. В предыдущем примере одним из выходных значений системы отдела кадров было "НЕТ", что означало "Не нанимать". Беглый осмотр входных значений, которые должны привести к такому выходному значению, даст {0, 1, ..., 14, 15}. Отмечу, что это далеко не полный набор. Кроме того, набор {55, 56, ..., 98, 99} должен так же привести к выходному значению "НЕТ". Важно убедиться, что могут быть получены все потенциальные выходные значения, но не обманывайте себя, выбирая данные для классов эквивалентности, которые опускают важные входные значения. Примеры Пример 1 Ссылаясь на веб-страницу Заказа веб-сайта "Браун и Дональдсон", описанного в Приложении А, рассмотрим поле "Тип заказа". Дизайнер выбрал радио-кнопки для реализации выбора между операциями покупки или продажи. Это хороший дизайнерский выбор, потому что он уменьшает количество тестов, которые должен создать тестировщик. Если бы это было реализовано в виде текстового поля, в котором пользователь вводил "Купить" или "Продать", то тестировщику нужно было бы отличать корректные входные значения, такие как {Купить, Продать} и некорректные, такие как {Торговля, Ставка, ...}. А что насчет "купить" "кУпить", "КУПИТЬ"? Корректными или некорректными являются эти записи? Для определения их статуса тестировщику нужно было бы обратиться к требованиям. При реализации радио-кнопки не существует неправильных значений для выбора, поэтому и нет необходимости в проверке таких значений. Должны выполняться только корректные входы {Купить, Продать}. Понимание Icon Пусть ваши дизайнеры и программисты знают, когда они помогли вам. Они оценят эту мысль и смогут делать это снова. Пример 2 Опять же, ссылаясь на веб-страницу Заказа, рассмотрим поле "Количество". Входным значением в этом поле могут быть от одной до четырех цифр (0, 1, ..., 8, 9) с допустимым значением, большим или равным 1, 24 и меньшим или равным 9999. Набором допустимых входов являются {1, 22, 333, 4444}, а недопустимых - {-42, 0, 12345, SQE, #$@%}. Понимание Icon Часто ваши проектировщики и программисты используют средства проектирования графического интерфейса пользователя, которые могут ввести ограничения на длину и содержание полей ввода. Поощряйте их использование. Тогда во время тестирования вы можете сосредоточиться на получении уверенности в том, что этот инструмент должным образом реализует требования. Пример 3 На странице Заказа пользователь вводит символьный идентификатор, указывающий на акции для купли или продажи. Допустимыми символами являются {А, АА, AABC, AAC, ..., ZOLT, ZOMX, ZONA, ZRAN). Недопустимыми символами является любое сочетание символов, не включенных в список допустимых. Набор допустимых входных значений может быть {A, AL, ABE, ACES, AKZOY), в то время как набор недопустимых может быть {C, AF, BOB, CLUBS, AKZAM, 42, @#$%). Дополнительная информация Icon Нажмите на кнопку "Поиск символа" на странице Заказа сайта "Браун и Дональдсон", чтобы увидеть полный список символов акций. Пример 4 Изредка мы будем создавать отдельные наборы тестов для каждого входного значения. Обычно это наиболее эффективно для того, чтобы одновременно проверить несколько входных значений в течение тестирования. Например, следующие тесты объединяют Купить / Продать, Идентификатор и Количество. Купить / Продать Идентификатор Количеств о Результат Купить A 10 корректно Купить C 20 некорректно Купить A 0 некорректно Продать ACES 10 корректно Продать BOB 33 некорректно Продать ABE -3 некорректно Таблица 3-5: Набор тестов, включающих недопустимые значения по одному. Применения и ограничения 25 Тестирование классов эквивалентностей может значительно уменьшить количество тестов, которые должны быть созданы и выполнены. Такое тестирование больше всего подходит для систем, в которых большая часть входных данных принимает значения в пределах диапазонов или из наборов данных. Оно базируется на предположении, что данные из одного и того же класса эквивалентности по сути, обрабатываются в системе одинаковым образом. Самым простым способом проверить это предположение является спросить программиста о его реализации. Тестирование классов эквивалентности в равной степени применимо на модульном, интеграционном, системном и приемочном уровнях тестирования. Все это требует входных или выходных значений, которые могут быть разделены на основе системных требований. Резюме ● Тестирование классов эквивалентности - это техника, используемая для уменьшения числа тестовых наборов до выполнимого уровня при сохранении приемлемого уровня покрытия тестами. ● Эта простая техника используется интуитивно почти всеми тестировщиками, даже если они не знают о ней формально как о методе тест-дизайна. ● Класс эквивалентности представляет собой набор данных, которые либо одинаково обрабатываются модулем, либо их обработка выдает одинаковые результаты. При тестировании любое значение данных, входящее в класс эквивалентности, аналогично любому иному значению класса. Практика 1. Следующие упражнения относятся к веб-сайту Регистрационной системы Государственного университета, описанному в приложении Б. Определите классы эквивалентности и подходящие тест-кейсы для следующего: ● a. ZIP-код - пять цифр. ● b. Штат - двухсимвольная аббревиатура стандарта почты для штатов, районов, территорий и т.д. Соединенных Штатов. ● c. Фамилия - пятнадцать символов (включая алфавитные символы, точку, дефис, апостроф, пробел и цифры). ● d. Идентификатор пользователя - восемь символов, как минимум два из которых не алфавитные (число, спецсимвол, непечатаемый символ). ● e. Идентификатор студента - восемь символов. Первые два представляют собой номер студенческого общежития, а последние шесть являются уникальным шестизначным номером. Допустимые сокращения общежитий: AN (Annandale); LC (Las Cruces); RW (Riverside West); SM (San Mateo); TA (Talbot); WE (Weber) и WN (Wenatchee). Литература Beizer, Boris (1990). Software Testing Techniques . Van Nostrand Reinhold. 26 Kaner, Gem, Jack Falk and Hung Quos Nquyen (1999). Testing Computer Software (Second Edition) . John Wiley & Sons. Myers. Glenford J. (1979). The Art of Software Testing . John Wiley & Sons. 27 Глава 4. Тестирование граничных значений Введение Тестирование классов эквивалентности - это самая основная методика тест-дизайна. Она помогает тестировщикам выбрать небольшое подмножество из всех возможных тестовых сценариев и при этом обеспечить приемлемое покрытие. У этой техники есть еще один плюс. Она приводит к идее о тестировании граничных значений - второй ключевой технике тест-дизайна. В предыдущей главе описывались правила, которые указывали, каким образом будет происходить обработка заявок на вакансии в зависимости от возраста соискателя. Эти правила: ● от 0 до 16 - не принимаются ● от 16 до 18 - могут быть приняты только на неполный рабочий день ● от 18 до 55 - могут быть приняты как сотрудники на полный рабочий день ● от 55 до 99 - не принимаются Обратите внимание на проблемы на границах - это "края" каждого класса. Возраст "16" входит в два различных класса эквивалентности (как и "18", и "55"). Первое правило гласит не нанимать шестнадцатилетних. Второе правило гласит, что шестнадцатилетние могут быть наняты на неполный рабочий день. Тестирование граничных значений фокусируется на границах именно потому, что там спрятано очень много дефектов. Опытные тестировщики сталкивались с этой ситуацией много раз. У неопытных тестировщиков может появиться интуитивное ощущение, что ошибки будут возникать чаще всего на границах. Эти дефекты могут быть в требованиях (как показано выше), или в коде, как показано ниже. If (applicantAge >= 0 && applicantAge <= 16) hireStatus = "NO"; If (applicantAge >= 16 && applicantAge <= 18) hireStatus = "PART"; If (applicantAge >= 18 && applicantAge <= 55) hireStatus = "FULL"; If (applicantAge >= 55 && applicantAge <= 99) hireStatus = "NO"; Конечно, ошибка, которую допустили программисты - это неправильная проверка неравенства. Правильной является запись ">" (больше, чем) вместо "≥" (больше либо равно). Тестирование граничных значений фокусируется на границах, потому что там спрятано очень много дефектов. Наиболее эффективный способ поиска таких дефектов - просмотр либо требований, либо кода. Прекрасным руководством такого процесса является книга Гилба и Грэма "Инспектирование программ" Тем не менее, независимо от того, насколько эффективны наши осмотры, мы захотим протестировать код, чтобы проверить его правильность. Возможно, что тестируемая нами организация имеет в виду следующее: ● от 0 до 15 - не принимаются ● от 16 до 17 - могут быть приняты только на неполный рабочий день 28 ● от 18 до 54 - могут быть приняты как сотрудники на полный рабочий день ● от 55 до 99 - не принимаются А что насчет возраста -3 и 101? Обратите внимание, что требования не указывают, как должны быть рассмотрены эти значения. Мы можем догадаться, но "угадывание требований" не является приемлемой практикой. Следующий код реализует исправленные правила: if (applicantAge >= 0 && applicantAge <= 15) hireStatus = "NO"; if (applicantAge >= 16 && applicantAge <= 17) hireStatus = "PART"; if (applicantAge >= 18 && applicantAge <= 54) hireStatus = "FULL"; if (applicantAge >= 55 && applicantAge <= 99) hireStatus = "NO"; В этом примере интересными значениями на границах или вблизи них являются {-1, 0, 1}, {15, 16, 17}, {17, 18, 19}, {54, 55, 56} и {98, 99, 100}. Другие значения, например {-42, 1001, FRED, %$#@} могут быть включены в зависимости от предусловий документации модуля. Методика Для использования тестирования граничных значений есть простые шаги. Во-первых, нужно определить классы эквивалентности. Во-вторых, нужно определить границы каждого класса эквивалентности. В-третьих, создать тест-кейсы для каждого граничного значения, выбрав одну точку на границе, одну точку чуть ниже границы и одну точку чуть выше границы. "Ниже" и "выше" являются относительными величинами и зависят от единиц измерения данных. Если границей является число "16" и тип "integer", то точкой "ниже" является значение "15", а точкой "выше" - "17". Если границей является $5.00 и тип "доллары и центы США", то точкой "ниже" будет $4.99, а точкой "выше" - $5.01. С другой стороны, если значение $5 и тип "доллары США", то нижней точкой будет $4, а верхней - $6. Для создания тест-кейсов для каждого граничного значения выберите одну точку на границе, одну точку чуть ниже границы и одну точку чуть выше границы. Стоит отметить, что точка чуть выше границы может входить в другой класс эквивалентности. В таком случае не нужно дублировать тест. То же самое может быть верно по отношению точки чуть ниже границы. Конечно, если у вас есть ресурсы, то вы можете создать дополнительные тест-кейсы дальше от границ (в пределах классов эквивалентности). Как уже говорилось в предыдущей главе, эти дополнительные тест-кейсы могут заставить вас почувствовать себя тепло и комфортно, но они редко обнаруживают дополнительные дефекты. Тестирование граничных значений является наиболее подходящим там, где входные данные являются непрерывным диапазоном значений. Возвращаясь к ипотечной компании Гуфи, каковы интересные граничные значения? Для ежемесячного дохода границы составляют $1 000 и $83 333 в месяц (при условии, что единицей являются доллары США). 29 Рисунок 4-1: Граничные значения для непрерывного диапазона входных данных. Для тестирования границ в качестве тестовых данных выбраны {$999, $1000, $1001} на нижней границе и {$83332, $83333, $83334} на верхней границе. Поскольку компания Гуфи выдает ипотеку на покупку от одного до пяти домов, то ноль и меньше домов или шесть и больше будут являться недопустимыми входными значениями. Это тоже границы для тестирования. Рисунок 4-2: Граничные значения для разрывного диапазона входных данных. У нас редко будет время для того, чтобы создать отдельные тесты для каждого граничного значения каждого входного значения, которое вводится в систему. Чаще всего мы будет создавать несколько тестов, которые будут проверять некоторое количество полей ввода одновременно. |