2009-07-23 57 views
0

我有一個擁有7個相關字段的持久對象。你將如何測試過濾複雜對象的東西

字段可以容納這裏列出值的數量:

Field # of Possible Values 
1  5 
2  20 
3  2 
4  2 
5  19 
6  2 
7  8 

這是121600個唯一對象的可能性。

被測試的代碼是一些過濾器,它們根據字段的值獲取一定數量的這些對象,然後將它們放入一個容器中供其他系統使用。存放箱子是微不足道的,經過測試並正常工作......只是過濾不起作用。似乎有很多邊緣案例沒有被覆蓋,並且許多對象被放置在一個容器中,而根本不應該被選中,反之亦然。

總而言之,有9個過濾器工作在一個責任鏈中,每個過濾器都將物體放入垃圾箱,直到垃圾箱滿了爲止,此時鏈條退出。鏈中的最後一個過濾器只是一個'過濾器',它向管理員發送一封電子郵件,指出這些對象運行的很低(例如,如果鏈條到達此過濾器,則垃圾箱未滿,需要被看着)。

所以我的問題是這樣的:我如何測試這些過濾器?我可以用一系列的語句創建每個獨特類型的對象之一:

public void FixtureSetup() 
{ 
    for(each possible value for field 1) 
    { 
     for(each possible value for field 2) 
     { 
      // ... continue with 5 more for statements 

      // Create Object with each value 
     } 
    } 
} 

但是,試圖手動找出哪些對象應該從結果集合(過濾的對象,即使集合)進行適當過濾會非常困難(如果可能的話,當我第一次寫過濾器時,我會很容易地做到這一點)。

我知道,要求有過錯,因爲他們這樣說:

filter 1 gets 
    - field 1: values 1/2/3 
    - field 2: values 2/3/4 
    - etc. 

但結果都出現瞭如此多的優勢情況下,每個I改變它的時間來包括特定的情況下,一些否則會中斷(並且我沒有迴歸測試來確保它不會),並且很難找出鏈中發生特定問題的位置。

編輯>我試圖單獨地測試該過濾器,但是假定:

濾波器1抓鬥的121600個可能的對象(根據過濾器的條件)的500。我發現,那些被抓的對象說100(完全猜測)不應該 - 並且因爲各種原因。爲了知道,我必須通過其他系統的用戶來了解每個過濾器的結果集是否正確。與此相反的情況也在我腦海中徘徊... ...應該抓住什麼東西,但不是。

我開始認爲這可能是需求收集問題,而不是測試。

回答

6

這聽起來像你沒有一個明確的規範。如果你沒有一個清晰的規範,那麼你怎麼可能知道代碼是否按規範工作?

退後一步。通過寫一句話規格開始:

的FrobFilter組件需要Frobs的序列和地方各一正確FrobBin直到一個紙槽已滿。

好吧,現在你已經有了一個規範。這還不是可測試或可實施的規範。爲什麼不?兩個原因。

原因一:沒有指定在Frob序列用完之前沒有FrobBin填滿的結果。

原因二:沒有指定「正確」。

現在寫一個解決每個問題的一句話規範。

如果在某個bin滿了之前該序列結束,則會通知管理員。

對於Frob而言,Blargh是Gnusto的正確bin始終是FrotzBin。

好的,現在你還有兩個問題。管理員如何通知?如果Frob的Blargh不是Gnusto會發生什麼?

只要繼續分解它,一次一個句子,直到你有一個完整和準確的規格。然後你會發現你的規格,實現的程序和測試案例都看起來非常像。這是一個很棒的情況。

2

這聽起來像你應該單獨測試每個這些過濾器,模擬過濾器「下面」每個被鏈接到。

希望每個過濾器都很簡單,並且可以簡單地進行測試。

然後,我會爲整個事情進行一些集成測試,當它全部連線。

+0

這些過濾器很簡單,但日復一日,它們的複雜性不斷增加,以至於管理複雜性的事情正在使我受到傷害。 – 2009-07-23 18:07:30

+1

所有更多的理由讓過濾器單獨測試,人們可能會爭辯。祝你好運! :) – 2009-07-23 18:46:24