Що не так з використанням техніки «Аналіз граничних значень»
Привіт, шановні колеги. Мене звати Володимир Поздняков. Я QA-інженер з майже
Минулого разу ми обговорили тему використання техніки аналізу класів еквівалентності, та чому без глибшого її розуміння можливо допускати помилки у виявленні тих самих класів.
Сьогодні пропоную продовжити обговорення стосовно не менш вживаної та важливої техніки, а саме «Аналіз граничних значень». І сьогодні, як завжди, моїм опонентом буде славнозвісний експерт Легковайті Тестущенко.
Застосування техніки тестування «Аналіз граничних значень»
Я: Ми більш менш розібрались, що лежить в основі класів еквівалентності та на що треба звертати увагу для більш точного та кваліфікованого визначення цих самих класів. А що там з граничними значеннями? Чи знайома тобі ця техніка?
Легковайті Тестущенко: Ну, ти таке питаєш [закочує очі до неба]... Та звісно, знайома! Це ж перше, з чого починаються будь-які курси з тестування.
Я: Чудово! То про що ж нам каже ця техніка? Вангую, що тобі знов допоможе всемогутній гугл? :)
Легковайті Тестущенко: А то! Ось, що кажуть нам декілька відповідей з інтернету:
Або так:
І так:
Я: Ага. Отже, резюмуючи відповіді, говоримо, що аналіз граничних значень — це визначення значень, які лежать на межах класів еквівалентності, і щоб нам провести тестування за цією технікою, треба взяти 3 значення на кожній межі:
- на границі;
- зліва від границі;
- справа від границі.
Вірно?
Легковайті Тестущенко: Так! Сам же бачиш, що вірно [невпевнено примружується]... Ще скажи, що щось і тут не так — не повірю, бо це ж майже скрізь так написано і так використовується.
Я: Нууу... Так, проте не так :)
Легковайті Тестущенко: Твою ж.. Що на цей раз не так?
Я: Нумо розбиратися. І, як завжди, краще це буде зробити на прикладі. Візьмемо якусь надпросту вимогу:
Якщо користувач ввів число менше 1, то система повинна вивести «Х»,
якщо 1 і більше — вивести «Y».
Доволі просто, чи не так?
Легковайті Тестущенко: Ага [з підозрою].
Я: Тоді давай зобразимо це, як нам рекомендується, у вигляді числового променя з граничним значенням 1 та двома значеннями з боків:
Все вірно? Чи може я щось упустив?
Легковайті Тестущенко: Так. Все так. Навіть малюнок вийшов схожий з тими, що в інтернеті.
Я: Круто.Тоді, щоб у нас було повне розуміння, мушу запитати, а чи знаєш ти, чому ж нам так важливо перевіряти граничні значення, і чому стверджується, що саме на границях концентрується найбільша кількість помилок? Чим це викликано?
Легковайті Тестущенко: Звісно, знаю [у голосі чуються нотки роздратування]. Будь-яке програмне забезпечення — це по суті своїй програмний код. І всі умови, де є розгалуження логіки, як у твоєму прикладі, в програмному коді формуються однаково, використовуючи спеціальні знаки порівняння, подібні до тих, які використовуються в математичних виразах, тобто > (більше), < (менше), >= (більше або дорівнює), <= (менше або дорівнює).
І якщо в цьому випадку ми маємо доволі просте порівняння у вигляді <1 та >=1, то в реальному житті такі логічні вирази можуть бути доволі складними, що в рази підвищує ймовірність помилки.
Наприклад, якщо розробник зробив помилку і замість >= поставив >, тобто в нашому випадку: <1 та >1. Тоді ми бачимо, що значення 1 ніколи не увійде ні в який діапазон, і це призведе до неочікуваного результату.
Я: Ого, дякую. Яка розгорнута відповідь. Все саме так, як ти кажеш, і як приклад коду це може бути щось на кшталт цього:
function getRelatedData(num) {
if (num < 1) {
return "X";
} else {
return "Y";
}
}
Все ж таки круто, що тестувальники розуміють, звідки «ноги ростуть». Отже, повернімося до нашого випадку.
Головна проблема в тому, що зображення числового променя графічно некоректне, що і призводить до невірної інтерпретації техніки.
У нашому випадку є два класи еквівалентності і значення, яким закінчується перший клас, однозначне і повністю визначене — це 0, а значення, з якого починається наступний клас еквівалентності, також однозначне і визначене — це 1. Кожне із цих чисел є граничним значенням для свого класу еквівалентності. Між цими числами не існує нічого, крок між ними — це порожнеча [нависає ніякове мовчання і тиша]!
Немає ніякого «значення на границі», «зліва від границі», «справа від границі»! Є лише значення границі одного класу і іншого. Ось так:
Ось таке графічне зображення відповідає дійсності, бо крок між значеннями — це неділима величина (визначається в залежності від системи). А отже, як бачиш, щоб протестувати граничні значення, нам достатньо взяти лише два значення замість трьох, а саме:
- кінцеве значення першого класу;
- початкове значення наступного класу.
Легковайті Тестущенко: Хм... Так, тепер я бачу, що весь час робив зайві перевірки.
Я: А скажи-но мені ось що. Тепер, розуміючи дійсні граничні значення, до чого ж тоді буде відноситись число 2, яке нам так радили брати для перевірки?
Легковайті Тестущенко: Очевидно, що число 2 вже буде належати множині чисел класу еквівалентності, а не до граничних значень.
Я: Вірно. І поглянь, якби нам було потрібно протестувати цю вимогу з використанням аналізу класів еквівалентності та граничних значень, то ми, вже як досвідчені спеціалісти, робили б 4 перевірки (дві на перевірку граничних значень, дві на перевірку двох класів еквівалентності) замість 5, які нам так непрофесійно навʼязували.
Ця різниця здається нікчемною на такому простому прикладі, 4 проти 5, але коли в реальному житті доводиться тестувати складні і розгалужені застосунки — це може суттєво скоротити тестування і не марнувати час на безглузді перевірки.
Легковайті Тестущенко: Згоден з тобою. Шкода, що раніше про це не замислювався [перед очима промайнуло все життя].
Замість висновку
Якщо ви використовуєте по два значення для граничних перевірок, ви явно ефективніші, ніж ті, хто використовує по три значення. І до того ж показуєте свою експертність і справжнє розуміння цієї техніки тестування. Не сприймайте абсолютно все на віру, аналізуйте та думайте головою.
P.S. Заради справедливості все ж додам, що обидва ці підходи тестування граничних значень (з використанням двох і трьох значень) описані в стандарті ISO/IEC/IEEE
Two-value boundary value testing is typically adequate in most situations; however, three-value boundary testing could be required for certain circumstances (e.g. for rigorous testing to check that no errors were made in determining the boundaries of variables in the test item by both testers and developers). |
Дякую за увагу. В наступній статті поговоримо про використання попарного тестування (Pairwise testing).
28 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів