0

そのため、データベース コネクタのテストを作成するために、データベース コネクタをスタブ化しようとしています。問題は、データベース コネクタが非常に薄い層であり、それに対するクエリがいくらか制限がないことです。コードでデータベースから変数を要求できるようにしたいのですが、コネクタはこれで問題ないはずです。この呼び出しの署名は次のようになります。

dim = getDimension(self,dimensionName,otherIndentifyingInformation)

(これはすべて MATLAB にあります。答えが言語にとらわれないか、少なくとも MATLAB では実行不可能でないことを願っています。)

コードで使用するとdimensionName、データベースに格納される数少ないものの 1 つになります。コードがそれを呼び出し、それが存在しない場合、それは問題ありません。getDimensionここでの問題は、次のようなを 2 回呼び出すコードをテストしたいということです。

alt = conn.getDimension('alt',otherID);
str = conn.getDimension('str',otherID);

(うまくいけば) 明らかな理由で、同じであるaltstrは限りません。実際、通常はそうではありません。

それで、私の質問です。適切なテスト値を返すために getDimension をスタブ化したい場合、どうすればよいですか? getDimensionAltデータベースから出てくる可能性のあるものの数はいくらか無制限であり、それを維持するのは面倒なので、作成は面倒に思えます。スタブ オブジェクトにロジックを配置するよりも良い方法はありますか? これは間違った方法のように思えます...

編集: testDB のセットアップが提案されました。では、テスト ケースごとに testDB をセットアップする必要はありませんか? そして、各テストで、DB 接続を作成し、それをスタブとして返し、テストを実行してから、DB 接続をクリーンアップする必要がありました。これは、特に私がテストしているシステムではない場合、各テストのオーバーヘッドが大きくなるようです。

testDB をセットアップして、毎回適切な値を入力することは可能だと思います。それは良い習慣ですか?

編集 2: おそらく私の質問は不明です。テストしようとしている小さなコードがあります。上記の 2 行ほど複雑ではないので、きれいにテストしたいと思います。問題は、getDimension呼び出しのスタブ化が引数に依存していることです。このスタブを他のテストで再利用する必要はありません。

その答えは、「スタブに単純なロジックを入れても問題ない」かもしれないと思います。これは、MATLAB に無名クラスやスタブ フレームワークがないという事実によって完全に混乱しているため、難しいことですが、MATLAB でスタブ フレームワークを作成する前に、自分がやっていることを概念的に明確にしたいと考えています。

4

3 に答える 3

0

自動化された統合テストまたは受け入れテストを行っている場合は、testdb をセットアップすることをお勧めします。これは通常、スタック全体 (UI、アプリケーション、データベース、サービスなど) を一度にテストするテストを呼び出します。

単体テストはまったく異なります。これらは開発中に使用され、テスト中には使用されません。したがって、実行も変更も書き込みも高速である必要があります。通常、単体テストは、テスト対象の小さなコードにのみ依存するようにすることをお勧めします。これにより、脆弱性が軽減され、理解しやすくなり、開発者は頻繁に実行したいと思うようになります。

単体テストでスタブを使用することをお勧めします。あなたが直面しているように見える問題は、多くのテストでスタブを再利用したい場合、その振る舞いが非常に複雑になる可能性があるということです. これは、一度に多くのテストを行っている場合にも発生する可能性があります。

これに対する解決策は、1 つまたはいくつかのテストの動作のみを実装するより小さなスタブを用意し、テストで単一の動作のみをテストすることです。一度に多くの動作をテストするテストも便利ですが、単体テストではないため、統合テスト スイートに移動する必要があります (実際のデータベースで実行できます)。matlab についてはよくわかりませんが、多くの言語では、スタブの作成と動作の設定を処理するために使用できるモック フレームワークがあります。

于 2009-03-10T13:43:26.840 に答える
0

同様の質問への私の答え単体テスト用のモックデータの作成:

必要なインスタンスを構築するのに役立つ Builder クラス (この場合は、リポジトリに関連して使用するもの) を持つことができます。ビルダーに適切なデフォルトを使用させ、テストで必要なものを上書きできます。これにより、すべての異なるテストで「データ」のすべてのケースを混同する必要がなくなります (通常、異なるテストでは互換性のないケースがあるため、問題が発生します)。

更新 1: www.markhneedham.com/blog/2009/01/21/c-builder-pattern-still-useful-for-test-data をご覧ください

外部システムとの全体的な単体テストの関係について、この回答も確認してください。

dbunit のようなメモリ内データベースを使用する代替手段があることに注意してください。後のリンクに記載されている理由により、私はビルダーを好みます。

于 2009-03-10T16:50:03.037 に答える