1

私は単体テストに不慣れで、現在、ブランチを含むメソッドをテストする適切な方法を見つけるのに問題があります。

問題を説明するために使用できる小さなデモ メソッドを作成しました。

public void ExportAccounts()
{
     int emptyAccounts = 0;
     int nonEmptyAccounts = 0;
     int errorous = 0;
     string outputPath = this.GetOutputPath();
     Account[] accounts = this.MyWebserviceAdapter.GetAccounts();
     foreach(Account account in accounts)
     {
        try 
        {
          if(account.Amount > 0)
          {
               this.ExportNonEmpty(outputPath, account);
               nonEmptyAccounts++;
          } else {
               this.ExportEmptyAccount(outputPath, account);
               emptyAccounts++;
          }
        } catch(Exception e) {
          logger.error(e);
          errorous++;
        }
     }
     logger.debug(string.Format("{0} empty / {1} non empty / {2} errorous", emptyAccounts, nonEmptyAccounts, errorous));
}

MyWebserviceAdapter をモックして、事前定義されたアカウントのリストを返すことができます。空であるアカウントと空ではないアカウントのリストを同じテストに入力する必要がありますか、それとも別のテストを行う必要がありますか?

また、私の ExportNonEmpty() および ExportEmpty() メソッドはプライベートですが、ファイル システムにファイルを書き込みます。ファイルシステムに触れないように、モック FileProvider を提供する必要がありますか?

ExportNonEmpty() と ExportEmpty() を公開して、それらを個別にテストできるようにする必要がありますか? これらのメソッドには、いくつかの if-then-else ステートメントも含まれており、例外などをスローできます。

あるテストから別のテストにコードをコピーしているすべてのコードパスのテストを作成するかどうかがわかります-モックの生成など..それは少し奇妙ではありませんか?

メソッドを呼び出した後にカウンター変数を検証できるようにするには、カウンター変数を out 変数として公開する必要がありますか?

this.GetOUTputPath() は、静的な ConfigurationManager を介して構成ファイルから値をフェッチします。a) testt の下のクラスの部分的なモックを作成して GetOutputPath メソッドを上書きするか、b) モックアウトできる独自の ConfigurationAdapter を作成して、これをモックアウトする必要がありますか?

nunit と Rhino Mocks を使用しています。

4

2 に答える 2

1

これをいくつかのテストベクトルでテストします。すべて空、すべて空でない、開始と終了が空と空でない混合。

結果の検証に関して: カウンターを公開してテストすると、オブジェクトの内部状態を認識している「ホワイト ボックス」テストが提供されます。これにより、より完全なテストが提供されますが、後で実装を変更することがより困難になります。 . (実装を変更すると、同じ効果でもテストが失敗する場合があります)。

私の好みは通常、«ブラック ボックス» をテストすることであり、操作の外部から観察可能な結果のみをテストします。次に、公開されている機能が同じ場合は、内部構造と回帰テストを変更できます。ただし、これにはさらに多くのモックコーディングが必要になる場合があります。

Javaの場合、モックオブジェクトの構築に役立つライブラリがかなりあります。.netについてはわかりませんが、同じことが当てはまると思います。

于 2008-12-19T13:33:28.637 に答える
1

条件ごとに個別のテスト。foreach が両方を含むループを反復することを信頼していると仮定します。私は...するだろう。おそらく、他の場所でモックしているメソッドをテストして、両方のタイプのアカウントが存在する場合に適切に返されることを確認しています。

コードをコピーする代わりに、一般的なコードをテスト クラスのメソッドまたは TestHelper クラスに抽出することでリファクタリングできます。それらを一般的に使用できるようにする必要がある場合は、それらをパラメーター化します。

テスト対象のクラスにアクセサーを追加することで、プライベート メソッドをテストできるはずです。プライベート メソッド内で [単体テストの作成] 右クリック メニュー項目を使用するか、クラス全体を追加するときに単体テストを作成するためにプライベート メソッドを 1 つとして追加すると、1 つが自動的に追加されます。ExportAccounts をテストするには、例外をスローするデータとスローしないデータを使用するだけで、直線的なロジックと例外処理の両方をテストできます。

メソッド変数は公開しません。メソッドの外では必要ありません。ただし、ロガーをモックして、期待されるパラメーターで呼び出されるようにする必要があります。

ConfigurationAdapter (または Wrapper) を作成し、それをクラスに挿入して、静的クラスへの依存を削除します。アダプターをモックアウトするか、偽の実装を提供するかは、あなたの選択です。依存関係を取り除くことは、とにかく従うべき良いパターンです。テスト中のクラスで何かをモックしたりスタブしたりしないことを好みます。

編集:単体テストの基本的な読み方については、Pragmatic Unit Testing (C# バージョン) とCode Completeの単体テストに関する章をお勧めします。.Net でのテスト駆動開発も取り上げたいと思うかもしれませんが、他のものはより一般的です。

于 2008-12-19T13:35:03.967 に答える