3

それで、ブースト単体テストを使い始めました。クラスのインスタンスを作成する簡単なテストをビルドしようとすると、コンパイル エラーが発生します。クラスのインスタンスがなくても問題なく動作します。

コンパイル エラー メッセージは次のとおりです。

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

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

WTFomgFail.hpp:

#ifndef WTFOMGFAIL_HPP_
#define WTFOMGFAIL_HPP_

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

#endif /* WTFOMGFAIL_HPP_ */

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

それで、私の質問は、ブーストUTFを使用してモジュール、test_suite、およびクラスに同じ名前を付けることは明示的に禁止されている場合ですか?

4

1 に答える 1

6

私はこの質問に遅れていることを知っていますが、偶然出くわしただけで、とても孤独に見えました...

この制限を理解するには、ブースト テストが最初にどのように機能したかを理解する必要があります。(今でもこの方法で動作しますが、当時はマクロがなく、この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;
}

テスト関数を追加するたびに、2 つの別々の場所 (関数の定義とテスト スイートへの登録) でコードを変更する必要があったため、これは少し面倒でした。登録もやや直感的ではありません。

そのため、これを行うBOOST_AUTO_TEST_SUITEとが導入されました。BOOST_AUTO_TEST_CASE

渡すパラメーターBOOST_AUTO_TEST_SUITEは、もちろん、クラスの名前です (test_class上記)。パラメータ toBOOST_AUTO_TEST_CASEは、テスト関数の名前です (test_method1()およびtest_method2()上記)。

いいえ、それらは(もちろん)テストしているクラスや関数と同じではないかもしれません。これには名前空間を使用できますが、個人的には、クラス名の末尾に を付けてTu(または_tu、キャメルケースの命名法に慣れていない場合)、それをテスト スイートに使用することをお勧めします。

これが役立つことを願っています。

于 2014-06-26T11:58:04.573 に答える