21 января 2011 г.

Эффективное применение комбинаторных техник тест дизайна.

Долго не получалось добраться до блога, но вот я опять вещаю :). Сначала хочу напомнить, что мы уже разобрали 6 техник тест дизайна:
 * Allpairs Algorithm testing
 * Orthogonal Arrays Testing
 * State-Transition Testing
 * Decision Table Testing
 * Boundary Value Testing
 * Equivalence Class Testing

И перед тем как приступить к разбору новых техник тест-дизайна хотелось бы написать статью об использовании комбинаторных техник (например Orthogonal Arrays Testing или Allpairs Algorithm testing). Точнее о разумном использовании комбинаторных техник. На написание этой статьи меня натолкнула статья Баха и Шредера "Pairwise Testing: A Best Practice That Isn’t". Они в ней рассматривают проблемы конкретно allpairs algorithm testing, но как по мне, то все их замечания можно применить к любым комбинаторным техникам.

Статья их появилась из-за того, что многие стали относить allpairs algorithm testing к best practices заочно, считая его панацеей в тестировании. Мол применил технику и все ненужные тестовые данные исчезли, а остались исключительно отличные тестовые данные, которые обеспечивают идеальное тестовое покрытие. Ну и до поры до времени тестировщики чувствуют себя спокойно и уверенно, пока баги на удивление таки не начинают выползать. Почему такое может происходить мы попробуем рассмотреть в этой статье.

Где нас ждет провал?
Allpairs algorithm достаточно деликатная техника, ее нужно использовать с умом. Бах и Шредер приводят следующие случаи, когда вас может поджидать провал в использовании попарного тестирования:
 1. Вы определили неверные значения переменных/входные значения.
 2. Вы определили не достаточно хорошие оракулы.
 3. Вы не уделили внимание наиболее возможным комбинациям переменных.
 4. Вы не знаете как переменные взаимодействуют.

Будем разбирать наглядно что это значит.

23 ноября 2010 г.

Pairwise testing. Part 2 - AllPairs Algorithm.

Для начала напомню, что мы уже разобрали 5 техник тест дизайна:



Вступление.


Прошлым постом мы разобрались что такое попарное тестирование и тестирование ортогональными массивами. Теперь пришел черед allpairs algorithm. Эта комбинаторная техника была специально создана для попарного тестирования. Суть ее состоит в выборе таких комбинаций переменных, чтобы существовали все возможные комбинации значений каждой пары переменных.
Примечание: настоятельно рекомендуется перед изучением allpairs algorithm прочитать прошлый пост - orthogonal array testing.

Подход

Будем разбирать Allpairs algorithm сразу на примерах.

Начнем фантазировать. Представим что у нас есть формочка, на которой:
 * Есть список - Может принимать значение от 0 до 9 включительно.
 * Есть поле ввода - может принимать целочисленные значения от 1 до 99 включительно.
 * Есть чекбокс1 - принимает значения on или off.
 * Есть чекбокс2 - принимает значения on или off.
Сколько всего возможных комбинаций мы имеем? 99*10*2*2 = 3,960 возможных, валидных комбинаций. Тут нам придется либо умереть собственной смертью в попытках протестировать все комбинации, либо каким то способом уменьшить количество нужных нам комбинаций. Allpairs algorithm как раз и есть такой комбинаторный способ.

12 ноября 2010 г.

Pairwise testing. Part 1 - Orthogonal Arrays

До этого мы разобрали 4 техники тест дизайна:
 * Decision Table Testing
 * Boundary Value Testing
 * Equivalence Class Testing

 * State-Transition Testing

Вступление


Рассмотрим следующие ситуации:

 1. Сайт должен работать в 8 браузерах - Internet Explorer 6, 7, и 8, Netscape 6.0 и 7.0, Mozilla 2 и 3, и Opera 9; используя плагины - RealPlayer, MediaPlayer, без плагинов; на ОС - Windows  NT, 2003, XP, vista, 2008 и seven; на разных веб серверах - IIS, Apache, и WebLogic; запущенных на сервере с разными ОС - Windows 2003, 2008 и Linux.
  * 8 бразуеров
  * 3 плагина
  * 6 ОС клиента
  * 3 веб сервера
  * 3 ОС сервера
Итого: 1,296 возможных комбинаций.

 2. Банк создал новую систему обработки данных. У этого банка есть разные клиенты - очень важные клиенты, юр. лица и физ. лица; различные виды счетов - сберегательные, ипотечные кредиты, потребительские кредиты, и коммерческие кредиты; плюс отделения банка работают в разных штатах, с разной спецификой проведения фин. операций - Калифорния, Невада, Юта, Айдахо, Аризона и Нью-Мехико.
 * 4 типа клиентов
 * 5 типов аккаунтов
 * 6 штатов
Итого: 120 комбинаций.

 3. В ООП приложении, объект класса "А" может передать параметром объект класса "P", объекту класса "X". Классы B,C,и D унаследованы от класса A, и тоже могут передавать данные. Классы Q, R, S и T унаследованы от класса P и могут быть переданы как данные. Классы Y и Z унаследованы от класса X и могут получать данные.
 * 4 классов отправителя
 * 5 классов данных
 * 3 класса приемника.
Итого: 60 комбинаций.


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

В чём заключается магия выбора комбинаций Pairwise testing? Не следует пытаться проверить все комбинации значений для всех переменных, а проверять комбинации пар значений переменных(пока наверно не сильно понятно, но это ничего :)). Эта техника существенно уменьшает количество комбинаций для тестирования.
Например:
 * Если приложение имеет 4 разных входных параметра, и каждый из этих параметров может принимать 3 различных значения, то количество комбинаций будет 3 в 4 степени, а т.е. 81 комбинация. Попарно (pairwise), можно покрыть все входные значения за 8 тест кейсов.
 * Если приложение имеет 13 разных входных параметров, и каждый из этих параметров может принимать 3 различных значения, то количество комбинаций будет 3 в 13 степени, а т.е. 1 594 323 комбинаций. Попарно, можно покрыть все входные значения за 15 тест кейсов.
 * Если приложение имеет 20 разных входных параметров, и каждый из этих параметров может принимать 10 различных значения, то количество комбинаций будет 20 в 10 степени. Попарно, можно покрыть все входные значения за 180 тест кейсов.

Несколько исследований о pairwise testing:
 * Исследование, опубликованное Brownlie of AT&T в отношении тестирования local-area network-based electronic mail system гласит, что применение pairwise testing обнаружило на 28% дефектов больше, чем их оригинальный план разработки и выполнения 1 500 тест кейсов (позже количество тест кейсов было сокращено до 1 000 из-за временных ограничений), и заняло на 50% меньше ресурсов.
 * Kuhn и Reilly проанализированы недостатки, записанные в базе данных браузера Mozilla. Они определили, что pairwise testing обнаружили бы 76% найденных ошибок.
 * Wallace и Kuhn опубликовали исследование, проведенное Национальным институтом стандартов и технологий над ошибками ПО в отозванных мед. устройствах, собиравшимися на протяжении 15 лет. Они пришли к выводу, что 98% дефектов могли быть обнаружены с помощью pairwise testing. Т.е., по этой статистике, 98% ошибок возникают при конфликте ПАР входных данных или неверной интерпретацией 1 входного параметра системой, что pairwise testing покрывает. Еще раз, ошибки источником которых является комбинация 3х конкретных входных параметров составляет 2%.

Почему pairwise testing так хорошо работает? Неизвестно. В любом случае, успех применения этой техники на многих проектах является отличной мотивацией для ее использования.

Pairwise testing основывается на orthogonal arrays или the Allpairs algorithm. В этом посте будем рассматривать pairwise testing на основе orthogonal arrays.

9 ноября 2010 г.

State-Transition Testing

До этого мы разобрали 3 техники тест дизайна:
 * Decision Table Testing
 * Boundary Value Testing
 * Equivalence Class Testing

Теперь пришел черед 4ой техники - State-Transition testing.

Вступление

State-Transition testing, как и decision tables testing, отличный инструмент для фиксирования требований и описания дизайна приложения. В отличии от Decision tables testing, которые описывают конкретное состояние приложения, State-Transition testing описывают как эти состояния приложения могут меняться. Диаграммы определяют все события, которые возникают во время работы приложения, и как приложение реагирует на эти события.

Подход

Использование техники State-Transition testing легче объяснять сразу в работе, на примерах. Разберем 2 вида визуального представления этой техники:
 * State-Transition Diagrams (диаграмы)
 * State-Transition Tables (таблицы)

State-Transition Diagrams

Разберем пример резервации авиабилетов. Работает она следующим образом.

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




Круг представляет собой состояние системы резервации авиабилетов, в нашем случае это "Made" состояние. Стрелка показывает переход в состояние "Made". Описание под стрелкой ("giveInfo") это событие исходящие извне системы. Команда, в описании под стрелкой (после "/"), говорит нам, что система сделала какое то действие в ответ на событие, в нашем случае это запуск таймера. Черная точка указывает на начало/вход диаграммы.

8 ноября 2010 г.

Decision Table Testing

Мы уже рассмотрели 2 техники тест дизайна:
Пришел черед Decision Table Testing.

Introduction
Decision Tables - хороший инструмент для фиксирования требований и описания функциональности приложения. Этими таблицами очень удобно описывать бизнес логику приложения, и в добавок они могут служить отличной основой для создания тест кейсов.


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


Aproach
Decision Tables описывают логику приложения основываясь сущностях(свойствах/условиях) состояния системы. Каждая decision table должна описывать 1 состояние системы. Шаблон таблицы решений следующий:


Правило 1Правило 2Правило p
Сущность
Свойство-1
Свойство-2

Свойство-m

Действия
Действие-1
Действие-2

Действие-n

Не бойтесь, скоро все станет понятно ;)

Сущность(conditions) от 1 до m - это разные свойства системы, они представляют в таблице входные данные, которые можно ввести в систему. Действия(actions) от 1 до n - это действия которые могут произойти с указанной комбинацией сущностей, в зависимости от комбинации всех входных данных сущностей, действия принимают нужные значения. Каждое правило определяет уникальный набор входных данных всех свойств, которые приводят к исполнению конкретных действий.


Правило для создания тест кейсов просто - создайте как минимум 1 тест кейс на каждое правило в таблице. Просто поменяйте имена столбцов.
Тест кейс 1Тест кейс 2Тест кейс p
Входные данные
Свойство-1
Свойство-2

Свойство-m

Ожидаемый результат
Действие-1
Действие-2

Действие-n
По моему немного путано пока выглядит... Давайте разбирать на примерах.