2012-01-25 63 views
4

可能重複:
Unit test compile-time error如何測試一些代碼不能用C++編譯?

我想知道如果它可以寫一種單元測試將驗證一個給定的代碼編譯。

例如,我有一個模板類:

#include <boost/static_assert.hpp> 
#include <boost/type_traits/is_base_of.hpp> 

struct bar_base {}; 

template <typename T> 
class foo 
{ 
    BOOST_STATIC_ASSERT(::boost::is_base_of<T, bar_base>::value); 
}; 

所以,測試應成功:

struct bar_derived : bar_base {}; 
foo<bar_derived> f; 

但應失敗:

struct bar_other {}; 
foo<bar_other> f; 

任何想法如何實現這樣的行爲? (現在,我必須取消失敗代碼的註釋並手動驗證是否存在編譯錯誤 - 我想避免這種情況)

回答

3

Boost確實有編譯測試,他們通過將每個測試放入一個源文件,然後嘗試編譯每個這些。 Boost.Build支持special commands to run tests,其中包括測試文件是否編譯。

+0

+1 - 很高興知道這一點。 – ChrisBD

-6

有使用單元測試,即使你可以在測試由於非編譯代碼,故障少點。

如果能夠單元測試的代碼段不編譯具有作爲代碼不能使用反正沒有內在價值。

你可以有運行單元測試一次要測試的代碼已經建成沒有錯誤,但是編譯器會引發錯誤的事實是失敗本身就是一個自動生成過程。

單元測試用於驗證代碼功能是否正確。

+2

許多C++庫在編譯時嘗試強制執行一些要求。 OP想知道他是否可以測試他的圖書館是否正確驗證了這些要求。 –

+0

我完全不同意這一點。在編譯時捕獲錯誤的API使用總是比在運行時更好。想象一下,我做了一個類foo ,其中的模板參數必須是質數。如果我說「foo <4>()」,我希望在編譯時失敗。失敗實際上是一個功能。 –

+0

你怎麼看,如果我用靜態斷言註釋掉(或者忘記寫)這行,會發生什麼?不應編譯的代碼將編譯。那麼測試它沒有意義嗎? –