Преходи на състоянията
Накратко: Машината на състоянията дава три мерила за тестовете: всяко състояние е посетено (2 теста за поръчката), всеки валиден преход е минат (3 теста), и всеки невалиден преход е опитан и отказан. Невалидните са повечето: от 30 двойки „състояние и събитие“ валидни са 6. Те са и тези, които никой не тества.
Проблем
Платената отказана поръчка
Клиент отказва нова поръчка. После, в друг раздел на браузъра, където страницата за плащане е още отворена, натиска „Плати“. Плащането минава. Поръчката става „платена“, складът я пакетира, куриерът я носи.
Тестовете на поръчката минаваха: плащане на нова поръчка, отказ на нова поръчка, изпращане на платена. Всеки от тях беше позволен преход. Никой не беше опитал забранен.
Идеята
Машината като тестове
В урока „Когато таблицата е по-ясна“ машината на състоянията беше изискване. Ето я пълна, с прехода, който там липсваше:
| От | Събитие и условие | Към |
|---|---|---|
| нова | клиентът плаща | платена |
| нова | клиентът отказва | отказана |
| платена | клиентът отказва (преди изпращането) | отказана |
| платена | складът предава пратката | изпратена |
| изпратена | куриерът доставя | доставена |
| доставена | клиентът заявява връщане, до 14 дни от получаването | върната |
Шест състояния, шест валидни прехода. „Отказана“ и „върната“ са крайни: от тях не се излиза.
Тестът тук не е един вход и един изход. Той е път: поредица от събития, и след всяко се проверява състоянието. Това е тестването на преходите (state transition testing).
В задачите на урока редът на таблицата е път от нова поръчка („плати, изпрати“), а проверява се състоянието накрая и дали последното събитие е отказано. До таблицата има диаграма на машината: застани на ред и тя светва по пътя му.
Идеята
Три мерила
Колко пътя трябват? Зависи какво искаш да покриеш.
- Всички състояния: всяко състояние е посетено поне веднъж. Тук стигат 2 теста. Кои, ще намериш в задачата.
- Всички валидни преходи: всеки ред от таблицата е минат поне веднъж. Двата теста минават 5 от 6 прехода, а за шестия трябва трети. 3 теста.
- Всички преходи: и валидните, и всеки невалиден, опитан и отказан. Тук тестовете стават много повече.
Всяко мерило включва предишното. Всички състояния е слабото: бъгът от началото живееше в преход, до който никой път не стигна.
По-точно, за любопитните
ISTQB CTFL v4.0.1 описва техниката в раздел 4.2.4 (state transition testing) с тези три мерила: all states coverage, valid transitions coverage (наричано и 0-switch coverage) и all transitions coverage. Машината може да се запише като диаграма или като таблица на състоянията. Таблицата показва и невалидните преходи, диаграмата обикновено не.
За критични системи (влакове, медицински уреди) тестовете не стигат. Там машината на състоянията се проверява и формално: инструмент доказва, че забранено състояние е недостижимо по никой път. Това е проверка на модела (model checking), вид формална верификация. IEEE 1012 свързва обема на проверката с нивото на цялост: колкото по-скъп е отказът, толкова повече проверка. За магазина формалната е твърде скъпа, за спирачката на влака не е.
Пробвай
Всички състояния
Напиши пътищата, с които всяко от шестте състояния е посетено. Стигат два реда.
Правилото: Нова поръчка се плаща, платена се изпраща, изпратена се доставя, доставена се връща. Отказва се нова или платена поръчка, преди да е изпратена. Отказана и върната са крайни. Друго събитие се отказва, а поръчката остава, където е.
Застани на ред и диаграмата ще светне по пътя му.
| Вход | Очаквано | Правилната система | |||
|---|---|---|---|---|---|
| # | Път | Накрая | Последното отказано | ||
Пътят е поредица от събития от нова поръчка: „плати, изпрати“ (със запетая или интервал). Състоянието се пише с думата: нова, платена, изпратена, доставена, отказана, върната. Празна клетка за резултат не се проверява.
Решение
| Път | Накрая | Последното отказано |
|---|---|---|
| плати, изпрати, достави, върни | върната | не |
| откажи | отказана | не |
Дългият път минава през пет състояния: нова → платена → изпратена → доставена → върната. „Отказана“ е крайна и не е по него, затова е вторият път: нова → отказана. Тези два пътя минават 5 от 6 прехода. Платена → отказана остава непроверен: това е разликата между покритието на състоянията и на преходите.
Идеята
Невалидните преходи
Таблицата на преходите изрежда какво е позволено. По-полезна за теста е таблицата състояние × събитие: всяка клетка казва какво става, ако събитието дойде в това състояние.
| Състояние | плати | откажи | изпрати | достави | върни |
|---|---|---|---|---|---|
| нова | платена | отказана | — | — | — |
| платена | — | отказана | изпратена | — | — |
| изпратена | — | — | — | доставена | — |
| доставена | — | — | — | — | върната (до 14 дни) |
| отказана | — | — | — | — | — |
| върната | — | — | — | — | — |
30 клетки, 6 валидни. Останалите 24 са невалидни преходи („—“). Всеки е тест: опитай и провери, че е отказан.
Тестът на невалиден преход проверява три неща: опитът е отказан, състоянието не се е сменило, и клиентът вижда защо. И по един невалиден опит на тест: ако първият погрешно мине, поръчката вече е в друго състояние, и вторият опит тества нещо друго.
Пробвай
Забранено ли е?
Идеята
Условията на преходите
Някои преходи имат условие (guard). „Доставена → върната“ става само ако връщането е заявено до 14 дни от получаването. Събитието е едно, но резултатът зависи от условието.
Тук техниките се срещат. Условието е число, значи има граница: 14-ият ден се приема, 15-ият се отказва (ако пратката е получена на 1-ви, това са 15-и и 16-и). Машината казва къде да тестваш, граничните стойности казват с какво.
Същото е с „платена → отказана“: условието е „преди изпращането“. Тестът е два пъти: отказ на платена поръчка, преди складът да я предаде, и опит за отказ веднага след това.
Упражнение
Всички преходи
1. Всички преходи и невалидните. Невалидното събитие е последно в пътя: така редът проверява само него. Започни от най-рисковите: да платиш, изпратиш, откажеш или върнеш, когато не бива. Колоната „Последното отказано“ е важна: при някои грешки състоянието е същото, а разликата е само в отказа.
Напиши пътища за всеки от шестте валидни прехода и по един ред за невалидните преходи, докато хванеш всички грешки.
Правилото: Нова поръчка се плаща, платена се изпраща, изпратена се доставя, доставена се връща. Отказва се нова или платена поръчка, преди да е изпратена. Отказана и върната са крайни. Друго събитие се отказва, а поръчката остава, където е.
Застани на ред и диаграмата ще светне по пътя му.
| Вход | Очаквано | Правилната система | |||
|---|---|---|---|---|---|
| # | Път | Накрая | Последното отказано | ||
Пътят е поредица от събития от нова поръчка: „плати, изпрати“ (със запетая или интервал). Състоянието се пише с думата: нова, платена, изпратена, доставена, отказана, върната. Празна клетка за резултат не се проверява.
Решение
| Път | Накрая | Последното отказано |
|---|---|---|
| плати, изпрати, достави, върни | върната | не |
| откажи | отказана | не |
| плати, откажи | отказана | не |
| плати, изпрати, откажи | изпратена | да |
| плати, изпрати, върни | изпратена | да |
| плати, плати | платена | да |
| откажи, плати | отказана | да |
| откажи, изпрати | отказана | да |
| изпрати | нова | да |
Три пътя минават всички валидни преходи: дългият, нова → отказана и нова → платена → отказана. Невалидните са шест реда, по едно забранено събитие накрая: отказ и връщане на изпратена поръчка, второ плащане, плащане и изпращане на отказана поръчка, изпращане на неплатена. При второто плащане поръчката остава платена и при грешка, затова там я хваща само отказът. Останалите 18 невалидни клетки също са тестове. Тук не крият грешка, а в истинската система не го знаеш.
Тест
Провери се
Свързани уроци
Раздел „Свързани уроци“- Нужно отпреди: Критерии за приемане · Класове на еквивалентност · Гранични стойности · Таблица на решения
- Продължава в: Тестване по опит
- Задачи по темата: Техники за тестов дизайн