2009-06-08 86 views
10

我正在嘗試啓動單元測試。我正在看一些C++框架,並想嘗試Boost.Test。文檔看起來非常徹底,而且有點壓倒性,尤其是對於單元測試新手來說。所以這裏是我想要的情況:幫助開始使用Boost.Test

假設我有2個類,FooBar。我想爲FooBar一組測試編寫一套測試,最好在不同的文件中。我只想運行帶有命令行參數的程序時才運行測試。所以我main()應該是這個樣子:

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

我覺得test_foo.cpp應該是這樣的:

#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?有人可以幫助一個詳細的方式?非常感謝。

回答

3

BOOST。測試非常靈活,你可以做你想做的事情。然而,既然你說你是單元測試新手,你應該遵循標準的單元測試結構。

這是針對您要進行單元測試的每個項目都有單獨的測試項目。然後包括構建測試項目所需的源代碼和庫。

這是更清潔的,因爲您的主項目中沒有測試邏輯可能會意外運行,並且由於它們有自己的可執行文件,因此很容易運行測試。這種方法也適用於測試庫。如果你遵循這個結構,你會發現大部分的BOOST.Test默認工作是開箱即用的,你只需要擔心編寫測試和代碼。

0

沒有獨立的測試運行在NUnit的

您只需建立測試用例作爲單個.exe應用程序(如果您使用的是Windows),並運行它

+0

我不明白...你如何正常運行程序(沒有測試)? – rlbond 2009-06-08 01:26:54

+0

基本上你的test_foo.cpp應該被構建爲一個單一的.exe程序,並鏈接到包含Foo&Bar類的庫。其中一個boost.test頭文件已經定義了主函數,所以我不認爲你提出的是可行的。 – oscarkuo 2009-06-08 01:37:25

12

在你test_foo.cpp,將宏添加測試套件和測試用例在 到全局列表:master_testsuite,這是所有測試 節點的根。您只需編譯所有測試文件,如 test_foo.cpp,test_boo.cpp和runner,然後將它們全部鏈接到 可執行文件中。

函數unit_test_main用於運行master_testsuite中的測試。

boost::unit_test::unit_test_main(
    &init_unit_test, 
    argc, 
    argv 
) 

基於宏你包括 <boost/test/unit_test.h>如Boost.Test可能已經生成main 功能爲你之前所定義。[1]生成的main只需在main中調用 unit_test_mainargcargv。建議使用 使用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。在第二個 表單中,返回的值是新的主測試套件。

[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

試試這個劇本我寫了,給定一個程序名和班會生成每個類/模塊生成文件中,項目框架和測試套件骨架名單。它還設置了全部功能,以便每個類的測試套件可以單獨運行或作爲一體化全局套件的一部分運行。

它叫makeSimple,可在sourceforge上找到。