2010-11-17 9 views
1

Nous utilisons la bibliothèque de statistiques d'amplification et avons des difficultés à écrire des tests unitaires pour le code.Tests unitaires avec boost :: statechart

Dans notre exécution normale de la machine d'état commence à ClosedState:

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

Nous voudrions tester une transition d'état spécifique sans avoir à traverser la machine d'état jusqu'à cet état, par exemple, nous aimerions commencer la test dans AnotherState. Le problème est que sc::state_machine est modélisé sur son état initial. Nourrir la machine d'état avec tous les événements qui mènent aux états testés, nécessite généralement beaucoup de travail et complique les tests.

Une solution primitive consiste à écrire un événement spécial de débogage uniquement et à l'ajouter à ClosedState. Cet événement déclenchera une transition immédiate vers AnotherState.

Connaissez-vous un autre moyen d'accomplir cette tâche?

Répondre

0

Je l'avoue n'est pas grande, mais

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

EDIT adressant un commentaire

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

bien sûr cela signifie que vous devez recompiler faire chaque test = [

Nous pourrions essayez ce qui suit:

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 

Ceci bien sûr n'aide pas quand c'est un sous-état qui doit commencer dans un état différent. Mais la même chose pourrait s'appliquer:

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

ou quelque chose comme ça. J'ai déjà fait des états gabarits (pour que je puisse avoir des séquences de sous-états communes) et c'est un PITA royal à déboguer (plus que le reste du statechart).

+0

Ne fonctionnera pas car nous voulons naturellement de nombreux cas de test qui commencent avec différents états. – FireAphis

+0

@FireAphis voir modifier dans mon message original pour une autre façon d'une autre manière – KitsuneYMG

+0

Merci pour la réponse élaborée. Je suppose, techniquement, que je n'ai pas vraiment besoin du DO_TESTS ifdef parce que ces types ne seront pas utilisés dans le code de production de toute façon. Droite? – FireAphis