четверг, 7 мая 2009 г.

Для начинающих: Эквивалентное разбиение, оно же разбиение на классы/по классам эквивалентности aka Equivalence partitioning


Чтобы тестирование было эффективным необходимы (прошу заметить, что только необходимы, а не достаточны) эффективные сценарии тестирования. Для создания эффективных сценариев тестирования существуют различные подходы, техники, методы. Рассмотрим разбиение на классы эквивалентности.

Согласно толковому словарю Ожегова класс - относительно целостное множество каких-нибудь единиц, существующее в составе сложного единства, расчленяемого на такие множества. Согласно БЭС, эквивалентность – отношение типа равенства.

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

Рассмотрим пример. Допустим, мы тестируем Интернет-магазин, продающий карандаши. В заказе необходимо указать количество карандашей (максиму для заказа – 1000 штук). В зависимости от заказанного количества карандашей различается стоимость:
  • 1 – 100 – 10 руб. за карандаш;
  • 101 – 200 – 9 руб. за карандаш;
  • 201 - 300 – 8 руб. за карандаш и т.д. С каждой новой сотней, цена уменьшается на рубль.

Если тестировать «в лоб», то, чтобы проверить все возможные варианты обработки заказанного количества карандашей, нужно написать очень много тестов (вспоминаем, что можно заказать аж 1000 штук), а потом еще все это и протестировать. Попробуем применить разбиение на классы эквивалентности. Очевидно, что наши входные данные мы можем разделить на следующие классы эквивалентности:


  1. Невалидное значение: >1000 штук;
  2. Невалидное значение: <=0;
  3. Валидное значение: от 1 до 100;
  4. Валидное значение: от 101 до 200;
  5. Валидное значение: от 201 до 300;
  6. Валидное значение: от 301 до 400;
  7. Валидное значение: от 401 до 500;
  8. Валидное значение: от 501 до 600;
  9. Валидное значение: от 601 до 700;
  10. Валидное значение: от 701 до 800;
  11. Валидное значение: от 801 до 900;
  12. Валидное значение: от 901 до 1000.

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

Приложение.
В качестве дополнения хочу привести парочку определений Equivalence partitioning.

Сем Канер, Джеймс Бах и Брет Петтихорд в Lessons Learned on Software Testing называют эту технику – Анализ классов эквивалентности (Equivalence class analysis) и определяют ее следующим образом:
«Класс эквивалентности – это набор значений переменной, который считается эквивалентным. Тестовые сценарии эквиваленты, если a) они тестируют одно и тоже; b) Если один из них выявляет ошибку, то и остальные выявят ее; c) Если одни из них не выявляет ошибку, то и остальные не выявят. Если определен класс эквивалентности, протестируйте только одно-два значения из него».

RSTQB

определяет технику следующим образом:

«Эквивалентное разбиение: Разработка тестов методом черного ящика, в которой тестовые сценарии создаются для проверки элементов эквивалентной области. Как правило, тестовые сценарии разрабатываются для покрытия каждой области как минимум один раз».

И напоследок, любая поисковая система (я предпочитаю, google) выдаст вам кучу определений, пояснений и примеров.