私はユニット テストの世界では比較的初心者ですが、今週、既存のアプリにテスト カバレッジを追加することにしました。
これは非常に大きな作業です。主な理由は、テストするクラスの数が多いことですが、テストの記述自体が私にとってまったくの初心者だからです。
すでにたくさんのクラスのテストを書いていますが、それが正しいかどうか疑問に思っています。
メソッドのテストを書いているとき、メソッド自体にすでに書いたものをもう一度書き直すような気がします。
私のテストはメソッドに非常に密接に結びついているようです (すべてのコードパスをテストし、いくつかの内部メソッドが特定の引数で何度も呼び出されることを想定)。そのため、メソッドをリファクタリングすると、メソッドの最終的な動作が変わってなくてもテストが失敗するようです。
これは単なる感覚であり、前に述べたように、私はテストの経験がありません。経験豊富なテスターが、既存のアプリの優れたテストの書き方についてアドバイスをくだされば、大変助かります。
編集: Stack Overflow に感謝します。15 分以内に素晴らしい情報が得られ、何時間もかけてオンラインで読んだ内容の多くに答えることができました。
ベストアンサー1
私のテストはメソッドに非常に密接に結びついているようです (すべてのコードパスをテストし、いくつかの内部メソッドが特定の引数で何度も呼び出されることを期待しています)。そのため、メソッドをリファクタリングすると、メソッドの最終的な動作が変わってなくてもテストが失敗するようです。
やり方が間違っていると思います。
ユニットテストでは次のことを行う必要があります。
- 1つの方法をテストする
- そのメソッドに特定の引数を与える
- 結果が予想通りかどうかをテストする
メソッドの内部を調べて、それが何をしているか確認するべきではないので、内部を変更してもテストが失敗することはありません。プライベート メソッドが呼び出されていることを直接テストすべきではありません。プライベート コードがテストされているかどうかを確認したい場合は、コード カバレッジ ツールを使用します。ただし、これに執着する必要はありません。100% のカバレッジは必須ではありません。
メソッドが他のクラスのパブリック メソッドを呼び出し、これらの呼び出しがインターフェイスによって保証されている場合は、モック フレームワークを使用してこれらの呼び出しが行われていることをテストできます。
期待される結果を動的に生成するために、メソッド自体 (またはメソッドが使用する内部コード) を使用しないでください。期待される結果は、実装が変更されても変更されないように、テスト ケースにハードコードする必要があります。ユニット テストで実行する必要がある簡単な例を次に示します。
testAdd()
{
int x = 5;
int y = -2;
int expectedResult = 3;
Calculator calculator = new Calculator();
int actualResult = calculator.Add(x, y);
Assert.AreEqual(expectedResult, actualResult);
}
結果の計算方法はチェックされず、結果が正しいかどうかだけがチェックされることに注意してください。上記のような単純なテスト ケースをどんどん追加して、できるだけ多くのシナリオをカバーしてください。コード カバレッジ ツールを使用して、興味深いパスを見逃していないかどうかを確認してください。