2013-07-11 145 views
2

我最喜歡的單元測試框架之一是PHPUnit,因爲它支持測試依賴關係(即將測試標記爲依賴於其他測試的能力,在依賴關係成功時有條件地運行依賴測試)。我最近一直在使用Boost testing framework來測試我的C++代碼,雖然它適合我大部分的單元測試需求,但它似乎並不支持測試依賴性。Boost測試框架是否支持測試依賴關係?

我已經沖刷了加速測試框架的文件,並發現varioushints能夠提升支持此功能,但我還沒有找到一個文檔頁面或在加速測試的依賴性支持任何具體的例子。以前給出的頁面是否會變成鯡魚,還是Boost測試框架實際上支持測試依賴性?

回答

4

嗯,你已經發現自己的功能在那裏,根據鏈接,它是在那裏供最終用戶使用。 它沒有記錄在案,並且「應該很快加入」(按照鏈接)。

現在,這裏是一個諾特爾後我發現它使用特徵:從那裏 http://boost.2283326.n4.nabble.com/Unit-Test-Framework-strange-behaviour-of-test-unit-depends-on-td2653654.html

樣品(不幸的是,看起來像沒有BOOST_AUTO_TEST_CASE在那裏工作)。 另請注意,代碼不正確因爲Dependency()永遠不會被調用,因此依賴測試不能運行。

#include <boost/test/included/unit_test.hpp> 

using boost::unit_test::test_suite; 

void Dependency() 
{ 
    BOOST_MESSAGE("Dependency!"); 
    BOOST_CHECK(1); 
} 

void TC_TestCase() 
{ 
    BOOST_MESSAGE("A test case!"); 
    BOOST_CHECK(1); 
} 

test_suite* 
init_unit_test_suite(int argc, char* argv[]) 
{ 
    test_suite* ts = BOOST_TEST_SUITE("Test_Test"); 

    ts->add(BOOST_TEST_CASE(&TC_TestCase)); 

/*1*/ ts->depends_on(BOOST_TEST_CASE(&Dependency)); 

    return ts; 
} 

更新

進行了一些試驗,在與自動測試/套和依賴關係的例子。 關於代碼的一些注意事項:

  1. 此處提升爲1.42,新版本可能略有差異。
  2. 如果您在cpp文件中將test_suite1放在test_suite2之後,保持相關性相同,test_suite1將總是被跳過,因爲test_suite2不會在它之前運行。
  3. 我發test_case4失敗,所以test_suite1被跳過,但如果test_case4成功,test_suite1確實執行。
  4. 我敢肯定,你可以使依賴關係註冊更漂亮和更短。

代碼:

#include <boost/test/included/unit_test.hpp> 
using namespace boost::unit_test; 

BOOST_AUTO_TEST_SUITE(test_suite2) 
BOOST_AUTO_TEST_CASE(test_case4) 
{ 
    BOOST_CHECK(false); 
} 

BOOST_AUTO_TEST_SUITE_END() 

BOOST_AUTO_TEST_SUITE(test_suite1) 
BOOST_AUTO_TEST_CASE(test_case1) 
{ 
    BOOST_CHECK(true); 
} 

BOOST_AUTO_TEST_CASE(test_case2) 
{ 
    BOOST_CHECK(true); 
} 

BOOST_AUTO_TEST_SUITE_END() 


//____________________________________________________________________________// 

test_suite* 
init_unit_test_suite(int argc, char* argv[]) 
{ 
    const auto testSuite1Id = framework::master_test_suite().get("test_suite1"); 

    if(testSuite1Id != INV_TEST_UNIT_ID) { 
     auto test_suite1 = &framework::get<test_suite>(testSuite1Id); 

     const auto testSuite2Id = framework::master_test_suite().get("test_suite2"); 
     if (testSuite2Id != INV_TEST_UNIT_ID) { 
      auto testSuite2 = &framework::get<test_suite>(testSuite2Id); 

      const auto testCase4Id = testSuite2->get("test_case4"); 
      if (testCase4Id != INV_TEST_UNIT_ID) { 
       // test_suite1 depends on test_suite2/test_case4 
       test_suite1->depends_on(&framework::get<test_case>(testCase4Id)); 
      } 
     } 
    } 

    return 0; 
} 

輸出:

Running 3 test cases... 
Entering test suite "Master Test Suite" 
Entering test suite "test_suite2" 
Entering test case "test_case4" 
<blahblahblah>/consoleapplication5/consoleapplication5.cpp(10): error in "test_case4": check false failed 
Leaving test case "test_case4"; testing time: 14ms 
Leaving test suite "test_suite2" 
Test suite "test_suite1"is skipped 
Leaving test suite "Master Test Suite" 

*** 1 failure detected in test suite "Master Test Suite" 
+0

感謝您提供具體的語法。我曾認爲,自從3年前提出這個問題以來,文件現在已經得到修復,但事實似乎並非如此。 你在回答中提到了「BOOST_AUTO_TEST_CASE」,所以我想問一下:有什麼方法可以通過Boost中的自動註冊提交的測試用例調用「depends_on」功能?如果沒有,我找到一個名爲NCBI的庫,它支持可能支持測試依賴性的宏語法。 – churay

+0

更新答案,註冊自動測試案例和套件。 – biocomp

+0

請注意,儘管如此,測試不會以依賴性順序執行。如果你首先聲明瞭test_suite1,它將被跳過,因爲test_case4「失敗」,因爲它還沒有運行。 – namezero

1

開始升壓1.59你有更好的工具來執行此:depends_onhttp://www.boost.org/doc/libs/1_59_0/libs/test/doc/html/boost_test/utf_reference/test_org_reference/decorator_depends_on.html

用法非常簡單(與Boost ):

namespace utf = boost::unit_test; 

BOOST_AUTO_TEST_CASE(test3, * utf::depends_on("s1/test1")) 
{ 
    BOOST_TEST(false); 
} 

BOOST_AUTO_TEST_CASE(test4, * utf::depends_on("test3")) 
{ 
    BOOST_TEST(false); 
} 

BOOST_AUTO_TEST_SUITE(s1) 

    BOOST_AUTO_TEST_CASE(test1) 
    { 
    BOOST_TEST(true); 
    } 

BOOST_AUTO_TEST_SUITE_END()