5

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

有人知道我该怎么做吗?看起来全球固定装置不是一个解决方案......

4

4 回答 4

7

我不太确定接受的答案是否正确,因为如果我使用来自 boost 网站的测试代码

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

于 2015-01-09T10:19:50.347 回答
2

您可以使用全局夹具: 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

于 2018-01-12T16:29:41.513 回答
1

我认为 Boost Test Library 不可能。全局夹具实际上是全局的,即它们在每次测试运行时被实例化,而不是在每个套件中。

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

于 2011-12-14T20:46:23.277 回答
1

备查:

这已被添加到 library中,我相信从 1.36 开始。

于 2014-04-01T04:04:51.107 回答