2011-02-08 114 views
2

TMTOWTDI,我當然希望如此 - 當我遇到多維哈希(有時4-5層深)時,我一直在使用Test :: Deep作爲最後幾個項目。現在我通常的做法是輸入這些散列並填入我的預期數據,然後運行cmp_deeply(actual, expected, msg)。有沒有人有這樣的單元測試深層嵌套數據的任何建議? - 我目前的方法看起來非常低效,有時每個數據結構的單元測試需要一個小時以上。Perl單元測試深層結構

+0

這些數據結構究竟有多大?無論您處理的數據量是多少,一個小時都是大量的運行時間。 – Ether 2011-02-08 17:37:27

+0

@其他 - 是否因爲比較例程未完全優化?我一直不得不推出自己的產品(由於比較容差和自定義比較方法等一些奇特的需求),並且不知道庫存產品有多好。但我知道我能夠比原始版本大幅優化我的作品。 – DVK 2011-02-08 21:25:50

回答

2

爲此,我通常可以用is_deeplyTest::More。我還用Test::Differences進行了一些項目 - 它在非平等方面似乎有更好的產出。

4

我使用Test::Moreis_deeply就像下一個評論者。我也有一些自動化的比較,有一個t/sample /目錄,通過手動運行測試並在適當的地方使用Data::Dumper來存儲期望值。 (哦,我最好已經用YAML - TMTOWTDI!)

也就是說,你運行一次dump-generator,查看dump結構,提交它們,然後只依靠is_deeply,直到測試中斷,這意味着錯誤或預期的結構更改。

0

也許OP意味着時間是通過手動輸入期望值而不是運行時間來消耗的。如果您具有已知的良好結構,則可以使用Data :: Dumper或Data :: Dump生成編程文本,然後將其結合到您的測試中。

1

如果您只是想測試結構,請嘗試Data::Validate::Struct

您需要定義一個參考數據結構,以便與可以是任何級別的實際數據結構進行比較,可以是任何嵌套散列/數組的組合。

這裏最重要的是要注意,這個模塊驗證數據類型,而不是實際的數據。

例:

my $exp = { 
'body' => { 
    'results' => [ 
     { 
      'template' => [ 
       { 
        'origin' => 'word', 
        'name' => 'word', 
        'id' => 'int', 
        'attributes' => [ 
         { 
          'value' => 'number', 
          'key' => 'word' 
         }, 
         { 
          'value' => 'text' , 
          'key' => 'word' 
         } 
        ], 
        'hostname' => 'hostname', 
       } 
      ] 
     } 
     ] 
    } 
}; 

然後

my $v = new_ok('Data::Validate::Struct', [ $exp ]); 
ok($v->validate($act), 'validate an exp against an act' . $v->errstr()); 

將驗證的$act$exp

嘗試結構,對模塊一看Tests,我發現它非常有用。