boost-test initialization for each suite (not case)
-
16-03-2021 - |
Question
I need to init some variables, which are "global" inside a BOOST_AUTO_TEST_SUITE so their constructors will be called when the suite starts and their destructors will be called right after the last corresponding BOOST_AUTO_TEST_CASE is finished
does someone know how I can do it? Looks like global fixtures is not a solution...
Solution
For future reference:
This has been added to the library, as of 1.36 I believe.
OTHER TIPS
I'm not quite sure if the accepted answer is correct, because if I use the test code from the boost web site:
#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>
struct F {
F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); }
~F() { BOOST_TEST_MESSAGE( "teardown fixture" ); }
int i;
};
//____________________________________________________________________________//
BOOST_FIXTURE_TEST_SUITE( s, F )
BOOST_AUTO_TEST_CASE( test_case1 )
{
BOOST_CHECK( i == 1 );
}
//____________________________________________________________________________//
BOOST_AUTO_TEST_CASE( test_case2 )
{
BOOST_CHECK_EQUAL( i, 0 );
}
//____________________________________________________________________________//
BOOST_AUTO_TEST_SUITE_END()
Then the expected call sequence should be:
setup fixture
test_case1
test_case2
teardown fixture
But in fact it is this:
setup fixture
test_case1
teardown fixture
setup fixture
test_case2
teardown fixture
I don't know if this is a bug, because from reading the BOOST_FIXTURE_TEST_SUITE
documentation, I would expect exactly the first behavior. I can also get the second behavior if I use BOOST_FIXTURE_TEST_CASE
.
You can use global fixtures: http://www.boost.org/doc/libs/1_66_0/libs/test/doc/html/boost_test/tests_organization/fixtures/global.html
just replace
BOOST_FIXTURE_TEST_SUITE( s, F )
BOOST_AUTO_TEST_CASE( test_case1 )
[...]
BOOST_AUTO_TEST_SUITE_END()
with
BOOST_TEST_GLOBAL_FIXTURE( F );
BOOST_AUTO_TEST_CASE( test_case1 )
[...]
Then it will work like you expect.
-- sym39
I don't think it's possible with the Boost Test Library. Global fixtures are really global, i.e. they are instantiated per test run, not per suite.
Apart from that, I think that such a setup would violate test isolation principles. Can you explain why you need "global" variables at the suite scope?