Какую технику тест-дизайна следует использовать для проверки логики смены статусов?

Ответ

Для тестирования логических цепочек со сменой статусов оптимально применять Технику тестирования переходов состояний (State Transition Testing).

Суть метода: Система представляется как конечный автомат с набором состояний (статусов). Тестируются корректные и некорректные переходы между ними в ответ на события.

Практический пример (Процесс заказа):

# Пример кода для проверки переходов статусов заказа
class Order:
    def __init__(self):
        self.status = "NEW"
        self.allowed_transitions = {
            "NEW": ["PROCESSING", "CANCELLED"],
            "PROCESSING": ["SHIPPED", "CANCELLED"],
            "SHIPPED": ["DELIVERED"],
            "DELIVERED": [],
            "CANCELLED": []
        }

    def change_status(self, new_status):
        if new_status in self.allowed_transitions[self.status]:
            self.status = new_status
        else:
            raise ValueError(f"Invalid transition from {self.status} to {new_status}")

# Тест на валидный переход
order = Order()
order.change_status("PROCESSING")
assert order.status == "PROCESSING"

# Тест на невалидный переход (должен вызвать ошибку)
try:
    order.change_status("DELIVERED")
    assert False, "Should have raised an error"
except ValueError:
    assert True

Что необходимо проверить с помощью этой техники:

  1. Все валидные переходы, указанные в спецификации.
  2. Невалидные переходы (например, попытка перевести заказ из DELIVERED обратно в PROCESSING). Система должна обрабатывать их корректно (выдавать ошибку, игнорировать).
  3. Граничные состояния (начальное и конечное).
  4. Побочные эффекты перехода (например, при смене статуса на SHIPPED должна создаваться накладная).

Для наглядности и полноты покрытия часто строят Таблицу/Диаграмму переходов состояний.

Ответ 18+ 🔞

Да ты посмотри, какая хуйня интересная вырисовывается! Вот сидишь ты, тестировщик, и думаешь: "Ну как, блядь, проверить эту вашу логику смены статусов, чтобы она не глючила, как мартышлюшка на банане?" А ответ-то простой, как хуй в пальто — Техника тестирования переходов состояний (State Transition Testing).

В чём соль, блядь? Представь, что твоя система — это такой ёбанный конечный автомат. У него есть состояния: "создан", "в обработке", "в доставке" и прочая хуйня. И ты должен проверить, как он перепрыгивает из одного состояния в другое, когда ты его пинаешь событиями. И главное — чтобы он не пытался сделать хуйню, типа из "доставлен" вдруг стать "новым". Это ж пиздец будет!

Смотри, как это выглядит в коде, на примере заказа:

# Пример кода для проверки переходов статусов заказа
class Order:
    def __init__(self):
        self.status = "NEW"
        self.allowed_transitions = {
            "NEW": ["PROCESSING", "CANCELLED"],
            "PROCESSING": ["SHIPPED", "CANCELLED"],
            "SHIPPED": ["DELIVERED"],
            "DELIVERED": [],
            "CANCELLED": []
        }

    def change_status(self, new_status):
        if new_status in self.allowed_transitions[self.status]:
            self.status = new_status
        else:
            raise ValueError(f"Invalid transition from {self.status} to {new_status}")

# Тест на валидный переход
order = Order()
order.change_status("PROCESSING")
assert order.status == "PROCESSING"

# Тест на невалидный переход (должен вызвать ошибку)
try:
    order.change_status("DELIVERED")
    assert False, "Should have raised an error"
except ValueError:
    assert True

Видишь? Всё просто, как три копейки. Создал заказ — он NEW. Перевёл в PROCESSING — ок, так можно. А вот если с PROCESSING сразу в DELIVERED рвануть — получишь по ебалу ошибкой, и правильно, пидарас шерстяной!

Так на что же, блядь, смотреть, когда тестируешь?

  1. Все разрешённые переходы. Каждый хуй из спецификации должен отрабатывать чётко, без запинки. Из А в Б, из Б в В.
  2. Все запрещённые переходы. Вот это самое весёлое! Пытаешься сделать хуйню — из "отменён" в "доставлен". Система должна тебя послать нахуй красиво, с ошибкой, а не молча сломаться.
  3. Состояния-крайности. Начальное и конечное. Вошёл в конечное — сиди, не рыпайся, выхода нет.
  4. Побочки. А то бывает, статус сменился, а письмо не отправилось, или запись в лог не легла. Надо смотреть, чтобы при переходе вся сопутствующая хуйня тоже происходила.

И самое главное — не будь мудаком, как тот Герасим из рассказа. Нарисуй себе диаграмму или таблицу переходов, наглядную такую. А то запутаешься в своих же статусах, и волнение ебать накроет. С таблицей всё видно: откуда, куда и можно ли. Красота, ёпта!