6

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...

Alek86
  • 1,489
  • 3
  • 17
  • 26
  • This is the test entry/exit fixture explained here: https://www.boost.org/doc/libs/1_70_0/libs/test/doc/html/boost_test/tests_organization/fixtures/per_test_suite_fixture.html – Raffi Jun 01 '19 at 19:26

4 Answers4

8

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.

Olivia Stork
  • 4,660
  • 5
  • 27
  • 40
DaRich
  • 937
  • 8
  • 13
  • My thoughts exactly.. Feels like the documentation is misguiding in this case. I'd love to know if anyone's found a solution for this. – poli_g Jul 21 '16 at 09:41
  • I would call this "desirable behaviour". You [want to be able to run unit tests in a random order](https://qualitycoding.org/random-test-order/). If you didn't have a clean fixture each time, previous tests may affect this one. The point of a fixture is to delegate the setup before each test to simplify the tests themselves. It's certainly not a bug. – Stewart Dec 20 '22 at 10:42
1

For future reference:

This has been added to the library, as of 1.36 I believe.

Sveltely
  • 822
  • 1
  • 8
  • 22
1

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

sym39
  • 29
  • 1
1

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?

Andre
  • 1,577
  • 1
  • 13
  • 25
  • initially I thought I would need it to open a connection to my DB and to close it as fast as possible. but after some time of thinking I start to believe I do not need to close it fast so much... Or just open-close for each case, not the whole suite – Alek86 Dec 14 '11 at 22:25
  • Why not re-initialise / clear down after every test case? You could use a suite fixture to do this and place your init/cleardown code in the constructor / destructor, since each test case will be derived from the suite fixture you can ensure that each test case starts from a known state. – mark Dec 16 '11 at 20:14