2012-04-20 111 views
13

我正在尋找一種很好的方式來在C++中測試我的模板方法,類和函數。 我有一種感覺,僅僅使用單一類型進行測試是不夠的,而且僅僅複製單元測試並替換類型並不合適。什麼是單元測試模板化C++方法/類/函數的好方法?

更具體地說,我正在研究Matrix類並使用Boost的單元測試框架。矩陣將使用不同的類型。它主要用於基本類型,但我希望它也支持具體類型。

請注意,我這樣做是爲了學習目的,這就是爲什麼我沒有使用現有的矩陣實現。

+4

「僅僅複製單元測試並替換類型是不正確的。」爲什麼?如果你想測試它是否也適用於其他類型,那麼你不能用其他類型進行測試。 – PlasmaHH 2012-04-20 13:21:10

回答

12

Boost測試有一個宏BOOST_AUTO_TEST_CASE_TEMPLATE,它對boost :: mpl :: list中的每個類型的模板運行測試。

template<typename T> 
T Add(T lh, T rh) 
{ 
    return lh + rh; 
} 

typedef boost::mpl::list<int, float> test_types; 

BOOST_AUTO_TEST_CASE_TEMPLATE(Add_1Plus2_Is3, T, test_types) 
{ 
    T result = Add(T(1), T(2)); 
    BOOST_CHECK_EQUAL(T(3), result); 
} 

http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/utf/user-guide/test-organization/auto-test-case-template.html

0

單元測試的要點是涵蓋代碼的每個分支。如果使用不同類型的測試覆蓋不同的分支,那麼添加類型特定的單元測試是有意義的,否則它只是複製粘貼。

0

如果您是單元測試模板,那麼您需要使用所有可能的類型對模板類進行單元測試,或者直到您認爲足夠。沒有辦法。

你的類可能使用int,但是float失敗。

如果該模板並不打算與某些類型一起使用,那麼您應該在代碼中添加一些static_assert。

3

我同意josuegomes和VJovic。我認爲,減少代碼重複的一種方法是用你的單元測試邏輯做一個模板函數,然後用不同類型的參數調用它。通過這種方式,您可以將所有Matrix單元測試邏輯放置在一個位置,同時針對每種所需類型調用模板單元測試功能。

但是,這樣做可能是矯枉過正。我認爲這取決於測試中邏輯的數量。

相關問題