質問

大規模なデータセットを単体テストする最良の方法は何ですか?私が管理しているレガシーコードには、100人以上のメンバーの構造があります。私たちが取り組んでいるコードの他の部分は、数百のサンプルのデータセットを作成または分析します。

これまでに見つけた最良のアプローチは、構造またはデータセットをディスクからシリアル化し、テスト対象の操作を実行し、結果をディスクにシリアル化し、シリアル化された結果を含むファイルを期待される結果を含むファイルと比較することです。これはそれほど高速ではなく、「ディスクに触れないでください」に違反します。ユニットテストの原理。しかし、私が考えることができる唯一の代替案(何百ものメンバーとデータポイントを初期化してテストするコードを書く)は、耐え難いほど退屈だと思われます。

より良い解決策はありますか?

正しい解決策はありません

他のヒント

実際に達成しようとしているのが単体テストである場合、基礎となるデータ構造をモックアウトし、データをシミュレートする必要があります。この手法により、入力を完全に制御できます。たとえば、作成する各テストは単一のデータポイントを処理し、条件ごとに非常に簡潔なテストセットを作成できます。そこにはいくつかのオープンソースのモック作成フレームワークがあります。個人的にはRhino Mocksをお勧めします( http:// ayende.com/projects/rhino-mocks/downloads.aspx )またはNMock( http://www.nmock .org )。

データ構造をモックアウトできない場合は、リファクタリングすることをお勧めします。そうすれば、次のことが可能になります。または、モックを許可するTypeMock( http://www.typemock.com/ )を試すこともできます。具体的なクラスの

ただし、大きなデータセットに対してテストを実行している場合、実際には単体テストではなく機能テストを実行しています。その場合、データベースまたはディスクからデータをロードするのが一般的な操作です。回避するのではなく、自動化されたビルドプロセスの残りの部分と並行して実行するようにして、パフォーマンスへの影響が開発者を妨げないようにする必要があります。

これはまだ実行可能なアプローチです。ただし、これを機能テストとして分類するか、純粋な単体テストではありません。優れた単体テストは、発生する可能性のあるエッジケースの適切な分布を提供するレコードのサンプリングを行い、それらを記録することです。次に、最後の「受け入れ」があります。または「機能」すべてのデータに対して一括テストでテストします。

大量のデータをテストするときにこのアプローチを使用しましたが、小さなユニットがメンテナンス可能であるため十分に機能することがわかりました。そして、バルクテストが機能し、すべて自動であることを知っています。

  

これまでに見つけた最良のアプローチは、構造またはデータセットをディスクからシリアル化し、テスト対象の操作を実行し、結果をディスクにシリアル化し、シリアル化された結果を含むファイルを期待される結果を含むファイルと比較することです。

テストでディスクからシリアル化するのではなく、上記の手法を使用するコードを記述しました。シリアル化されたデータをバイト配列に変換し、コンパイラが実行可能ファイルに配置できるようにしました。

たとえば、シリアル化されたデータは次のように変換できます。

unsigned char mySerialisedData[] = { 0xFF, 0xFF, 0xFF, 0xFF, ... };

test()
{
    MyStruct* s = (MyStruct*) mySerialisedData;

}

より詳細な例(C#)については、この単体テスト。ハードコードされたシリアル化されたデータをテストへの入力として使用し、アセンブリ署名をテストする例を示しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top