打算在項目中試試 CATCH 這個測試框架。請同事在工程中進行了試驗,結果卻出現了一點問題。git
CATCH 和 GTest 之類的框架同樣,能夠直接在 C++ 文件中定義測試函數,就能自動地註冊到測試列表中,而不須要顯式地「註冊」測試函數這樣的代碼。其實原理很簡單,就是定義一個宏(TEST_CASE),這個宏展開之後,會定義一個全局對象,測試函數做爲構造函數的參數傳入,而後構造函數中作相應的「註冊」動做。因爲全局變量的構造函數會在Main函數執行以前就執行,因此就能夠在 Main 被執行前,把全部的測試函數註冊到測試列表中。github
CATCH 這個框架用起來很是簡單,只須要包含一個 catch.hpp 頭文件就能夠了。這也是我看中這個框架的緣由。雖說應該是很簡單的,但我仍是先新建了一個工程進行了測試,在這個工程中,有三個文件,其中一個包含 main 函數,另外兩個就是單純地定義測試函數。一切都很是順利,兩個 test case 都被執行了,並且結果也正確。框架
個人想法是「main函數」定義在一個文件中,其它文件只要愉快地寫 TestCase 就能夠了,這樣分工起來也容易,合併的工做量也極小。函數
不過當同事在咱們正式的開發工程中作一樣相似的事的時候,卻出問題。他定義在單獨文件中的的 Test case 函數老是不能執行。這下我傻眼了。測試
我把他的工程拷到個人機器上運行,結果也是同樣的。有點頭疼。後來我注意到一點,當我把斷點打在新加的 TEST_CASE 函數中,運行起來之後,這個斷點會顯示「此斷點沒法命中」這樣的信息。我只好猜想,雖然我每次修改這個文件VS都會從新編譯工程,而且也能看到生成的對應的 obj 文件,但這個文件頗有可能沒有被連接到工程中。由於咱們的正式的開發工程比較大,文件不少,多是由於 VS 在編譯大的工程時,自做聰明作了優化,把認爲「歷來沒有用到過的文件」不進行連接。爲何 VS 會認爲新增長的 TestCase 文件沒有被使用過呢?由於 CATCH 框架(我以爲GTest等也是同樣的)的註冊方式是隱性的,它定義的全局變量的構造函數中把本身另外一個函數關聯到整個的 TestCase 表中,而後再在 Main 函數中經過這張 TestCase 函數表來調用全部的測試函數。VS 極可能在這裏分析錯誤,誤覺得這些函數不會被用到。若是我在這個文件中隨便定義一個函數,而後再在其它會執行的函數中調用這個函數,那麼 VS 就不會作這個優化了。因而我這麼試了一下,TEST_CASE 文件就被執行了。優化
(優化不是這麼容易作的啊~誰把它報給 VS 吧~)spa