ステータスに対する間接テスト

4841 ワード

ステータスベースのテスト(ステータス検証とも呼ばれる)を定義すると、メソッドが実行された後、被測定システムとその協力者(依存項目)のステータスをチェックすることによって、メソッドが正しく動作しているかどうかを検出します.
LogAnalyzerクラスを使用する状態テストに基づく簡単な例を見てみましょうが、簡単にメソッドを呼び出してテストを完了することはできません.コードリスト2.3は、クラスのコードを示す.
コードリスト2.3 IsValidLogFileNameを呼び出して属性の値をテストする

  
    
  1. public class LogAnalyzer  
  2. {  
  3.     private bool wasLastFileNameValid;  
  4.  
  5.     public bool WasLastFileNameValid  
  6.     {  
  7.         get { return wasLastFileNameValid; }  
  8.         set { wasLastFileNameValid = value; }  
  9.     }  
  10.  
  11.     public bool IsValidLogFileName(string fileName)  
  12.     {  
  13.         if (!fileName.ToLower().EndsWith(".slf"))  
  14.         {  
  15.             wasLastFileNameValid = false;  
  16.             return false;  
  17.         }  
  18.  
  19.         //  
  20.         wasLastFileNameValid = true;  
  21.         return true;  
  22.     }  
  23. }  

コードから分かるように、LogAnalyzerは検証検査の最終結果を覚えている.論理的には他のメソッドが呼び出されることに依存するため、この機能をテストするには、単純にテストを書くだけでなく、メソッドの戻り値を取得するために使用することはできません.ロジックに問題があるかどうかを検出するために他の手段を使用する必要があります.
まず、テストする論理を決定する必要があります.新しい属性wasLastFileNameValidにありますか?いいえ、IsValidLogFileNameメソッドにあるので、テスト名はこのメソッドで始まる必要があります.コードリスト2.4は、結果が記憶されているかどうかを確認する簡単なテストを提供します.
コードリスト2.4メソッドを呼び出し、そのプロパティ値をチェックすることによってクラスをテストする

  
    
  1. [Test]  
  2. public void IsValidLogFileName_ValidName_RemembersTrue()  
  3. {  
  4.     LogAnalyzer log = new LogAnalyzer();  
  5.  
  6.     log.IsValidLogFileName("somefile.slf");  
  7.       
  8.     Assert.IsTrue(log.WasLastFileNameValid);  
  9. }  

IsValidLogFileNameメソッドの機能をテストするために、被測定コード以外の場所で断言していることに注意してください.
コードリスト2.5は、別の例を示している(3章で再度使用する).この例では、内蔵メモリ計算機機能を表示します.(本書のサンプルコードCalculator.csとCalculatorTests.csを参照).
コードリスト2.5 Add()メソッドとSum()メソッド

  
    
  1. public class Calculator  
  2. {  
  3.     private int sum = 0;  
  4.     public void Add(int number)  
  5.     {  
  6.         sum += number;  
  7.     }  
  8.     public int Sum()  
  9.     {  
  10.         int temp = sum; sum = 0;  
  11.         return temp;  
  12.     }  
  13. }  

Calculatorクラスの動作原理は、皆さんが知っていて好きなポケットコンピューティングに似ています.数値を入力し、+を押し、別の数値を入力し、+を押します.入力が終了したら、=を押すと現在の合計が得られます.
どこからSum()メソッドをテストしますか?最も簡単なテストから始めなければなりません.たとえば、テストSum()はデフォルトで0を返します.コードリスト2.6は、以上の方法を示している.
コードリスト2.6 Calculatorに対するSum()メソッドの最も簡単なテスト

  
    
  1. [Test]  
  2. public void Sum_NoAddCalls_DefaultsToZero()  
  3. {  
  4.     Calculator calc = new Calculator();  
  5.  
  6.     int lastSum = calc.Sum();  
  7.  
  8.     Assert.AreEqual(0,lastSum);  
  9. }  

Add()メソッドを呼び出す前に他のテストを書くことはできないので、次のテストではAdd()を呼び出し、Sum()が返す数値を断言する必要があります.コードリスト2.7は、新しいテスト方法が添付されたテストクラスを示す.
コードリスト2.7 2つのテストで、2番目にAdd()メソッドが呼び出されました.

  
    
  1. [SetUp]  
  2. public void Setup()  
  3. {  
  4.     calc = new Calculator();  
  5. }  
  6.  
  7. [Test]  
  8. public void Sum_NoAddCalls_DefaultsToZero()  
  9. {  
  10.     int lastSum = calc.Sum();  
  11.     Assert.AreEqual(0,lastSum);  
  12. }  
  13.  
  14. [Test]  
  15. public void Add_CalledOnce_SavesNumberForSum()  
  16. {  
  17.     calc.Add(1);  
  18.     int lastSum = calc.Sum();  
  19.     Assert.AreEqual(1,lastSum);  
  20. }  

ここでのテストは[SetUp]に関連する方法でCalculatorオブジェクトを初期化することに注意してください.これは、コードをより少なくし、Calculatorを同じ方法で初期化することを確保するために、テストを書く時間を節約できるため、良い考えです.同様に、Calculatorのコンストラクション関数を変更する場合は、各テストでnew呼び出しを変更することなく、初期化コードを1つの場所で変更する必要があります.今まで、すべてがよかった.しかし、被測定方法が外部資源に依存していたらどうなるのだろうか.例えば、ファイルシステム、データベース、Webサービス、または私たちが制御しにくい他のものに依存します.これは、試験杭オブジェクト(stub)、擬似オブジェクト(fake)、およびシミュレーションオブジェクト(mock)の新規作成を開始するときに、次の章で説明します.