1

Boostステートチャートライブラリを使用しており、コードの単体テストを作成するのに問題があります。

通常の実行では、ステートマシンは次の場所で起動しClosedStateます。

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

ステートマシンをその状態までトラバースすることなく、特定の状態遷移をテストしたいと考えています。たとえば、でテストを開始したいとしAnotherStateます。問題はsc::state_machine、初期状態でテンプレート化されていることです。テストされた状態につながるすべてのイベントをステートマシンに供給すると、通常、多くの作業が必要になり、テストが複雑になります。

原始的な解決策は、特別なデバッグ専用イベントを作成し、それをに追加することClosedStateです。このイベントは、への即時移行をトリガーしAnotherStateます。

タスクを達成するための他の方法を知っていますか?

4

1 に答える 1

0

良くないことは認めますが

#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です(残りのステートチャートのように)。

于 2010-11-17T13:21:28.803 に答える