どのようにしてテストモジュールを抽出しますか?


[/b][b]質問:
1つの製品クラスにいくつかのテストが作成されると、重複するコードが含まれます.重複するコードはソフトウェアの多くの問題の根源であり、コードの重複性をどのように解消するかを知っているからです.
背景:
同じ製品クラスのためにいくつかのテストを作成するときに、最初に気づいたパターンの1つは、テストが始まるたびにコードが常に似ていることです.各テストには、オブジェクトを作成し、いくつかのメソッドを呼び出し、結果を確認する3つの基本的な構成要素があります.各テストの第2の部分は常に異なり、異なるメソッドの呼び出しに対して異なるテストを区別することができます.「これらのパラメータで構造メソッドを呼び出すと、このような結果が表示されます.しかし、空の値が渡された場合、構造メソッドはそのような異常を投げ出すべきです」.
テストの第3部では、結果をチェックします.これはあなたが呼び出した方法に完全に依存しています.テストが呼び出した方法が異なる場合は、もちろん期待される結果も異なります.一般的に,この部分では,同じメソッドを繰り返し呼び出したときにのみ重複コードが現れる.
しかし、オブジェクトを作成するとテスト間の重複コードが生成され、ほとんどの重複コードがここに表示されます.1つのクラスには構築方法以外にも多くの方法がテストする必要があります.そのため、このクラスの2番目のテストを作成すると、同じパラメータで同じ構築方法が呼び出される可能性が高いため、1番目のテストの「いくつかのオブジェクトを作成」の部分が繰り返されます.このような重複コードはよくあるので、Junitがそれを除去するために内蔵されたメカニズムがあれば、それに越したことはありません.
テストするオブジェクトをテストモジュールと呼ぶ場合、その動作は予見可能です.これにより、テストの第1部である「オブジェクトの作成」を「テストモジュールの作成」と呼ぶことができます.いくつかのオブジェクトを作成し、いくつかのメソッドを呼び出すときに結果を予見できるように、既知の状態に初期化することを目的としています.
テクニック:
テストから重複するテストモジュールコードを見つけ、setup()という方法に移動します.変更されたコードは、setup()メソッドで変数を宣言し、テストで使用するため、コンパイルする必要はありません.これらの変数をインスタンスレベルのパラメータドメインに配置し、setUp()とテストコードを使用できます.各テストは独自のインスタンスで実行されるため、異なるテスト間でインスタンスレベルのパラメータドメインが誤って変更される心配はありません.テストを実行すると、test runnerは各テストの前にsetUp()メソッドを呼び出します.テストクラスの各テストは、この一般的な方法で初期化できます.
コードのデモ:
以下のコードMoney JavaBeanと方法は提供されず、テストコードに基づいて、自分で発売することができます.

   public class MoneyTest extends TestCase{
   
      public void testAdd(){
           Money added = new Money(12,50);
           Money augend = new Money(12,50);
           Money sum = added.add(augend);
           assertEquals(2500,sum.inCents());
         }
      public void testNegate(){
          Money money = new Money(12,50);
          Money opposite = money.negate();
          assertEquals(-1250,opposite.inCents());
        }
     
      public void testRound(){
         Money money = new Money(12,50);
         Money rounded = money.roundToNearestDollar();
         assertEquals(1300,rounder.inCents());
        }
    }

上の3つのテストの最初の行はほとんど同じで、このオブジェクトをsetup()メソッドに移動できるようです.testAdd()メソッドはこのオブジェクトをaddedと呼び、他のmoneyと呼ぶため、まずadded関連moneyを3つのテストの最初の行が同じにするために必要であり、その後、この行をsetUp()メソッドに移動することができます.最後に、moneyをローカル変数からインスタンスレベルのパラメータドメインに変更し、setup()とすべてのテストで使用できるようにします.次に、変更されたコードを見てみましょう.

   public class MoneyTest extend TestCase{
       private Money money;
 
       protected void setUp()throws Exception{
          money = new Money(12,50);
       }

       public void testAdd(){
         Money sum = added.add(augend);
         assertEquals(2500,sum.inCents());

       }
       
       public void testNegate(){
          Money opposite = money.negate();
          assertEquals(-1250,opposite.inCents());
        }
     
      public void testRound(){
         Money rounded = money.roundToNearestDollar();
         assertEquals(1300,rounder.inCents());
        }

     }

上のようにして、私たちは実は数学の中で1つの概念がとても良いことを言っています:それは
方程式を変形して公因式を抽出します.何事も検討と討論ができる.
ディスカッション:
Junitはメソッドsetup()とteatDown()を通じてテストモジュールのサポートを提供し、junit.framework.TestCaseで彼らを見つけた.TestCaseのサブクラスを作成するときは、これらのメソッドを再ロードして、テストごとにテストモジュールを構築または破棄できます.Junitがこれらのメソッドをどのように使用するかを理解するには、別のTestCaseメソッドrunBare()のコードを表示します.

  public void runBare()throws Throwable{
       setUp();
   try{
      runTest();
        }
   finally{
         tearDown();
       }
   }

テストを実行するとき、フレームワークはまずrunBare()メソッドを呼び出してテストモジュールを設定し、テストを実行してからテストモジュールを取り消します.注意tearDown()をfinallyブロックに入れると、テストが無効になっても、この方法はリソースを解放し、リソースの浪費を避けるために実行されることを保証します.