Модульное тестирование с boost::statechart
Мы используем расширенную библиотеку диаграмм состояний и не можем написать модульные тесты для кода.
В нашем обычном исполнении конечный автомат запускается в ClosedState
:
struct BoostStateMachine : sc::state_machine<BoostStateMachine, ClosedState >
Мы хотели бы протестировать конкретный переход состояния без необходимости проходить конечный автомат до этого состояния, например, мы хотели бы начать тестирование в AnotherState
, Проблема в том, что sc::state_machine
основывается на его начальном состоянии. Заполнение конечного автомата всеми событиями, которые приводят к тестируемым состояниям, обычно требует большой работы и усложняет тесты.
Примитивное решение - написать специальное событие только для отладки и добавить его в ClosedState
, Это событие вызовет немедленный переход к AnotherState
,
Знаете ли вы какой-либо другой способ выполнить задачу?
1 ответ
Я признаю, что это не здорово, но
#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 для отладки (тем более, что для остальной части диаграммы состояний).