2009-02-27 39 views
13

我認爲我自己對於TDD場景還很新。但是發現無論我使用哪種方法(模擬框架或存根自己的對象),我發現我必須編寫大量代碼才能創建模擬數據。我喜歡加載對象來創建內存數據庫的想法。但是我不喜歡的是,爲了創建模擬數據的唯一目的,使用大量的代碼來混淆我的測試。當數據需要考慮所有不同情況時尤其如此。爲單元測試創​​建模擬數據

我很樂意提供一些更好的方法。

在我看來,我應該能夠從一些數據存儲中將數據加載到一個已知狀態,然後我可以使用每個測試方法之前在測試設置/初始化中加載的狀態快照被執行。這將滿足正確的測試實踐,同時提供便利,讓我專注於編寫測試,而不是編寫代碼來「手動」創建測試數據。

回答

6

可能你可以試試NBuilder庫。它提供了一個非常流暢的界面,易於使用。您可以使用它來生成具有默認值的類的單個實例,或使用默認值或重寫值生成列表。你可以看看this之一。

0

我確切地知道你的意思。我認爲解決這個問題的一個好方法是實際上有一個單獨的MockFramework項目,它包含測試項目之外的所有模擬數據。這樣,您可以分別生成模擬數據,如果需要,也可以將其存儲在內存中,然後從測試項目中引用模擬框架。如果你使用第三方框架來做到這一點,那就更好了,但是你仍然可以將第三方框架包裝在你自己的模擬框架中,這樣你就可以得到所有「膠水」,以你需要的方式創建模擬數據你的測試可以使測試真正成爲他們需要的東西。

+0

這解決了雜亂的問題,但我仍然需要模擬所有數據,只需在一個單獨的項目中。也許,正如你所建議的那樣,我可以使用第三方框架加載數據並將其轉換爲我的對象模型。根據webjedi的建議,nDbUnit可以工作。 – 2009-02-27 19:27:10

1

您可以使用Builder類來幫助您構建所需的實例/在這種情況下,您將使用與存儲庫相關的實例。 讓Builder使用適當的默認值,並且在測試中,您可以覆蓋所需的內容。這有助於避免將所有不同測試混淆的每一個「數據」情況(引入問題,因爲通常情況下,不同測試不兼容的情況)。

**更新1:**看看www.markhneedham.com/blog/2009/01/21/c-builder-pattern-still-useful-for-test-data

+0

感謝您的鏈接,這有助於我更好地瞭解您的意思。這仍然需要我手動編寫對象,方法不同。不過,你不應該把每一個案例都放入「數據」中。 – 2009-02-27 19:15:26

+0

請注意,擁有默認設置的目的是爲了讓您擁有共享的配置/數據,但不會在特定情況下漏掉所有配置/數據。 – eglasius 2009-02-28 06:59:13

1

如果您使用的是.NET嘗試NDBUnit

您填寫您的商店,然後在測試時間恢復您的數據庫到已知狀態,爲每個測試。 Autumn of Agile屏幕播放系列以相當好的細節顯示了這一點。

或者您可以手動執行此操作...構建一個存儲過程或任何可以截斷您的表並在您的拆卸方法中複製數據的方法。

+0

這隻適用於集成測試。 – eglasius 2009-02-27 18:30:42

+0

弗雷迪里奧斯對你的第二條評論是正確的。 nDbUnit接近,但我似乎無法找到任何文檔。我從「秋天的敏捷」下載了代碼示例,看起來我需要一個xsd,而且我已經在使用實體框架,所以我必須將所有內容從xsd複製到EF。 – 2009-02-27 19:19:45

0

感謝所有的建議,我認爲解決方案需要一點點的一切。我不希望這些測試最終成爲迴歸測試,但沒有某種現有數據存儲,所有東西都歸結爲通過「手動」構建對象來創建數據。

真的很好會是一個框架,它允許我使用現有的DAL編寫腳本來爲我編寫數據或者獲取內存中的數據,並像訪問內存數據庫一樣訪問它。

0

Untils.org覆蓋這種方式比我所能做的更好。

他們的整個指南其實很好。

但基本上,如果你的單位需要「大量的數據」,他們可能不再是單元測試。我建議嘗試單獨測試小塊。

相關問題