2008-12-23 120 views
13

我在實現我的庫時使用了函數和類模板。 到目前爲止,我剛剛在庫單元測試(CppUnit)中實例化了一個模板, ,然後繼續對其進行測試,幾乎與其他任何常規類或函數一樣。單元測試C++模板

最近我一直在計劃將一些模板也添加到庫API中。 良好的界面當然是最重要的事情,模板與否。 通過精心設計和實施的模板,您可以(如果不是完全防止的話)至少使用戶更難以在腳中自拍。 任何我覺得單元測試公共模板需要更嚴格一點, 相比純粹的內部模板。

那麼,你如何對你的C++模板進行單元測試? 你有沒有想出任何優雅的解決方案, 尤其是公共庫API中的模板?

回答

5

對於初學者,單元測試您的模板代碼與您認爲最有可能爲用戶提供的參數。我經常做一些事情模板「以防萬一」,並且最終決不會使用任何東西,除了我在編寫原始代碼時想到的一種類型。因此,在這種情況下,測試最有可能的情況涵蓋所有情況!

如果您覺得您需要測試更多,請使用與第一個參數儘可能不同的另一個模板參數。可能不需要再次測試所有方法。有些方法可能實際上不依賴於模板參數。

0

在單元測試中Instanciating模板是測試模板類。

有什麼風險?他們取決於你的圖書館正在做什麼與模板參數;考慮可能出現的問題取決於用於實例化模板類的類並編寫新的測試。

至少你會讓你的單元測試環境準備好再現任何會被報告的問題。

4

我有一個額外的建議。除了對每個模板進行單元測試之外,還要檢查將幫助限制模板參數的潛在廣泛範圍,這些參數可能是您的庫用戶可能嘗試傳遞給模板的模板參數。

例如:假設您只使用類型參數「string」和「char」來測試模板。您無法證明其他類型的參數對於此特定模板會產生問題,但出於某種原因,您「懷疑」其他未經測試的類型參數存在問題。

在像上述例子那樣的情況下,它並不一定意味着你應該詳盡地測試其他類型的參數。相反,您有一個案例可能意味着您應該使用一些編譯時模板元編程技術來確保您的模板不會與其他任何參數一起使用,而是使用「string」和「char」。

一個資源:

Modern C++ Design -- by Andrei Alexandrescu

在這本書很早就撰文表示的例子如:

  • 如何做一個模板,將自我強制執行其第一類型arg是比第二類型arg小的類型

  • 如何在編譯時

「現代C++設計」(儘管它相當廣泛/模糊的稱謂)是模板編程技術相當先進的勘探檢測兌換和繼承。

+0

約束模板類型參數很重要,+1表示提及它。不這樣做就像所有的函數參數類型爲void * – Iocio 2008-12-25 21:09:06

3

Boost.Test具有便於根據模板參數集測試模板的組件。