Диаграммы переходов состояний (State Transition Diagrams)

Диаграммы переходов состояний (State Transition Diagrams)

Введение

Многие системы «помнят», в каком они состоянии. Заказ может быть новым, оплаченным, доставленным или отменённым. Пользователь — активным, заблокированным или удалённым. Переход из одного состояния в другое происходит под воздействием событий — и именно эти переходы нужно тестировать.

Диаграммы переходов состояний — техника тест-дизайна для систем, которые ведут себя по-разному в зависимости от текущего состояния.


Элементы диаграммы

Диаграмма состоит из:

  • Состояния (States) — обозначаются кружками или прямоугольниками. Например: «Активен», «Заблокирован»
  • Переходы (Transitions) — стрелки между состояниями
  • События (Events) — что вызывает переход (нажатие кнопки, истечение времени, API-вызов)
  • Действия (Actions) — что происходит при переходе (отправка письма, запись в БД)
[Новый] --оплачен--> [Оплачен] --отправлен--> [Доставлен]
   |                     |
  отмена               отмена
   |                     |
   v                     v
[Отменён]           [Отменён]

Пример: светофор

Простой пример с тремя состояниями:

Текущее состояниеСобытиеСледующее состояние
КрасныйТаймер истёкЗелёный
ЗелёныйТаймер истёкЖёлтый
ЖёлтыйТаймер истёкКрасный

Три состояния, три перехода. Тест-кейсы: проверить каждый переход.


Пример: учётная запись пользователя

Диаграмма состояний: переходы аккаунта пользователя

Текущее состояниеСобытиеСледующее состояние
АктивенНарушение правилЗаблокирован
АктивенУдалениеУдалён
ЗаблокированРазблокировка администраторомАктивен
ЗаблокированУдалениеУдалён
УдалёнЛюбое действиеОшибка: пользователь не существует

Что тестировать

Есть несколько уровней покрытия:

1. Покрытие состояний (State Coverage)

Каждое состояние должно быть достигнуто хотя бы в одном тесте.

2. Покрытие переходов (Transition Coverage)

Каждый валидный переход должен быть проверен хотя бы раз. Более надёжный критерий.

3. Невалидные переходы (Invalid Transitions)

Что происходит, если попытаться сделать невозможный переход?

  • Попытка заблокировать уже заблокированного пользователя
  • Попытка оплатить уже отменённый заказ
  • Попытка «удалить» уже удалённого пользователя

Система должна корректно обрабатывать такие случаи (отказывать с понятной ошибкой, не падать).


Матрица переходов

Удобный способ документировать переходы — таблица «откуда × куда»:

АктивенЗаблокированУдалён
АктивенНарушениеУдаление
ЗаблокированРазблокировкаУдаление
УдалёнНевозможноНевозможно

Пустые ячейки — потенциальные невалидные переходы для тестирования.


Частые ошибки

  • Тестировать только «счастливые» переходы — забывать про невалидные
  • Пропустить состояние — не попасть в него ни в одном тесте
  • Путать событие и состояние — «Нажата кнопка» это событие, «Заблокирован» — состояние
  • Не тестировать конечные состояния (deleted, archived) — из них часто нет обратного пути, и это нужно проверить

Что мы запомним

  • State Transition применяется к системам, которые ведут себя по-разному в зависимости от состояния
  • Элементы: состояния, переходы, события, действия
  • Тестируй: каждое состояние, каждый валидный переход, невалидные переходы
  • Матрица переходов помогает убедиться, что ни один переход не пропущен

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике