вівторок, 29 листопада 2016 р.

"Класи Еквівалентності" - Пояснення, Наздоганяючи Джеймса Баха


Півтора роки тому я ходив на співбесіду на один медичний проект, де мені вперше дали щось типу дизайну продукту із невеличкою технічною специфікацією. Завдання було: "Описати тестування продукту, використовуючи класи еквівалентності." І хоча я знав, що то таке "розбиття на класи еквівалентності", і на той час вже викладав теорію тестування тестерам-початківцям, це завдання привело мене у невеличкий ступор. Треба сказати, що самі дизайни й специфікація були дуже вдало підібрані та підготовлені, тест-лід була справжній молодець.
Після паузи (достатньо тривалої, щоб зіпсувати співбесіду) я спитав:
- Що я маю розбивати на класи еквівалентності? - Чим, звісно, підважив власну компетентність в очах тест-ліда.


- Інтерфейс, звичайно. - відповіла вона. - Які з представлених на дизайні полів можна об’єднати у класи еквівалентності?
Тут я зрозумів, що відбувається щось зовсім кепське, і теорію тестування мені, мабуть треба підтягнути до певних "загальновизнаних стандартів", чи шо...
- Усі означені поля, згідно зі специфікацією, мають виконувати певні функції. - обережно почав я - Класи еквівалентності використовують тоді, коли ми не хочемо виконувати тести, які ми вважаємо однаковими. Але коли я отримаю цей продукт для тестування, то я буду змушений відтестувати кожне із цих полів хоча б один раз, бо я ще не знаю, на скільки "еквівалентними" є ці поля, бо специфікація специфікацією, але те, як програмісти зробили, може суттєво від неї відрізнятися через обставини, про які я, як той, хто не був присутній під час їхньої роботи, не можу навіть здогадуватись. Тому єдине, для чого я від початку можу тут застосувати класи еквівалентності - це обов’язкові типи користувацького вводу, які я буду використовувати для тестування кожного із цих полів. - після цих слів на обличчі тест-ліда з’явився вираз, з якого я зрозумів, що навряд чи мене запросять тут працювати, але я продовжив - Для початку, кожне з полів, не залежно від специфікації, я протестую на можливість вводу в нього: нічого, рядка (1, 5, багато символів, дуже багато символів, спеціальні символи, різні види дужок, символи кінця рядка для різних систем, різні числові типи). Дані цих тестів я порівняю вимогами у специфікації, і, можливо, для якихось полів вже зроблю висновки про невідповідність. Тоді я продовжу тестувати далі з іншими даними та функціональними сценаріями, враховуючи отримані результати, щоб знайти якомога більше граничних умов, і вже за ними зробити якісь висновки щодо "еквівалентності" чи "нееквівалентності" самих полів.

Не знаю, через це, чи може через щось інше, не взяли мене туди. Але це не важливо. Після того було ще кілька питань з автоматизації, до яких я був не зовсім готовий.

Подорозі назад я читав Вікіпедію про https://en.wikipedia.org/wiki/Equivalence_partitioning .
І, почитавши також інші "загальновживані означення та пояснення", зрозумів, що їх я не буду давати своїм студентам у якості матеріалу для підготовки, а поясню все своїми словами:
  1. Розбивати на еквівалентні класи можна все, що завгодно: вимоги, тестові кроки, дані, набори даних, результати тестів, набори тестів, а також самих тестувальників і програмістів.
  2. Розбиття на класи тісно пов’язане із граничними умовами (мабуть, якщо ми розбиваємо велечину тяглого типу, таку як число, символьний рядок, розмір та ін.)
  3. Накладання різних еквівалентних класів народжує нове розбиття на класи еквівалентності.
  4. Класи еквівалентності (граничні умови) однієї величини треба використовувати для визначення класів еквівалентності (граничних умов) іншої пов’язаної величини. Наприклад, якщо введення у числове поле рядків 'Hello' та 'Привіт!!!!1111' призводить до двох різних повідомлень про помилку (навіть зовсім трішечки різних), то ці рядки (і тести що їх використовують) не можна вважати еквівалентними.


Такими поняттями думати про "Розділення на Класи Еквівалентності" чи "Equivalence Classes Partitioning" стало набагато легше. А особливо легше стало це пояснювати іншим людям.

Нарешті, я дуже радий, до зараз ще хтось крім мене, особливо, такий поважний як Джеймс Бах (James Bach) звернув на це увагу. Ось його стаття що змусила мене усе це пригадати: Rethinking Equivalence Class Partitioning, Part 1