2012-04-20 14 views
10

Tengo una serie de casos de prueba de Boost ordenados en varias suites de prueba. Algunos casos de prueba tienen uno, más de un cheque.¿Cómo decirle a Boost.Test que se detenga en el primer caso de prueba que falla?

Sin embargo, cuando se ejecutan todas las pruebas, todas se ejecutan, sin importar cuántas fallan o pasan. Sé que puedo detener la ejecución de un caso de prueba con varias comprobaciones usando BOOST_REQUIRE en lugar de BOOST_CHECK. Pero eso no es querer lo que quiero.

¿Cómo puedo decirle a Boost que detenga toda la ejecución después de que falló el primer caso de prueba? Preferiría una solución compilada (por ejemplo, realizada con un dispositivo global) sobre una solución de tiempo de ejecución (es decir, parámetros de tiempo de ejecución).

+1

BOOST_REQUIRE_THROW generará una excepción, por lo que se debe detener la ejecución de todo el conjunto de pruebas. – TemplateRex

+0

Gracias @rhalbersma. Voy a intentar eso. ¿Por qué no haces una respuesta de eso? –

+1

Ehm, porque después de una lectura más cuidadosa del manual Boost.Test, la sugerencia era incorrecta. BOOST_REQUIRE_THROW es una prueba unitaria para verificar si se lanza una excepción. No se tira a sí mismo. – TemplateRex

Respuesta

4

BOOST_REQUIRE detendrá el caso de prueba actual en un banco de pruebas pero continuará en otros.

Realmente no veo lo que quería cuando pidió una "solución compilada", pero este es un truco que debería funcionar. Uso un booleano para verificar la estabilidad de todo el conjunto de pruebas. Si es inestable, es decir, se ha activado BOOST_REQUIRE, lo detengo por completo.

Espero que te pueda ayudar.

//#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

Gracias por este truco :) Pero llamar a in_/out_strategy en cada caso de prueba es un poco hacia el principio DRY. ¿No existe la posibilidad de definir globalmente (o por suite de pruebas) los dispositivos 'antes' y 'después' para cada caso de prueba? Alternativamente, uno debe redefinir BOOST_AUTO_TEST_CASE o similar. –

+0

@Torbjoern - ponga la llamada de estrategia de entrada/salida en el controlador/dtor del dispositivo. El accesorio se crea y destruye para * cada * caso de prueba por separado. Quanteek: ¿querrías incluir eso en tu respuesta? –

1

¿Por qué no usar assert? No solo abortas inmediatamente todo el programa, sino que también podrás ver la pila si es necesario.

Cuestiones relacionadas