2009-06-08 13 views
10

ユニットテストを開始しようとしています。私はいくつかのC++フレームワークを見ていて、Boost.Testを試してみたいと思っています。ドキュメントは非常に徹底しているように見えますが、それはちょっと圧倒されています。特に単体テストの新しい人です。だからここに私が望む状況があります:Boost.Testを使い始めるのを助ける

私は2つのクラス、FooBarを持っているとしましょう。私は、FooのテストスイートとBarのテストスイートを、別々のファイルに書きたいと思っています。コマンドラインパラメータでプログラムを実行する場合にのみ、テストを実行します。私はtest_foo.cppのようなものであるべきだと思う

int main(int argc, const char* argv[]) 
{ 
    if (argc == 1 && strcmp(argv[0], "-test") == 0) 
     run_all_tests(); 
    else 
     return program_main(argc, argv); 
} 

:だから私のmain()は次のようになります

#include "foo.hpp" 
#define BOOST_TEST_MODULE Foo test 
#include <boost/test/unit_test.hpp> 

BOOST_AUTO_TEST_SUITE(Foo_Test) 

BOOST_AUTO_TEST_CASE(Foo1) 
{ 
    Foo f; 
    BOOST_CHECK(f.isValid()); 
} 

BOOST_AUTO_TEST_CASE(Foo2) 
{ 
    Foo f; 
    BOOST_CHECK(f.baz() == 5); 
} 

BOOST_AUTO_TEST_SUITE_END() 

しかし、私は、テストを実行するには、実際のコマンドがある(1)かわかりません(2)実際にライブラリにどのようなテストをしたいのかを伝える方法。

だから、誰がBoost.Testでの経験がありますか?誰かが詳細な方法で助けることができますか?どうもありがとうございます。 NUnitの

のように何のスタンドアロンテストランナーがありません

答えて

3

ブースト。テストは非常に柔軟で、おそらくあなたが望むことをすることができます。しかし、あなたがユニットテストの初心者だと言うので、おそらく標準的なユニットテスト構造に従うべきです。

これは、単体テストするプロジェクトごとに別々のテストプロジェクトを作成することです。次に、テストプロジェクトを構築するために必要なソースとライブラリを追加します。

これは、誤って実行される可能性のあるテストロジックがメインプロジェクトに存在しないため、よりクリーンです。独自の実行可能ファイルを持つため、テストを実行するのは簡単です。このアプローチは、ライブラリのテストにも使用できます。この構造に従えば、ほとんどのBOOST.Testのデフォルトがそのまま使えることがわかります。テストとコードの作成について心配する必要はありません。

0

あなたは、単に単一の.exeアプリケーションとしてテストケースを構築する(Windows上である場合)、あなたはあなたのtest_foo.cpp

+0

私は理解していません...どのようにプログラムを正常に(テストなしで)実行しますか? – rlbond

+0

基本的には、test_foo.cppは単一の.exeプログラムとしてビルドし、Foo&Barクラスを含むライブラリにリンクする必要があります。 boost.testヘッダーファイルの1つがすでにmain関数を定義しているので、あなたが提案したものが実行可能であるとは思わない。 – oscarkuo

+1

実際にはあります。これはconsole_test_runnerと呼ばれています。彼はすでにメインを持っているので、OPの問題には関係しませんが。 –

12

にそれを実行して、マクロが追加しますテストスイートとテストケース グローバルリストに:master_testsuite、すべてのテスト ノードのルートです。 test_foo.cpptest_boo.cppとランナーのようなすべてのテストファイルをコンパイルするだけで、 実行可能ファイルにすべてリンクする必要があります。

unit_test_mainは、master_testsuiteでテストを実行するために使用されます。

もし <boost/test/unit_test.h>含む前に定義されたマクロに基づい
boost::unit_test::unit_test_main(
    &init_unit_test, 
    argc, 
    argv 
) 

Boost.Testはすでにためmain 関数を生成することができる[1]。生成されたmainは、単に unit_test_mainargcargvmainで呼び出されました。 unit_test_mainを使用することをお勧めします。 のようなコンソール引数を処理できるため、run test by nameのようになります。

unit_test_mainの最初の引数はフックです。 BOOST_TEST_ALTERNATIVE_INIT_APIに応じて、定義が異なります。

#ifdef BOOST_TEST_ALTERNATIVE_INIT_API 
typedef bool  (*init_unit_test_func)(); 
#else 
typedef test_suite* (*init_unit_test_func)(int, char* []); 
#endif 

フックでmaster_testsuiteをカスタマイズできます。 2番目の フォームでは、戻り値は新しいマスターテストスイートです。

[1] BOOST_TEST_MAINBOOST_TEST_MAINが定義されている場合、しかし BOOST_TEST_NO_MAINではありません。

5

メニューコマンドからテストを開始することはできますが、それは簡単ではなく、悲しいことではありません。さらに悲しいことに、ログファイルが作成されるパスを渡すことはできません。このようなコマンドラインオプションを自分で追加する必要がありました。残念ながら私はまだそれを提出していません。私のコードは次のようになります。

#ifdef DEBUG 

#undef main 
#define BOOST_TEST_MAIN 
#include <boost/test/included/unit_test.hpp> 

int DoUnitTests() 

{ 
    char *args[] = {"", "--log_level=all", "--auto_start_dbg=yes"}; 

    bool result = ::boost::unit_test::unit_test_main(&init_unit_test_suite, sizeof(args)/sizeof(char*), args); 

    MessageDlog("Unittests result: %s", result ? "ERRORS in Unittests" : "Goooood!"); 
    return result; 
} 

#else 
int DoUnitTests() 

{ 
} 
#endif 
+0

いいえ、 'const char * []'で 'char * []'を初期化することはできません。 – Abyx

+0

あなたは何について話していますか?より具体的にしてください。 –

+0

コードはコンパイルされません。 http://coliru.stacked-crooked.com/a/760be4eb168ba404 – Abyx

0

私が書いたこのスクリプトを試してみてくださいこれは、プログラム名と、各クラス/モジュールのためのメイクファイル、プロジェクトの骨格とテストスイートスケルトンを生成しますクラスのリストを与えられました。また、各クラスのテストスイートを個別に、またはオールインワンのグローバルスイートの一部として実行できるように、すべてを設定します。

makeSimpleです。これはsourceforgeで入手できます。