2009-01-19 47 views
32

就在前幾天,我開始研究一個名爲check的單元測試框架, ,我打算在Linux下對c代碼進行測試。與Valgrind一起運行單元測試是否矯枉過正?

現在檢查和一些精心設計的代碼和一些測試代碼可以幫助我確認 的基本功能是正確的, 我的意思是這是很容易的,只是看看,並響應變量後面再 決定是否一個函數是否正確。

但是,假設我想測試一個動態存儲器結構,其中有很多malloc和free, ,事實證明我可以將數據放入並再次獲取正確的數據。 但是這並不能證明我沒有在這個過程中破壞一些內存,假設我忘了釋放內存的一半並丟失了指針(一個經典的memleak)。該代碼可能會通過大部分單元測試。

所以現在的問題是: 運行整個單元測試代碼與Valgrind並讓他檢測任何malloc/free問題是一個好主意? (或者在類似電子圍欄編譯?)

感覺就像是一個不錯的主意,但我不知道我得到自己到這裏.....

感謝 約翰


更新:感謝道格拉斯和喬納森, 好像這是一個好主意,是我應該繼續:-)

更新: Valgrind是一個有趣的工具,然而我發現做 的第一個memleak是在測試框架中,而不是我自己的代碼(雖然很有趣)。 因此,其餘部分的提示是在將自己的代碼顛倒之前,驗證您使用的單元測試框架沒有泄漏。 我的例子中只有一個空的測試用例, ,因爲除此之外,單元測試框架還在運行。

回答

51

我們當然會這麼做 - 對單元測試運行valgrind比完整程序要容易得多。

此外,任何內存錯誤都會侷限於單元測試正在測試的代碼區域,這使得修復更容易。

再加上檢查你已經修復它更容易 - 因爲你正在運行單元測試,而不是針對整個程序的更復雜的測試。

如果你運行的自動化方式的valgrind你可能想--error-exitcode=<number> [default: 0]

指定備用退出代碼返回如果Valgrind的報道,在運行任何 錯誤。當設置爲 默認值(零)時,來自Valgrind的返回值 將始終爲模擬的 進程的 返回值。當設置爲非零值 時,如果Valgrind檢測到任何錯誤,則返回該值, 。這 是使用Valgrind的作爲自動測試套件的一部分 ,因爲它 可以很容易地僅僅通過檢查返回代碼檢測測試用例 其中Valgrind的已經報告了錯誤, 有用。

http://valgrind.org/docs/manual/manual-core.html#manual-core.erropts

+0

還有`--xml = yes`和`--xml-file = `,這可以很容易地自動讀取結果。 – 2015-12-14 06:39:14

10

道格拉斯Leeder介紹說,這是非常值得您運行單元測試,你可以打好手中,這將確保它確實工作像您期望的任何診斷軟件。這包括不濫用內存,所以使用valgrind是一個好主意。

你真的想讓你的單元測試證明你的代碼有效。

你不必一直在valgrind下運行它們 - 但它應該儘可能小,而且你應該定期這樣做(比如在發生重大變化之後)。

相關問題