Към съдържанието
wannacode

Преходи на състоянията

Накратко: Машината на състоянията дава три мерила за тестовете: всяко състояние е посетено (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 свързва обема на проверката с нивото на цялост: колкото по-скъп е отказът, толкова повече проверка. За магазина формалната е твърде скъпа, за спирачката на влака не е.

Пробвай

Всички състояния

Напиши пътищата, с които всяко от шестте състояния е посетено. Стигат два реда.

Правилото: Нова поръчка се плаща, платена се изпраща, изпратена се доставя, доставена се връща. Отказва се нова или платена поръчка, преди да е изпратена. Отказана и върната са крайни. Друго събитие се отказва, а поръчката остава, където е.

Застани на ред и диаграмата ще светне по пътя му.

ВходОчакваноПравилната система
#ПътНакраяПоследното отказано
Ред 1

Пътят е поредица от събития от нова поръчка: „плати, изпрати“ (със запетая или интервал). Състоянието се пише с думата: нова, платена, изпратена, доставена, отказана, върната. Празна клетка за резултат не се проверява.

Идеята

Невалидните преходи

Таблицата на преходите изрежда какво е позволено. По-полезна за теста е таблицата състояние × събитие: всяка клетка казва какво става, ако събитието дойде в това състояние.

Състояние плати откажи изпрати достави върни
нова платена отказана — — —
платена — отказана изпратена — —
изпратена — — — доставена —
доставена — — — — върната (до 14 дни)
отказана — — — — —
върната — — — — —

30 клетки, 6 валидни. Останалите 24 са невалидни преходи („—“). Всеки е тест: опитай и провери, че е отказан.

Тестът на невалиден преход проверява три неща: опитът е отказан, състоянието не се е сменило, и клиентът вижда защо. И по един невалиден опит на тест: ако първият погрешно мине, поръчката вече е в друго състояние, и вторият опит тества нещо друго.

Пробвай

Забранено ли е?

1. Поръчката е изпратена. Клиентът натиска „Откажи“. Какво очаква тестът?
2. Защо невалидните преходи се тестват по един на тест?
3. Доставена поръчка, клиентът заявява връщане на 16-ия ден. Какъв е тестът?

Идеята

Условията на преходите

Някои преходи имат условие (guard). „Доставена → върната“ става само ако връщането е заявено до 14 дни от получаването. Събитието е едно, но резултатът зависи от условието.

Тук техниките се срещат. Условието е число, значи има граница: 14-ият ден се приема, 15-ият се отказва (ако пратката е получена на 1-ви, това са 15-и и 16-и). Машината казва къде да тестваш, граничните стойности казват с какво.

Същото е с „платена → отказана“: условието е „преди изпращането“. Тестът е два пъти: отказ на платена поръчка, преди складът да я предаде, и опит за отказ веднага след това.

Упражнение

Всички преходи

1. Всички преходи и невалидните. Невалидното събитие е последно в пътя: така редът проверява само него. Започни от най-рисковите: да платиш, изпратиш, откажеш или върнеш, когато не бива. Колоната „Последното отказано“ е важна: при някои грешки състоянието е същото, а разликата е само в отказа.

Напиши пътища за всеки от шестте валидни прехода и по един ред за невалидните преходи, докато хванеш всички грешки.

Правилото: Нова поръчка се плаща, платена се изпраща, изпратена се доставя, доставена се връща. Отказва се нова или платена поръчка, преди да е изпратена. Отказана и върната са крайни. Друго събитие се отказва, а поръчката остава, където е.

Застани на ред и диаграмата ще светне по пътя му.

ВходОчакваноПравилната система
#ПътНакраяПоследното отказано
Ред 1

Пътят е поредица от събития от нова поръчка: „плати, изпрати“ (със запетая или интервал). Състоянието се пише с думата: нова, платена, изпратена, доставена, отказана, върната. Празна клетка за резултат не се проверява.

Тест

Провери се

1. Тестовете посещават всички състояния. Минават ли и всички преходи?
2. Кое мерило е най-силно?
3. Таблицата „състояние × събитие“ за поръчката има 6 състояния и 5 събития. Колко клетки са невалидни преходи?
4. Какво е условие (guard) на преход?
5. Защо невалидните преходи са най-често забравените тестове?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·