2011-09-02 56 views
35

請注意,這不是How write a unit test for verifying compiling error?的重複,因爲我不關心測試外部庫或編譯器本身的正確性。如何單元測試模板代碼故意編譯錯誤

在C++中,特別是在處理模板時,通常使用阻止某些特定代碼被編譯的技術。由於這些可能會變得複雜,確保特定代碼段確實會產生編譯器錯誤的最佳方法是什麼?由於測試不應該被編譯,你不能依賴諸如之類的東西,所以我猜它應該被集成到編譯系統中?這些問題通常如何處理?

+0

我不明白..你能爲你想測試的東西提供一個例子嗎? –

+0

例如,如果某種類型沒有可用的專門化,或者如果某種類型不符合某些必要條件,或者通常測試「boost :: enable_if'等 – UncleZeiv

+0

那麼只需編寫一個不應編譯的測試用例,然後檢查它是否沒有編譯..也許搜索相應的錯誤信息以確保它不會編譯* *原因。 –

回答

10

做在類似的方式編譯器編寫測試。您將在某些腳本語言(shell,perl,tcl等)中擁有一些測試代碼,這些代碼將在給定的代碼片段上運行編譯器,並檢查是否編譯了正確的代碼,而不是正確的代碼。

  • GCC使用DejaGnu,這是建立在expect之上,這本身就是建立在Tcl的頂部。
  • 如果你使用shell腳本(可能更簡單,DejaGnu可能是過度殺毒),你可能想看看shUnit2
  • Perl的Test::Harness系統應該是最容易使用的。
  • 畢竟,從C++運行進程並沒有太多的工作,所以編寫一個函數來試圖在給定的字符串上調用編譯器,並檢查它是否輸出錯誤的行,你認爲它不會那麼困難,你可以將它集成到其他基於boost.test的測試中。
3

您將不得不依靠外部框架來運行一組編譯測試,例如, makefiles或hudson作業,並檢查編譯器輸出或編譯器工件。如果編譯應該失敗,那麼在編譯時不應該有文件的目標文件。我猜你可以爲哈德森寫一個插件來做這件事,或者是一個簡單的批處理腳本,它運行一個makefile,編譯所有應該失敗或成功的測試文件,並相應地標記成功或失敗。

在最簡單的情況下,您只需檢查'.o'文件的存在以查看測試是否成功;在更復雜的情況下,您可能需要查看編譯器輸出並驗證產生的錯誤同意你期待的錯誤。這將取決於您正在使用的編譯器。

走向更深層次的原因可能意味着寫一個編譯器擴展做到這一點(LLVM可能能夠處理你所要求的)

+0

絕對不分開[Jenkins](http://jenkins-ci.org/)(名稱「哈德森」卡住在Oracle)工作。我們正在談論10行代碼片段。 –