2011-02-08 15 views
2

TMTOWTDI、多分私は多次元ハッシュ(時には4-5レベルの深さ)に遭遇するたびに、私の最後のいくつかのプロジェクトでTest :: Deepを使っています。今すぐ私の通常の練習は、これらのハッシュを入力して、予期したデータを入力してからcmp_deeply(actual, expected, msg)を実行するだけです。誰かがこのような深いネストされたデータをテストするためのアドバイスを持っていますか? - 私の現在の方法は非常に効率が悪く、時にはデータ構造の単体テストにつき1時間以上かかる場合もあります。Perlユニットの深い構造のテスト

+0

これらのデータ構造の大きさはどれくらいですか?あなたが扱っているデータのサイズにかかわらず、1時間は膨大なランタイムです。 – Ether

+0

@Ether - 比較ルーチンが完全に最適化されていない可能性がありますか?私はいつも自分自身をロールバックしなければならなかった(比較公差やカスタム比較メソッドのような空想的なニーズのために)、ストックのものがどれほど良いかわからない。しかし私は私が大幅に元のバージョンに比べて鉱山を最適化することができた知っている。 – DVK

+0

@DVK:あなたはそれをどのように呼び出すかによって異なります。たとえば、Test :: Deepには、オブジェクトのさまざまな部分を正確に比較する方法を指定できる、多くのカスタマイズ関数( 'noclass()、' methods() '、' str() 'など)があります。しかし、IMHOでは自分自身をロールバックする必要はほとんどありません。本当に自分自身で行う必要があるのは、DateTimeオブジェクトを正確に比較することだけでした(例えば、N秒以内に一致しているかどうかを確認するなど)。 – Ether

答えて

2

私は通常is_deeplyからTest::Moreにこの罰金です。私はまた、いくつかのプロジェクトにはTest::Differencesを使用しました - それは非平等でより良い出力を持っているようです。

4

次のコメント欄のようにTest::Moreis_deeplyを使用しています。また、テストを手動で実行し、必要に応じてData::Dumperを使用して期待値を格納するt/sample /ディレクトリを持つことによって、幾分自動化された比較も行っています。 (ああ、私はYAML - TMTOWTDIに行ったほうがいいでしょう)

Ie.一度ダンプジェネレータを実行し、ダンプされた構造を確認してコミットしてから、テストが中断するまでis_deeplyに依存してください。これは、バグまたは意図された構造の変更を意味します。

0

おそらくOPは、実行時間ではなく、予想される値を手動で入力することによって時間が消費されることを意味していました。優れた構造がわかっている場合は、Data :: DumperまたはData :: Dumpを使用してプログラマチックテキストを生成し、テストに組み込むことができます。

+0

こんにちは、これは私が混乱のために申し訳ありません - 私はData :: Dumperを使いこなしましたが、ほとんどの場合、エッジケースの構造は、よく知られている構造とは大きく異なります(これらは、通常興味があります)。さらに、Data :: Dumpersの出力を使用すると、データ構造が数百行にわたり、独自のファイルが必要になる場合、テストファイルを何千もの行に分割しない限り、テストを分離する必要があります。/ –

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()); 

がモジュールにTestsを見ているようにしてください$exp

に対して$actの構造を検証するだろう、私はそれが非常に有用であることが判明しました。

関連する問題