что такое классы эквивалентности в тестировании
Граничные значения и классы эквивалентности
Одним из самых популярных вопросов на собеседовании на позицию QA Engineer является следующий: «Что такое граничные значения? Что такое классы эквивалентности?». Чаще всего эти два вопроса задают вместе, как один.
Иногда, скажем, на позицию Senior QA Engineer этот вопрос может быть даже завуалирован. Например:
— Какие практики тест-дизайна вы знаете/применяете?
— Как будете писать тест кейсы для каких-то определенных значений?
— Какие значения будете проверять?
— Как вы будете выделять граничные значения?
— В чем разница граничных значений и классов эквивалентности?
— И т.д.
Что ж, вопрос популярный, давайте разбираться.
Классы эквивалентности
Само собой, невозможно ввести все цифры, чтобы убедиться, что для каждой из них приложение будет работать правильно. Но давайте подумаем, а надо ли?
С точки зрения работы приложения между значением 500 и 600 разницы нет. Обе цифры будут умножены на соответствующий коэффициент. Следовательно, приложение будет работать одинаково в обоих случаях. Значит, эти проверки можно считать эквивалентными.
А вот еще пример. Для данного приложения целое число и дробное могут считаться эквивалентными значениями. Но только если дробное число имеет не более двух знаков после запятой: копейки и центы. Как будет обрабатываться дробное число с тремя знаками после запятой? Не важно, главное, что не так же, как целое число. И эта проверка уже эквивалентной не будет.
Суть разбиения проверок на классы эквивалентности в том, что в рамках одного класса достаточно совершить только одну проверку. Если все работает правильно, мы считаем, что для всех других эквивалентных значений все будет работать правильно.
Итак, какие проверки нам надо совершить для данного приложения?
— Проверить любое целое число или дробное с двумя знаками после запятой
— Проверить любое дробное число более чем с двумя знаками после запятой
— Проверить отрицательное число
— Проверить не числовое значение (ввести любой символ)
Граничные значения
Техника граничных значений является идейным продолжением техники эквивалентных классов. Считается, что помимо проверки значений из середины класса (например, значения 500 в нашем случае) еще надо проверять значения на границах. В нашем случае это значение 0, потому что отрицательного значения валюты быть не может.
Какой профит от этих техник?
Я довольно часто провожу собеседования начинающих инженеров в тестировании. На просьбу протестировать какое-то выдуманное приложение многие начинают действовать хаотично: вводить какие-то данные, которые придут им в голову, совершать беспорядочные манипуляции. Их действия выглядят случайными и неорганизованными.
Когда такие ребята выдыхаются и фантазия их истекает, они еще долго смотрят на листочек и пытаются что-то додумать. Они никогда не уверены, что протестировали все разумные кейсы. Вдруг случайно “придумается” еще какая-нибудь проверка поинтереснее. Знакомо? 🙂
Вышеописанные техники позволяют систематизировать проверки. Когда есть четкий план действий, полагаться на случайность не надо. Ваши действия выглядят осознанными, а вы сами понимаете, закончили проверку или нет.
Разговоры о тестировании
четвер, 9 січня 2014 р.
Классы эквивалентности и Граничные значения
На практике классы эквивалентности практически обязательны при тестировании всевозможных форм и полей ввода. Но Если заглянуть немного в глубь реализации функционала то эта техника может стать полезной не только для тестирования форм и полей ввода.
Приведем еще один пример (не такой классический как предыдущий, но не менее полезный):
У нас есть система работы с файлами. В системе возможны четыре типа файлов А, В, С, D. Каждый файл может находиться в одном из пяти состояний: Created, Edited, Loaded, Saved, Deleted.
Файл типа А может быть удален только в состоянии Created;
Файл типа В может быть удален только в состоянии Edited;
Файл типа C может быть удален только в состоянии Loaded;
Ну а файл типа D можно удалить только в состоянии Saved.
Это громоздкое условие можно неплохо иллюстрирует следующая таблица:
В данном примере важно помнить что подобное применение классов эквивалентности возможно только в случае если есть полная уверенность в том что за обработку удалений отвечает один и тот же код. В любом случае возможность познать систему чуть глубже окажет позитивный эффект на тестирование. Если же у вас достаточно времени на проведение 20ти тестов, то следует провести эти 20 тестов и спать спокойно. Жаль что времени почти всегда не хватает. Граничные значения являются идейным продолжением классов эквивалентности так как именно на границах этих классов проявляются, так интересующие нас, граничные значения.
Сами диапазон допустимых значений и особенно их границы за частую не так тривиальны как в нашем примере, но если вы можете их выделить и скомбинировать с классами эквивалентности то вы получите хорошее (качественное) покрытие тестами вашей функциональности. Немного о простом. Тест-дизайн. Часть 1Сегодня тестирование ПО, один из ключевых процессов создания продукта. Неважно, какую Вы используете методологию, подход, процесс, тестирование ПО так или иначе всегда существует в Вашем процессе. В последние годы (да даже наверное десятилетие) тестирование ПО сформировалось в отдельную область ИТ, которая постоянно развивается в мировом сообществе. И да, сегодня мы поговорим именно об обычных ручных (функциональных) тестировщиках, без уклона в автоматизацию, нагрузку и другие технические виды тестирования! Сейчас профессия ручного тестировщика – это одна из самых востребованных процессий ИТ и один из самых простых способов попасть в ИТ.
Потому что профессия ручного тестировщика на начальном этапе не требует специфических знаний и умений. Основное «знание» для тестировщика – это умение «разрушать» и аналитическое мышление. А главное – иметь нестандартный склад ума, находить нетривиальные решения поставленных задач. Некий монстр, умеющий крушить и ломать:) Hard skills всегда можно научить, а вот soft skills к сожалению научить очень сложно, потому что это характер человека, его отношение к чему-либо и т.д. Обычно я косо смотрю на руководителей, которые набирают себе специалистов по ручному тестирования по hard skills. Зачем Вы это делаете. (ответы можете оставить в комментариях) Ну да ладно, продолжим:) Если рассматривать технические особенности тестирования, которые должен знать ручной тестировщик, то их можно поделить на 2 основных части Мы с вами рассмотрим самую интересную и увлекательную часть тестирования – подготовку к тестированию. Именно от этой части процесса тестирования зависит то, насколько качественно и правильно вы выполните само тестирования, найдете необходимые дефекты и обеспечите Многие из вас, кто занимался тестированием, так или иначе, занимался подготовкой к тестированию. Отличие обычно лишь в том, насколько вы этот этап процесса тестирования формализуете. Если вы занимаете исследовательским тестированием, не пишите тестовые сценарии, И в этом цикле статей поговорим об этом. У себя на работе я часто провожу обучения для ручных тестировщиков, и сталкиваюсь с ситуациями, что вроде все слышали о техниках тест дизайна, но в работе их никто не применяет. Первое, когда тестировщиков учат на курсах по тестированию (или самообучение по книгам и статьям), то им рассказывают, как применять техники тест-дизайна на элементарных примерах. И главная проблема такого обучения, что тестировщики не могут перенести полученные знания на свои реальные задачи. То есть использовать техники тест-дизайна в повседневной работе. Если говорить простыми словами, то техники тест-дизайна – это совокупность правил, позволяющих правильно определить список проверок для тестирования. И самое важное, это В моей организации, как и общепринятых стандартах и практиках, задачами тест-дизайна являются: А начнем мы с самого простого, а именно о 2-х основных техниках тест-дизайна, про которые все слышали, и я уверен, применяли, но скорее всего на интуитивном уровне в своей работе. Что же такой классы эквивалентности? Класс эквивалентности (Equivalence class) – это набор входных (или выходных) данных ПО, которые обрабатываются программой по одному алгоритму или приводят к одному результаты. То есть, это некое множество значений, которое вы можете подставлять в программу и получать один и тот же результат. Результатом можем быть не только конкретные значения, действия программы, но и просто область применения. Поэтому, самые простые классы эквивалентности, на которые делятся проверки, это 2 основных класса: позитивные и негативные сценарии. Они есть всегда. Каждый тестировщик делит проверки на эти классы, но не каждый тестировщик знает, почему он это делает. Ответ – классы эквивалентности. Далее, каждый класс эквивалентности можем разделить на дополнительные классы и т.д. до того момента, пока проверки не будут приводить к точечным и конкретным результатам тестирования. Система скорринга рассчитывает процентную ставку по кредиту для клиента исходя из его возраста, который вводится в форму: Позитивными сценариями будут все значения, которые приводят к получению результата, негативными сценариями – значения, результаты которых не описаны, как ожидаемый результат. Далее мы делим класс позитивных сценариев 3 класса вводимых значений 18-24, 25-44 и 45 + В классе негативных сценариев мы формируем значения, исходя из необходимости проверки отказов программы, поэтому мы имеем 0, 1-17, отрицательные значения, ввод символов и т.д. Результатом данного разбиения будет значение или диапазон значений, в котором нам необходимо выполнить всего одну проверку с любым значением из диапазона данных. Могут возникнуть такие ситуации, как одно значение в диапазоне. Это тоже отдельный класс эквивалентности и тоже требует проверки. Еще одна особенность классов эквивалентности – это их применение. Я выделяю 3 уровня применения техник тест-дизайна для подготовки к тестированию. Классы эквивалентности в большей степени относятся к 1-му уровню и применяются для проверки элементов программы. Но идеологически, данный подход можно применять и для других уровней. Неотъемлемой часть проверки любого элемента является другая техника – граничные значения. Граничные значения дополняют эквивалентные классы, тем самым полностью покрывая проверки элемента ПО. Граничные значения – техника тест-дизайна, которая дополняет классы эквивалентности дополнительными проверками на границе изменения условий. Вернемся к нашему примеру ранее. Система скорринга рассчитывает процентную ставку по кредиту для клиента исходя из его возраста, который вводиться в форму: Если вы подумали о длине поля на страничке Хабры, или об отпуске в теплых странах, хочу вас расстроить, это не так 🙂 Что определить граничные значения нужно нечто иное. А именно, определить, какие значения являются начальным и конечным для нашего класса. И самое важное. Годы исследований в области тестирования показали, что бОльшая часть дефектов находится тестировщиками именно на стыке значений, которые меняют условия работы программы. Поэтому, помимо граничного значения мы используем для тестирования дополнительно 2 значения, значение перед границей и значение после границы. Границы наших классов: 17, 18, 19, 24, 25, 26, 44, 45, 46 и max. Далее исключаем повторяющиеся значения, и получаем значения для проверки элемента ввода данных. -1, 0, 1, 17, 18, 19, 24, 25, 26, 44, 45, 46, max. Значение max обычно уточняется у Заказчика или аналитика. Если не могут предоставить, то следует бросить его и не проверять необходимо подобрать значение, соответствующее здравому смыслу (вряд ли кто-то придет за кредитов в возрасте 100 лет). Следующий шаг, это наложить граничные значения на значения классов эквивалентности, исключить лишние проверки, пользуясь правилом «достаточно одного значения для проверки одного класса» и финализировать список. Если ранее у нас были 3 значения для 3-х классов, 19, 30 и 48, то после определения граничных значений, мы можем исключить из списка значения 30 и 48 и заменить их предграничными значениями, такими как 26 (вместо 30) и 46 (вместо 48). Граничные значения определяются не только для числовых значений, но и для буквенных (например, границы алфавита и кодировки), даты и времени, смысловых значений. Граница числовых значений зависит от формата ввода, если у вас целые числа, например, 2, то граничные значения будут 1 и 3. Если дробные значения, то границы для числа 2 уже будут 1,9 (1,99) или 2,1 (2,01) и т.д. Техники тест-дизайна 1-го уровня достаточно просты и понятны. Я думаю, вы скажете, да это легко, но зачем досконально проверять каждый элемент. И будете правы. Чаще всего их применяют при разработке нового ПО, потому что единожды после проверки элементов системы при разработке они в дальнейшем не часто подлежат изменению на уровне работы элемента. Не нужно постоянно проверять каждое значение элемента в каждом экране вашей программы, но имейте ввиду, что если изменяется логика обработки данных в элементах программы, необходимо повторно убедиться в правильности обработки значений элемента. Техники тест-дизайна 2-го уровня отвечают за вариативность и комбинаторику данных при проверке ПО. Основной техникой тест-дизайна parwise testing (попарное тестирование). Суть техники заключается в минимизации вариативности комбинаций проверок, достаточных для обеспечения высокого качества ПО. Простыми словами, в данной технике применяется правило Парето, 80 % качества можно достичь всего 20% проверок комбинаций данных. Данная техника была выведена путем более 15-тилетнего исследования IEEE в области анализа причин возникновения дефектов в системе. Результаты исследования показали, что 98% всех дефектов возникают при конфликте ПАР входных данных или ОДНОГО входного параметра. Почему же была выбрана пара? Конечно мы туда не пойдем нынче теория вероятности слишком сложна для простых ИТшников, все просто, возьмем обычную игру в кубик с 6-ю гранями. Пусть выпадение значения 2 – это дефект, тогда вероятность появления дефекта при кидании кубика равна 1/6=0,167. Если мы бросаем 2 кубика, то вероятность выпадения 2-х двоек (2 дефекта) становиться ниже и равна 0,167*0,167 = 0,028, для 3-х уже 0,005 и т.д. Получается, что вероятность возникновения дефекта при комбинации 3-х и более параметров настолько мала, что ее можно отброс ить. Когда мы с вами тестируем программу, всегда есть n количество элементов, которые влияют на результат, например, форма заполнения данных по кредитной заявке. Там есть n количество полей, которые в совокупности дают результат. Именно комбинаторику данных при заполнении полей мы проверяем с помощью попарного тестирования. Давайте рассмотрим на примере функциональности дистанционного оформления карты в банке. Если мы внимательно посмотрим, то увидим с Вами пять полей заполнения данных: Очень ВАЖНО, при использовании техники попарного тестирования, мы не говорим о результате тестирования. Нам важно проверить вариативность данных при заполнении заявки. Поле ФИО может принимать значения (классы): Идем дальше, дата рождения, также как и мобильный телефон, серия и номер паспорта можем иметь тоже 3 состояния: Чтобы проверить все комбинации данной формы нам бы понадобилось сделать свыше 1000 тестов, но используя попарное тестирование нам достаточно всего 9 тестов! Следующий шаг – составление ортогонального массива с комбинациями данных. Самым простым способом составления массива является попарное заполнение данными, начиная с элементов, имеющих наибольшее количество значений и далее по убыванию. Так как в нашем примере есть 4 элемента с одинаковым количеством значений, то мы можем выбрать любую пару. Мы берем ФИО и серия номер паспорта. Наша задача – перебрать все значения данной пары между собой: После перебора одной пары, мы создаем другую пару и начинаем перебирать значения (например номер мобильного телефона) Подключаем следующий элемент и так далее до полного заполнения всей таблицы, которая будет выглядеть так: Таким образом мы получаем 9 тестов с конкретными классами эквивалентности, которые мы можем вводить для проверки работы вариативности данных для формы. Классы мы можем заполнять конкретными значениями, которым мы получаем с вами используя 1 уровень техник тест-дизайна. В заключении данной статьи скажу, что рассмотренные техники тест-дизайна покрывают только часть проверок для тестирования программы, а именно проверка корректности работы элементов программы и результата их комбинаций в процессе ее работы. Во второй части мы перейдем к техникам тест-дизайна, позволяющим творить чудеса тестирования тестировать логику работы программы и процессы. Это очень важная составляющая ручного тестирования, и именно ее зачастую Вы тестируете на своей работе! QA evolutionКласс эквивалентности (equivalence class) — одно или несколько значений ввода, к которым программное обеспечение применяет одинаковую логику. Техника анализа классов эквивалентностиэто техника, при которой мы разделяем функционал (часто диапазон возможных вводимых значений) на группы эквивалентных по своему влиянию на систему значений. Такое разделение помогает убедиться в правильном функционировании целой системы — одного класса эквивалентности, проверив только один элемент этой группы. Эта техника заключается в разбиении всего набора тестов на классы эквивалентности с последующим сокращением числа тестов. Признаки эквивалентности тестов : Техника анализа классов эквивалентности алгоритм использования:Это главный шаг техники, т.к. во многом от него зависит эффективность её применения. На этом этапе следует выбрать один тест из эквивалентного набора тестов. На этом шаге следует выполнить тесты от каждого класса эквивалентности. Если есть время, можно протестировать еще несколько представителей от каждого класса эквивалентности. Следует иметь ввиду, при правильном определение классов эквивалентности дополнительные тесты скорее всего будут избыточными и дадут такой же результат.
Есть поле ввода с диапазоном допустимых значений от 1 до 100. Сами понимаете, что на 95 тестов на допустимые значения и на несметное количество тестов на недопустимые значения уйдет очень много времени. И здесь нам помогут классы эквивалентности. Исходя из того, с одной стороны, все допустимые значения могут влиять на поле ввода одинаково, следовательно все числа от 1 до 100 можно смело считать эквивалентными. С другой стороны, все недопустимые значения должны одинаково влиять на поле ввода (в идеале не должно быть возможности ввода этих значений в поле). Таким образом, есть уже несколько классов эквивалентности: Используя классы эквивалентности можно протестировать поле ввода минимум из 5 тестов. На практике классы эквивалентности обязательны при тестировании всевозможных форм и полей ввода. Плюсы и минусы техники анализа эквивалентных классов К плюсам можно отнести отсеивание огромного количества значений ввода, использование которых просто бессмысленно. К минусам можно отнести неправильное использование техники, из-за которого есть риск упустить баги.
протестировать поля ввода — в Manage->Users Add user поля Имя/Фамилия Условие: в поля ввода можно внести русские/английские буквы; заглавные и строчные буквы; т.к. имена и фамилии могут быть составными наличие символа “-” (дефис) Исходя из условий, разбиение на классы эквивалентности происходит следующим образом: Допустимые значения (блок позитивных тестов): Недопустимые значения (блок негативных тестов): Используя данные классы можно протестировать поля ввода с помощью 5 тестов. Из блока допустимых значений: Из блока недопустимых значений: Подытожим — Техника анализа классов эквивалентности одна из нескольких часто применяемых техник при планировании и разработке тестов. Значительно сокращает количество тестов необходимых для проверки функционала и время, с другой стороны в не опытных руках может стать инструментом который не только не поможет найти дефекты, но и сложит ошибочное представление о покрытие приложения тестами. говориМ о тестировании |