Модульное тестирование с boost :: statechart - PullRequest
1 голос
/ 17 ноября 2010

Мы используем библиотеку диаграммы состояний форсирования и имеем проблемы с написанием модульных тестов для кода.

В нашем обычном исполнении конечный автомат запускается в ClosedState:

struct BoostStateMachine : sc::state_machine<BoostStateMachine, ClosedState >

например, чтобы проверить конкретный переход состояния без необходимости проходить конечный автомат до этого состояния, например, мы хотели бы запустить тест в AnotherState.Проблема в том, что sc::state_machine настроен на исходное состояние.Наполнение конечного автомата всеми событиями, которые приводят к проверенным состояниям, обычно требует большой работы и усложняет тесты.

Примитивное решение - написать специальное событие только для отладки и добавить его к ClosedState,Это событие вызовет немедленный переход к AnotherState.

Знаете ли вы какой-либо другой способ выполнить задачу?

1 Ответ

0 голосов
/ 17 ноября 2010

Я признаю, что это не здорово, но

#ifdef DEBUG
typedef AnotherState StartingState;
#else
typedef ClosedState StartingState;
#endif
struct BoostStateMachine : sc::state_machine<BoostStateMachine, StartingState > {...

РЕДАКТИРОВАТЬ комментарий к адресу

#ifndef INITIAL_STATE
#define INITIAL_STATE ClosedState
#endif
struct BoostStateMachine : sc::state_machine<BoostStateMachine, INITIAL_STATE > {...

, конечно, это означает, что вам нужно перекомпилировать для каждого теста = [

Мы могли бы попробовать следующее:

typedef<class InitialState>
struct StateMachine : sc::state_machine< typename /*?*/ StateMachine<InitialState>, InitialState > {...}

typedef StateMachine<ClosedState> BoostStateMachine; //default case

#ifdef DO_TESTS
    ...
    StateMachine<AnotherState> astate1;
    ...
    StateMachine<AnotherState2> astate2;
    ...
    StateMachine<AnotherState3> astate3;
    ...
#endif

Это, конечно, не помогает, когда это подсостояние, которое должно запускаться в другом состоянии.Но применимо то же самое:

typedef <typename InitialChild>
struct ClosedState : sc::simple_state< ClosedState<InitialChild>, BoostStateMachine, InitialChild > {...};

или что-то в этом роде.Я уже делал шаблонные состояния (чтобы у меня были общие последовательности подсостояний), и это королевская PITA для отладки (более того, для остальных диаграмм состояний).

...