2010-11-17 3 views
1

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

В нашем нормальном исполнении государственная машина начинает в ClosedState:

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

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

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

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

ответ

0

Я признаю, что это не большой, но

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

EDIT адресация комментарий

#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 для отладки (тем более, что остальная часть statechart).

+0

Не будет работать, потому что мы, естественно, хотим, чтобы многие тестовые примеры начинались с разных состояний. – FireAphis

+0

@FireAphis см. Редактирование в моем оригинальном посте для другого способа для другого способа – KitsuneYMG

+0

Спасибо за разработанный ответ. Я думаю, технически, мне действительно не нужен DO_TESTS ifdef, потому что эти типы не будут использоваться в производственном коде в любом случае. Правильно? – FireAphis

Смежные вопросы