class,BOOST_TEST_MODULE,BOOST_AUTO_TEST_SUITE:命名问题?

Pop*_*ing 3 c++ boost boost-unit-test-framework

所以,我已经开始使用升压单元测试了.当我尝试构建一个创建类实例的简单测试时,我得到一个编译错误.没有该类的实例它工作正常.

编译错误消息是:

/src/test/WTFomgFail_test.cpp: In member function ‘void WTFomgFail::defaultConstructor::test_method()’:
/src/test/WTFomgFail_test.cpp:20: error: expected primary-expression before ‘obj’
/src/test/WTFomgFail_test.cpp:20: error: expected `;' before ‘obj’
Run Code Online (Sandbox Code Playgroud)

WTFomgFail_test.cpp:

#include "WTFomgFail.hpp"

#define BOOST_TEST_MODULE WTFomgFail
#define BOOST_TEST_MAIN
#define BOOST_TEST_DYN_LINK

#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(WTFomgFail)

BOOST_AUTO_TEST_CASE( defaultConstructor )
{
    WTFomgFail obj = WTFomgFail();
    BOOST_MESSAGE("wow, you did it");
}

BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)

WTFomgFail.hpp:

#ifndef WTFOMGFAIL_HPP_
#define WTFOMGFAIL_HPP_

class WTFomgFail
{
public:
    WTFomgFail();
    ~WTFomgFail();
};

#endif /* WTFOMGFAIL_HPP_ */
Run Code Online (Sandbox Code Playgroud)

WTFomgFail.cpp:

#include "WTFomgFail.hpp"

WTFomgFail::WTFomgFail()
{
}

WTFomgFail::~WTFomgFail()
{
}
Run Code Online (Sandbox Code Playgroud)

如果我换成BOOST_AUTO_TEST_SUITE(WTFomgFail)其他东西,那么错误就会消失BOOST_AUTO_TEST_SUITE(OMGreally).

此外,我不使用时得到的错误#define BOOST_TEST_MODULE OMGreallyBOOST_AUTO_TEST_SUITE(OMGreally).

所以,我的问题是当使用boost时,UTF命名模块,test_suite和类是明确禁止同一个东西?

Dev*_*lar 5

我知道我迟到了这个问题,但我偶然发现它看起来很孤单......

要理解这种限制,您必须了解Boost Tests 最初的工作原理.(它仍然可以这样工作,但当时没有BOOST_AUTO_...宏,你必须这样做.)

来自文档:

class test_class {
public:
    void test_method1()
    {
        BOOST_CHECK( true /* test assertion */ );
    }
    void test_method2()
    {
        BOOST_CHECK( false /* test assertion */ );
    }
};

//____________________________________________________________________________//

test_suite*
init_unit_test_suite( int argc, char* argv[] ) 
{
    boost::shared_ptr<test_class> tester( new test_class );

    framework::master_test_suite().
        add( BOOST_TEST_CASE( boost::bind( &test_class::test_method1, tester )));
    framework::master_test_suite().
        add( BOOST_TEST_CASE( boost::bind( &test_class::test_method2, tester )));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这有点麻烦,因为每次添加测试函数时,都必须在两个单独的位置更改代码(函数的定义和使用测试套件注册).注册也有些不直观.

这就是为什么他们推出了BOOST_AUTO_TEST_SUITEBOOST_AUTO_TEST_CASE,这是对你这样做.

您传递给的参数BOOST_AUTO_TEST_SUITE当然是类的名称(test_class上图).参数to BOOST_AUTO_TEST_CASE是测试函数的名称(test_method1()test_method2()以上).

所以不,那些(当然)可能与您正在测试的类和功能不同.您可以使用命名空间,但我个人更喜欢简单地将类名后缀Tu(或者_tu如果您没有使用CamelCase命名),并将其用于测试套件.

我希望这有帮助.