每个套件的boost-test初始化(不是大小写)

时间:2011-12-14 19:10:03

标签: c++ boost-test fixture suite

我需要初始化一些变量,这些变量在BOOST_AUTO_TEST_SUITE中是“全局的” 因此,当套件启动时将调用它们的构造函数,并在最后一个相应的BOOST_AUTO_TEST_CASE完成后立即调用它们的析构函数

有人知道我该怎么做吗?看起来全球灯具不是解决方案......

4 个答案:

答案 0 :(得分:4)

我不太确定接受的答案是否正确,因为如果我使用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()      

然后预期的呼叫顺序应为:

setup fixture
test_case1
test_case2
teardown fixture

但事实上就是这样:

setup fixture
test_case1
teardown fixture
setup fixture
test_case2
teardown fixture

我不知道这是不是一个错误,因为通过阅读BOOST_FIXTURE_TEST_SUITE文档,我会期待第一个行为。如果我使用BOOST_FIXTURE_TEST_CASE,我也可以获得第二种行为。

答案 1 :(得分:1)

我认为使用Boost测试库不可能。全局装置真正全局,即每次测试运行时实例化,而不是按套件实例化。

除此之外,我认为这样的设置会违反测试隔离原则。你能解释为什么你需要套件范围内的“全局”变量吗?

答案 2 :(得分:1)

供将来参考:

This has been added to the library,截至1.36我相信。

答案 3 :(得分:0)

您可以使用全局灯具: http://www.boost.org/doc/libs/1_66_0/libs/test/doc/html/boost_test/tests_organization/fixtures/global.html

只需替换

BOOST_FIXTURE_TEST_SUITE( s, F )
BOOST_AUTO_TEST_CASE( test_case1 )
[...]
BOOST_AUTO_TEST_SUITE_END()

BOOST_TEST_GLOBAL_FIXTURE( F );
BOOST_AUTO_TEST_CASE( test_case1 )
[...]

然后它会像你期望的那样工作。

- sym39