2015-02-23 32 views
6

我已經編寫了一個Matrix類,並且檢查了它不允許使用C++異常來增加不兼容大小的矩陣的乘法。我編寫了單元測試來檢查這種行爲,並且他們期待拋出異常。使用C++編譯錯誤的單元測試

現在我將Matrix大小從運行時變量更改爲模板參數。如果我能夠正確地做到這一點,那麼將會嘗試乘以錯誤大小的矩陣的代碼將不會編譯。

現在看來,這些單元測試是多餘的。但是,由於我不知道將來如何更改我的代碼,什麼會中斷,我仍然希望爲此執行測試。如果在我希望我的測試在特定位置拋出特定異常之前,現在我想讓我的測試在特定位置拋出特定的編譯錯誤。

這樣做的最佳方法是什麼?我會想象某種基於Makefile和shell腳本的機制,它會等待特定的錯誤代碼 - 或者我應該嘗試其他的東西嗎?這個想法是普遍的做法還是瘋狂?

編輯:當然,「單元測試」是不是這種機制的一個合適的名字,我知道,但現在,我想不出更好的辦法。已經有三位評論作者花費寶貴的時間和精力向我解釋單元測試是什麼,什麼不是。不幸的是,雖然在技術上是正確的,但這並沒有幫助解決這裏的實際問題。

編輯2:這是BDD的場景,我想測試:

  • 由於尺寸的2x2和3x3的兩個矩陣
  • 用戶試圖將它們相乘
  • Then他得到一個錯誤

之前,錯誤是運行時錯誤,並且測試它是微不足道的。但是現在我變成了一個編譯時錯誤,而且我看不到如何自動測試這個場景並確認每次提交(我在git鉤子中都有單元測試),它仍然給我一個錯誤。

+4

單元測試是用於檢測運行時錯誤:如果你想檢查出來

這裏的文檔。編譯器用於檢測編譯時錯誤。 – RPGillespie 2015-02-23 21:39:15

+0

單元測試不檢測運行時錯誤。單元測試檢查程序本身或運行時檢測到預期的運行時錯誤。我找的工具(你是對的,單元測試不是最好的名字)不會檢測到編譯錯誤,但會檢查編譯器是否檢測到它們。 – 2015-02-23 21:43:40

+2

單元測試應測試其實現內部可以更改的黑盒函數,以便您可以驗證修改內部函數是否未破壞其功能。我會建議爲您的基礎設施製作與實施無關的API。像'bool canMultiply(Matrix&a,Matrix&b)'這樣的函數可以在內部使用任何內容,並且可以通過單元測試進行驗證。 – RPGillespie 2015-02-23 21:46:14

回答

1

即使新的template代碼風格使得它在運行時不可能與矩陣不匹配,保持「單元」測試是無害的。您可能仍然會遇到一個運行時間的錯誤,如您所說,代碼可能會再次發生變化。

如果您使用gcc,gcc使用DejaGnu來測試自己。這應該足夠強大,以檢測gcc編譯錯誤。

+0

但是,如果我保持原樣,運行時錯誤就會變成編譯錯誤,而且我根本無法運行我的單元測試,因爲它們不能編譯。雖然編譯錯誤是我想要檢查的結果,但我想檢查它是否仍然有能力運行我所有的單元測試。我怎樣才能實現它? – 2015-02-24 14:50:51

+0

將您的單元測試轉換爲期望編譯錯誤的腳本。使用Python或make/bash – 2015-02-24 14:53:26

+0

期待C++編譯錯誤有點難 - 您可能知道一些框架來實現一些測試嗎? – 2015-02-24 14:55:10

0

我還沒有足夠的代表評論@Paul Evans的回答,所以請告訴我,如果我應該沒有回答。

@Paul Evans建議DejaGnu和我支持該選擇。 但是,如果你想產生更多可理解的編譯錯誤(模板編譯錯誤往往會變得混亂),你可以使用static_asserts

他們是因爲C++ 11(雖然你應該檢查你的編譯器可以使用它們)標準,是類似於傳統的斷言,只有他們在編譯時檢查,可以顯示自定義錯誤消息。 http://en.cppreference.com/w/cpp/language/static_assert