2012-04-20 5 views
10

У меня есть несколько тестовых примеров Boost, заказанных в нескольких тестовых наборах. В некоторых тестовых случаях есть одна, несколько более одной проверки.Как сказать Boost.Test остановиться на первом неудачном тестовом примере?

Однако при выполнении всех тестов все они выполняются - независимо от того, сколько провалится или пройдет. Я знаю, что я могу остановить выполнение одного тестового примера несколькими проверками, используя BOOST_REQUIRE вместо BOOST_CHECK. Но этого я не хочу.

Как сообщить Boost о прекращении всего выполнения после первого теста? Я предпочел бы скомпилированное решение (например, реализованное с помощью глобального устройства) по сравнению с решением среды выполнения (то есть с параметрами времени выполнения).

+1

BOOST_REQUIRE_THROW выдаст исключение, поэтому выполнение всего набора тестов должно быть остановлено. – TemplateRex

+0

Спасибо @rhalbersma. Я попробую. Почему бы вам не ответить на это? –

+1

Ehm, потому что после более тщательного изучения руководства Boost.Test предложение было неточным. BOOST_REQUIRE_THROW - это единичный тест для проверки того, выбрано ли исключение. Он не бросает себя. – TemplateRex

ответ

4

BOOST_REQUIRE остановит текущий тестовый пример в наборе тестов, но продолжит работу над другими.

Я действительно не вижу, что вы хотели, когда вы просили «скомпилированное решение», но вот трюк, который должен работать. Я использую логическое значение для проверки стабильности всего набора тестов. Если он нестабилен, тогда BOOST_REQUIRE был запущен, тогда я прекратил все это.

Надеюсь, это может вам помочь.

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

Спасибо за этот хак :) Но вызов in_/out_strategy в каждом тестовом случае немного по принципу DRY. Разве нет возможности для глобального (или для набора тестов) определить, что «перед» и «после» работает для каждого теста? В качестве альтернативы нужно переопределить BOOST_AUTO_TEST_CASE или аналогично. –

+0

@Torbjoern - введите стратегический вызов in/out в ctor/dtor прибора. Закрепление создается и уничтожается для * каждого * теста отдельно. Quanteek - возможно, захочет включить это в ваш ответ? –

1

Почему бы просто не использовать assert? Вы не только сразу прекратите выполнение всей программы, но также сможете увидеть стек, если это необходимо.