3

所以,我开始使用 boost 单元测试。当我尝试构建一个创建类实例的简单测试时,我得到一个编译错误。它在没有类实例的情况下工作正常。

编译错误信息是:

/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’

WT FomgFail_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()

WT FomgFail.hpp:

#ifndef WTFOMGFAIL_HPP_
#define WTFOMGFAIL_HPP_

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

#endif /* WTFOMGFAIL_HPP_ */

WT FomgFail.cpp:

#include "WTFomgFail.hpp"

WTFomgFail::WTFomgFail()
{
}

WTFomgFail::~WTFomgFail()
{
}

如果我更改BOOST_AUTO_TEST_SUITE(WTFomgFail)为其他内容,例如BOOST_AUTO_TEST_SUITE(OMGreally).

#define BOOST_TEST_MODULE OMGreally此外,使用with时我没有收到错误消息BOOST_AUTO_TEST_SUITE(OMGreally)

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

4

1 回答 1

6

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

要了解此限制,您必须了解 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;
}

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

这就是他们引入BOOST_AUTO_TEST_SUITEand的原因BOOST_AUTO_TEST_CASE,它们正在为您执行此操作。

您传递给的参数BOOST_AUTO_TEST_SUITE当然是类的名称(test_class如上)。参数 toBOOST_AUTO_TEST_CASE是测试函数的名称(test_method1()test_method2()以上)。

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

我希望这有帮助。

于 2014-06-26T11:58:04.573 回答