2012-05-24 40 views
1

我是新的行爲驅動開發,我無法找到任何與當前問題類似的示例或指導原則。如何使用BDD來編寫複雜的數據結構/數據層

我目前的項目涉及到一個龐大的三維網格,每個離散單元中有任意數量的槽。存儲在這些槽中的實體具有它們自己的槽,因此可以存在任意的實體嵌套。所使用的對象的最終實現需要某種持久數據存儲的支持,這會使API變得複雜一些(即,使用加載/存儲而不是get/set之類的詞,並確保修改返回的項目不會修改數據存儲本身中的相應​​項目)。不用擔心,我的第一個實現將僅存在於內存中,但API是我應該定義的行爲,因此實際實現現在無關緊要。

我堅持的事情是,BDD的文獻集中在物體之間的相互作用以及模擬物體如何能夠幫助它。這似乎並不適用於此。我的抽象數據存儲的唯一真正的「行爲」涉及從編程語言本身所代表的實體以外的實體加載和存儲數據;我無法定義或測試這些行爲,因爲它們是依賴於實現的。

那麼我可以定義/測試什麼?自然的選擇是國家。存儲東西。確保它加載。修改我加載的東西,並確保我重新加載它沒有修改。等等,但我的印象是,這是新BDD開發人員常見的陷阱,所以我想知道是否有更好的方法可以避免它。

如果我確實採取了狀態測試路線,還會出現其他一些問題。很明顯,我可以先測試一個空的網格,然後在一個位置測試一個空實體,但接下來呢?兩個實體位於不同的位置?兩個實體位於同一位置?嵌套實體?我應該測試嵌套多深?我是否測試這些非排他性案例的笛卡爾乘積,即兩個實體位於同一位置並且每個實體都是嵌套實體?名單一直持續下去,我不知道該停在哪裏。

回答

1

TDD和BDD的區別在於語言。具體而言,BDD專注於功能/對象/系統行爲以改進設計和測試的可讀性。

通常,當我們思考的行爲我們認爲物體互動和協作方面,因此需要嘲笑單元測試。但是,如果這是合適的,那麼其行爲是修改網格狀態的對象沒有任何問題。 TDD/BDD都可以使用基於狀態或模擬的測試。

但是,爲了測試複雜的數據結構,您應該使用Matchers(例如Java中的Hamcrest)來測試您感興趣的部分狀態。您還應該考慮是否可以將複雜數據分解爲對象協作(但只有從算法/設計的角度來看,這一點纔有意義)。