TMTOWTDI、多分私は多次元ハッシュ(時には4-5レベルの深さ)に遭遇するたびに、私の最後のいくつかのプロジェクトでTest :: Deepを使っています。今すぐ私の通常の練習は、これらのハッシュを入力して、予期したデータを入力してからcmp_deeply(actual, expected, msg)
を実行するだけです。誰かがこのような深いネストされたデータをテストするためのアドバイスを持っていますか? - 私の現在の方法は非常に効率が悪く、時にはデータ構造の単体テストにつき1時間以上かかる場合もあります。Perlユニットの深い構造のテスト
答えて
私は通常is_deeply
からTest::Moreにこの罰金です。私はまた、いくつかのプロジェクトにはTest::Differencesを使用しました - それは非平等でより良い出力を持っているようです。
次のコメント欄のようにTest::Moreとis_deeply
を使用しています。また、テストを手動で実行し、必要に応じてData::Dumperを使用して期待値を格納するt/sample /ディレクトリを持つことによって、幾分自動化された比較も行っています。 (ああ、私はYAML - TMTOWTDIに行ったほうがいいでしょう)
Ie.一度ダンプジェネレータを実行し、ダンプされた構造を確認してコミットしてから、テストが中断するまでis_deeply
に依存してください。これは、バグまたは意図された構造の変更を意味します。
おそらくOPは、実行時間ではなく、予想される値を手動で入力することによって時間が消費されることを意味していました。優れた構造がわかっている場合は、Data :: DumperまたはData :: Dumpを使用してプログラマチックテキストを生成し、テストに組み込むことができます。
こんにちは、これは私が混乱のために申し訳ありません - 私はData :: Dumperを使いこなしましたが、ほとんどの場合、エッジケースの構造は、よく知られている構造とは大きく異なります(これらは、通常興味があります)。さらに、Data :: Dumpersの出力を使用すると、データ構造が数百行にわたり、独自のファイルが必要になる場合、テストファイルを何千もの行に分割しない限り、テストを分離する必要があります。/ –
構造をテストしたい場合は、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
の構造を検証するだろう、私はそれが非常に有用であることが判明しました。
- 1. 深いコピーグラフ構造
- 2. SpringBootユニットのテスト構成
- 3. Perlデータ構造
- 4. のMongoDB - 集計深い木構造
- 5. Perl - "Complex"データ構造
- 6. Perl:型制約のないクラス::構造
- 7. JS不変更新深い構造
- 8. コンテナのテスト構造
- 9. は、2D構造の3D深度に
- 10. ツリー構造の深度ストリームを作成
- 11. テストとpythonパッケージの構造
- 12. 連続テストのコード構造
- 13. ユニットBroadcastReceiverのテスト
- 14. 深い構造体のような.NETクラスのEquals()?
- 15. ユニットのMvvmCross.Droid.Viewのテスト
- 16. RESTKitを使用した深いXML構造の解析
- 17. Perl 6 NativeCall構造体の属性としての構造体の配列
- 18. ユニットWCFビヘイビアエクステンションのテスト
- 19. C:構造体の深いコピーを作成する...構造体の浅いコピーを作成する
- 20. マイフォルダ構造があるテスト
- 21. 海の地図の深度曲線の構造
- 22. Grailsユニット/ intergrationテスト
- 23. ユニットの通信プロトコルのテスト
- 24. ユニットのテストGoogleのクラウドストレージAPI
- 25. 計算ツリーの深さのJavaデータ構造
- 26. 深いデータ構造をトラバースしてオブジェクトを削除する
- 27. 深いXML構造体を抽出します
- 28. Pythonはデータ構造を深く整理しています
- 29. 再帰的なデータ構造のテスト
- 30. トレーニングとテストのデータ構造:Mallet Classifier
これらのデータ構造の大きさはどれくらいですか?あなたが扱っているデータのサイズにかかわらず、1時間は膨大なランタイムです。 – Ether
@Ether - 比較ルーチンが完全に最適化されていない可能性がありますか?私はいつも自分自身をロールバックしなければならなかった(比較公差やカスタム比較メソッドのような空想的なニーズのために)、ストックのものがどれほど良いかわからない。しかし私は私が大幅に元のバージョンに比べて鉱山を最適化することができた知っている。 – DVK
@DVK:あなたはそれをどのように呼び出すかによって異なります。たとえば、Test :: Deepには、オブジェクトのさまざまな部分を正確に比較する方法を指定できる、多くのカスタマイズ関数( 'noclass()、' methods() '、' str() 'など)があります。しかし、IMHOでは自分自身をロールバックする必要はほとんどありません。本当に自分自身で行う必要があるのは、DateTimeオブジェクトを正確に比較することだけでした(例えば、N秒以内に一致しているかどうかを確認するなど)。 – Ether