單元測試大數據集的最佳方式是什麼?我維護的一些遺留代碼具有一百或更多成員的結構;我們正在處理的代碼的其他部分創建或分析數百個樣本的數據集。單元測試大數據集?
到目前爲止,我發現的最佳方法是從磁盤序列化結構或數據集,執行測試操作,將結果序列化到磁盤,然後將包含序列化結果的文件與包含預期結果的文件進行比較。這不是非常快,它違反了單元測試的「不要觸摸磁盤」的原則。然而,我能想到的唯一選擇(編寫代碼來初始化並測試數百個成員和數據點)似乎令人無法忍受。
有沒有更好的解決方案?
單元測試大數據集的最佳方式是什麼?我維護的一些遺留代碼具有一百或更多成員的結構;我們正在處理的代碼的其他部分創建或分析數百個樣本的數據集。單元測試大數據集?
到目前爲止,我發現的最佳方法是從磁盤序列化結構或數據集,執行測試操作,將結果序列化到磁盤,然後將包含序列化結果的文件與包含預期結果的文件進行比較。這不是非常快,它違反了單元測試的「不要觸摸磁盤」的原則。然而,我能想到的唯一選擇(編寫代碼來初始化並測試數百個成員和數據點)似乎令人無法忍受。
有沒有更好的解決方案?
這仍然是一個可行的方法。雖然,我會將它分類爲功能測試,或者不是純粹的單元測試。一個好的單元測試是對那些可能遇到的邊緣案例進行良好分佈的記錄進行抽樣,然後寫出來。然後,您對所有數據進行批量測試,然後進行最後一次「驗收」或「功能」測試。
我在測試大量數據時使用了這種方法,並且我發現它工作得很好,因爲小單位是可維護的,然後我知道批量測試可以工作,而且都是自動的。
如果你試圖實現的是,事實上,單元測試你應該嘲笑底層數據結構並模擬數據。這種技術可以讓您完全控制輸入。例如,您編寫的每個測試都可以處理單個數據點,並且您將針對每個條件都有一組非常簡潔的測試。有幾個開源的嘲笑框架,我個人推薦Rhino Mocks(http://ayende.com/projects/rhino-mocks/downloads.aspx)或NMock(http://www.nmock.org)。
如果你不可能嘲笑數據結構,我推薦重構,以便你能夠:-)它值得!或者你也可以嘗試TypeMock(http://www.typemock.com/),它允許嘲笑具體的課程。
但是,如果您正在對大型數據集進行測試,那麼您確實正在運行功能測試而不是單元測試。在這種情況下,將數據加載到數據庫或從磁盤加載數據是一種典型操作。與其避免它,你應該努力讓它與自動構建過程的其餘部分並行運行,這樣性能的影響不會讓你的任何開發人員受到影響。
到目前爲止,我發現的最佳方法是從磁盤序列化結構或數據集,執行測試操作,將結果序列化到磁盤,然後將包含序列化結果的文件與包含預期文件結果。
我已經編寫了使用上述技術的代碼,除了在測試中從磁盤序列化以外,我已經將序列化數據轉換爲編譯器可以放入可執行文件的字節數組。
例如,你的序列化的數據可以被轉換成:
unsigned char mySerialisedData[] = { 0xFF, 0xFF, 0xFF, 0xFF, ... };
test()
{
MyStruct* s = (MyStruct*) mySerialisedData;
}
對於一個更詳細的例子(在C#)看到此unit test。它顯示了使用一些硬編碼的序列化數據作爲測試輸入的例子,測試程序集簽名。
如果您正在測試數據本身,我認爲您必須觸摸磁盤。 – MrBoJangles 2008-10-24 22:07:52