請注意,這不是How write a unit test for verifying compiling error?的重複,因爲我不關心測試外部庫或編譯器本身的正確性。如何單元測試模板代碼故意編譯錯誤
在C++中,特別是在處理模板時,通常使用阻止某些特定代碼被編譯的技術。由於這些可能會變得複雜,確保特定代碼段確實會產生編譯器錯誤的最佳方法是什麼?由於測試不應該被編譯,你不能依賴諸如boost-test之類的東西,所以我猜它應該被集成到編譯系統中?這些問題通常如何處理?
請注意,這不是How write a unit test for verifying compiling error?的重複,因爲我不關心測試外部庫或編譯器本身的正確性。如何單元測試模板代碼故意編譯錯誤
在C++中,特別是在處理模板時,通常使用阻止某些特定代碼被編譯的技術。由於這些可能會變得複雜,確保特定代碼段確實會產生編譯器錯誤的最佳方法是什麼?由於測試不應該被編譯,你不能依賴諸如boost-test之類的東西,所以我猜它應該被集成到編譯系統中?這些問題通常如何處理?
做在類似的方式編譯器編寫測試。您將在某些腳本語言(shell,perl,tcl等)中擁有一些測試代碼,這些代碼將在給定的代碼片段上運行編譯器,並檢查是否編譯了正確的代碼,而不是正確的代碼。
您將不得不依靠外部框架來運行一組編譯測試,例如, makefiles或hudson作業,並檢查編譯器輸出或編譯器工件。如果編譯應該失敗,那麼在編譯時不應該有文件的目標文件。我猜你可以爲哈德森寫一個插件來做這件事,或者是一個簡單的批處理腳本,它運行一個makefile,編譯所有應該失敗或成功的測試文件,並相應地標記成功或失敗。
在最簡單的情況下,您只需檢查'.o'文件的存在以查看測試是否成功;在更復雜的情況下,您可能需要查看編譯器輸出並驗證產生的錯誤同意你期待的錯誤。這將取決於您正在使用的編譯器。
走向更深層次的原因可能意味着寫一個編譯器擴展做到這一點(LLVM可能能夠處理你所要求的)
絕對不分開[Jenkins](http://jenkins-ci.org/)(名稱「哈德森」卡住在Oracle)工作。我們正在談論10行代碼片段。 –
您可能想查看metatest - Unit testing framework for C++ template metaprograms(author's original post to the Boost mailing list)。得到它here。
與圖書館相關的出版物here。
這驗證了一些代碼不會**編譯? –
我不明白..你能爲你想測試的東西提供一個例子嗎? –
例如,如果某種類型沒有可用的專門化,或者如果某種類型不符合某些必要條件,或者通常測試「boost :: enable_if'等 – UncleZeiv
那麼只需編寫一個不應編譯的測試用例,然後檢查它是否沒有編譯..也許搜索相應的錯誤信息以確保它不會編譯* *原因。 –