2012-04-20 8 views
10

Ho un numero di casi di test Boost ordinati in diverse suite di test. Alcuni casi di test ne hanno uno, alcuni più di un assegno.Come dire a Boost.Test di fermarsi al primo caso di test fallito?

Tuttavia, quando si eseguono tutti i test, vengono eseguiti tutti, indipendentemente dal numero di errori o passaggi. So che posso interrompere l'esecuzione di un test case con diversi controlli utilizzando BOOST_REQUIRE anziché BOOST_CHECK. Ma non è quello che voglio.

Come posso dire a Boost di interrompere l'intera esecuzione dopo il primo caso di test fallito? Preferirei una soluzione compilata (ad esempio realizzata con un dispositivo globale) su una soluzione runtime (cioè i parametri di runtime).

+1

BOOST_REQUIRE_THROW genererà un'eccezione in modo che l'esecuzione dell'intera suite di test venga interrotta. – TemplateRex

+0

Grazie a @rhalbersma. Ci proverò. Perché non ne fai una risposta? –

+1

Ehm, perché dopo una lettura più attenta del manuale Boost.Test, il suggerimento era impreciso. BOOST_REQUIRE_THROW è un test unitario per verificare se viene lanciata un'eccezione. Non si lancia da solo. – TemplateRex

risposta

4

BOOST_REQUIRE interromperà l'attuale caso di test in una suite di test ma proseguirà con altri.

Non vedo davvero quello che volevi quando hai chiesto una "soluzione compilata" ma qui è un trucco che dovrebbe funzionare. Uso un booleano per verificare la stabilità dell'intera suite di test. Se è instabile e un BOOST_REQUIRE è stato attivato, interrompo il tutto.

Spero che possa aiutarti.

//#include <...> 

//FIXTURES ZONE 
struct fixture 
{ 
    fixture():x(0.0),y(0.0){} 
    double x; 
    double y; 
}; 

//HELPERS ZONE 
static bool test_suite_stable = true; 

void in_strategy(bool & stable) 
{ 
    if(stable) 
     { 
      stable = false; 
     } 
    else 
     { 
      exit(); 
     } 
} 

void out_strategy(bool & stable) 
{ 
    if(!stable) 
     { 
      stable = true; 
     } 
} 

BOOST_AUTO_TEST_SUITE(my_test_suite) 

//TEST CASES ZONE 
BOOST_FIXTURE_TEST_CASE(my_test_case, fixture) 
{ 
    in_strategy(test_suite_stable); 
    //... 
    //BOOST_REQUIRE() -> triggered 
    out_strategy(test_suite_stable); 
} 

BOOST_FIXTURE_TEST_CASE(another_test_case, fixture) 
{ 
    in_strategy(test_suite_stable); //-> exit() since last triggered so stable = false 
    //... 
    //BOOST_REQUIRE() 
    out_strategy(test_suite_stable); 
} 

BOOST_TEST_SUITE_END() 

Benoit.

+0

Grazie per questo hack :) Ma chiamare in_/out_strategy in ogni test case è un po 'verso il principio DRY. Non c'è la possibilità che globalmente (o per test suite) definiscano le correzioni 'prima' e' dopo' per ogni caso di test? In alternativa, è necessario ridefinire BOOST_AUTO_TEST_CASE o allo stesso modo. –

+0

@Torbjoern - metti la chiamata di strategia in/out nel ctor/dtor della fixture. L'apparecchio viene creato e destrutturato per * ogni * test case separatamente. Quanteek - potrebbe voler includere questo nella tua risposta? –

1

Perché non usare solo asserire? Non solo abortisci immediatamente l'intero programma, ma sarai anche in grado di vedere lo stack, se necessario.