Как сообщить Boost.Test остановиться на первом неудачном тестовом примере?

У меня есть несколько тестовых примеров Boost, заказанных в нескольких тестовых наборах. Некоторые тестовые примеры имеют один, несколько более одной проверки.

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

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

Ответ 1

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.

Ответ 2

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