Гранични стойности
Накратко: Границата е последната стойност на един клас и първата на следващия. С две точки се тестват границата и съседът ѝ от другия клас: 49,99 и 50,00 €. С три точки и съседите от двете страни: 49,99, 50,00 и 50,01 €. Така се хващат „>“ вместо „>=“, закръглянето и грешката с единица, които представителят от средата на класа никога не вижда.
Проблем
Тестовете минаха, границата не
От миналия урок имаш три теста за доставката: 0 €, 30 € и 80 €. Всички минават. Програмистът е написал:
доставката е безплатна, ако сумата е > 50
Количка за 50,00 € плаща 4,90 €. Тестът с 80 € е от същия клас и минава, защото 80 е и > 50, и >= 50. Представителят от средата на класа не може да види къде точно свършва класът.
Идеята
Границата
Класовете на доставката са подредени: празна, платена, безплатна. Там, където един клас свършва и почва друг, е границата:
| Клас | От | До |
|---|---|---|
| празна количка | 0 € | 0 € |
| платена доставка | 0,01 € | 49,99 € |
| безплатна доставка | 50,00 € | без горна граница |
Граничните стойности са най-малката и най-голямата стойност на всеки клас. Тук грешките са най-гъсти, защото тук програмистът решава „>“ или „>=“, закръгля, брои от 0 или от 1. Една сгрешена черта в кода мести границата с една стъпка. Стъпката при сумите е един цент.
Анализът на граничните стойности работи само за подредени класове: суми, бройки, дати. Начин на плащане няма „преди“ и „след“.
Идеята
Две точки и три точки
Има два начина.
С две точки: за всяка граница се тестват граничната стойност и съседът ѝ от другия клас. За доставката: 0 и 0,01 €; 49,99 и 50,00 €. Четири теста.
С три точки: за всяка гранична стойност се тестват тя и двата ѝ съседа. Около 50,00 €: 49,99, 50,00 и 50,01 €.
Защо три? Представи си код „доставката е безплатна, ако сумата е точно 50“. С две точки: 49,99 плаща, 50,00 е безплатна. Минава. С три точки 50,01 € трябва да е безплатна, а кодът иска 4,90 €. Хванат.
Трите точки струват повече тестове и хващат повече грешки. Кое да избереш, зависи от риска: за плащането си струват, за цвета на бутона не.
По-точно, за любопитните
ISTQB CTFL v4.0.1 описва техниката в раздел 4.2.2 (boundary value analysis) и двата варианта: 2-value BVA и 3-value BVA. Покритието е броят тествани гранични стойности (с техните съседи при трите точки) върху всички. Според програмата трите точки са по-строги: хващат грешки, които двете пропускат.
Техниката стъпва на класовете на еквивалентност. Без класовете не е ясно къде са границите, а без границите класовете пропускат най-честите грешки.
Пробвай
Кои стойности?
Идеята
49,99 не е 30
49,99 € и 30 € са в един клас. Защо тогава 49,99 е по-добрият тест?
Защото някои грешки се виждат само до границата. Ако кодът закръгля сумата до цели евро, преди да я сравни, 49,99 € става 50 € и доставката става безплатна. 30 € закръглено е пак 30, и тестът минава.
Добрият тест е на мястото, където грешката би се показала. Средата на класа е най-безопасното място, и затова е най-лошото за тест.
Пробвай
Границите на доставката
Напиши тестовете за границите на доставката, с две точки. Хвани всички грешки с колкото може по-малко редове.
Правилото: Доставката е безплатна при поръчка от 50 € включително, иначе е 4,90 €. Празна количка не се поръчва.
| Вход | Очаквано | Правилната система | |||
|---|---|---|---|---|---|
| # | Сума на количката | Отказ | Доставка | ||
Празна клетка за резултат не се проверява. Сумите се пишат като 49,99.
Решение
| Сума на количката | Отказ | Доставка |
|---|---|---|
| 0 | да | |
| 0,01 | не | 4,90 |
| 49,99 | не | 4,90 |
| 50 | не | 0 |
Четири реда: 0 € (отказ), 0,01 € (4,90 €), 49,99 € (4,90 €), 50,00 € (0,00 €). 50,00 € хваща „>“ вместо „>=“. 49,99 € хваща закръглянето и границата, изписана 5 € вместо 50 €. Ако сложиш 30 € вместо 49,99 €, закръглянето минава незабелязано. Ако сложиш 80 € вместо 50,00 €, минава „>“.
Идеята
Границите са навсякъде
Щом правилото има число, има граница:
- Бройки: най-много 10 от продукт. 10 се приема, 11 се отказва. И отдолу: добавя се поне 1 бройка, значи 0 се отказва.
- Дни: връщане до 14 дни от получаването. Получена на 1 октомври: 15 октомври се приема, 16 октомври се отказва.
- Време: кодът важи до 31 октомври. 23:59 и 00:00 на 1 ноември. И по чий часовник?
- Две граници наведнъж: лимитът е за сумата в количката, не за добавяното. 9 в количката плюс 1 е 10 и се приема. 10 плюс 1 е 11 и се отказва.
Граничната стойност често отваря въпрос, който изискването не е задало. „До 14 дни“: включително ли? От получаването или от доставката? Това е и рецензия: тестовият дизайн, направен рано, е най-добрият чеклист за изискванията.
Упражнение
Границите на лимита и на дните
1. Лимитът в количката. Границите са две: на добавяното количество и на бройките в количката след добавянето.
Напиши тестовете за двете граници на лимита: колко се добавя (0 и 1) и колко става в количката (10 и 11). Провери и какво остава в количката.
Правилото: В количката може да има най-много 10 бройки от един продукт. Добавяне над 10 се отказва със съобщение, а количката остава същата. Добавя се поне 1 бройка.
| Вход | Очаквано | Правилната система | ||||
|---|---|---|---|---|---|---|
| # | В количката | Добавям | Отказ | В количката след това | ||
Празна клетка за резултат не се проверява. Сумите се пишат като 49,99.
Решение
| В количката | Добавям | Отказ | В количката след това |
|---|---|---|---|
| 5 | 0 | да | 5 |
| 5 | 1 | не | 6 |
| 9 | 1 | не | 10 |
| 10 | 1 | да | 10 |
Четири реда: (5, добавям 0) е отказ; (5, добавям 1) става 6; (9, добавям 1) става 10; (10, добавям 1) е отказ и остават 10. Редът (9, 1) хваща кода, който отказва 10-ата бройка. Редът (10, 1) хваща кода, който пуска 11-ата, този, който сравнява само добавяното, и този, който изпразва количката при отказ. Ако всички редове са с празна количка, последните два минават незабелязани.
2. Дни и бройки. Намери граничните стойности.
Тест
Провери се
Свързани уроци
Раздел „Свързани уроци“- Нужно отпреди: Защо програмите грешат · Доброто изискване · Критерии за приемане · Класове на еквивалентност
- Продължава в: Таблица на решения · Преходи на състоянията · Покритие на кода · Тестване по опит
- Задачи по темата: Техники за тестов дизайн