junnit 4ユニットの高級な使い方を簡単に話します。

7213 ワード

JunnitユニットテストのフレームワークはJavaプログラム開発に必要なテスト利器です。今最もよく使われているのはJunnit 4です。Junnit 4ではすべてのテストケースに注釈の形式が使われています。これはJunnit 3よりもっと柔軟で便利です。以前、会社の単位テストに関するトレーニングコースで、講師はJunnit 4の基本的なライフサイクルに関する注釈の使用を述べました。主に@BeforeClass、@Before、@Test、@After、@AfterClassなどの注釈を含んでいます。これらは普通の簡単なユニットテストに対応するのに十分です。しかし、多くのより複雑で、頻繁に発生するテストの需要は、これらのライフサイクルに依存して注釈を完了することはできません!この分かち合いはJunnit 4のもう一つの新大陸をお見せします。
       実際には、ユニットテストトレーニングコースでは、講師はJunnit 4の核心については言及していません。例えば、なぜJunitはmain()方法がないと実行できますか?例えばJunnitのコア構成部分は何ですか?Junnitが動作ユニットテスト時にデータを取得し、テストを行う行為をどうやって変更しますか?もっと具体的には、二つのパラメータが必要な方法をテストしたいですが、どうやって私が提供したパラメータのすべての配列の組み合わせを使って方法をテストしますか?もし広大なテストケースで特定の種類に関する用例だけをテストしたいなら、どうすればいいですか?
      その前に、まずちょっと訂正してください。Junnit 4は直接に私達のある方法を運行します。mainの入り口関数がないといけません。以前私たちの組の妹にSpringを話したときに、テスト方法の種類にSpringを追加したResource注は卵用がないと教えました。つまりSpringはこの試験類を掃き写すことができないので、このタイプに属性値を付けることはできません。なぜですか?Springはテストクラスで@Beforeによって表記された方法で起動されているため、JVMはこのテストクラスを既に例示化していますが、Springによって実装されたのではなく、Springによって一歩遅れたので、Springの容器にはこのような例がありません。じゃJunnit 4は本当にメールの方法がありますか?そうです。直接に私達の方法を実行できるなら、必ず自分でJVMにプログラムの入り口を提供します。実はorg.junnit.runnerに包まれて、JUnit Core.classがあります。その中には標準的なmain方法があります。これはJUnit入口関数です。このように見ると、それは実は私達が直接に自分のメーン方法の中で走っています。私達がテストする方法は本質的に同じです。
     次に、Junnitテストの枠組みの新大陸というか、その核心部品というか、講師が教えてくれなかったが、とても役に立つものです。
     Runnerは抽象的なタイプで、Junnitテスティングを実行するためのツールを表しています。テストを実行して、Notifierの実行結果を通知します。通常、私たちは測定方法があるクラスの上で@RunWith注釈を使ってこのテストクラスに特定のRunnerを指定することができます。でも、多くの場合、私達はそうしていません。JunnitのデフォルトRunnerを使っています。BlockJunnit 4 Class Runner。テストクラスに@RunWith注釈を追加しないと、実はこのRunnerを使っています。これはデフォルトのRunnerとして、Junnitライフサイクルに基づく基本的なテスト注釈を提供してくれました。通常ではないテストの需要がもっと多いと、私たちはテストクラスのために@RunWith注釈を追加し、特定のRunnerを指定して完成する必要があります。いくつかの有用なRunnerを以下に示します。
一、Suit-----一度に複数の種類の中で全面的にテストを行うことができます。例えば:

@RunWith(Suite.class)
@SuiteClasses({Person.class, People.class})
public class TestSuitMain{
 //        ,       Junit  ,   ,   Person.class //People.class             !
}
二、Parameeterized------普通のユニットテストで@Testに注釈表示されたテスト方法はpublic voidだけであり、入力パラメータは一切ありません。これは時々私達に迷惑をかけます。テスト方法のためにパラメーターを入力する必要があります。さらに大量に複数の測定パラメーターを指定します。この時、ParameeterizedというRunnerは私達の要求を満たすことができます。使い方は以下の通りです。

@RunWith(Parameterized.class)
public class TestGenerateParams{
  private String greeting;
  public TestGenerateParams(String greeting){
    super();
    this.greeting = greeting;
  }
  @Test
  public void testParams(){    System.out.println(greeting);
  }
  /**
   *                 ,      public static
   * @return
   */
  @Parameters
  public static List getParams(){
    return Arrays.asList(new String[][]{{"hello"},{"hi"},{"good morning"},{"how are you"}});
  }
}
三、Category------Suitから継承して、より強大になります。テストクラスでテストされた方法を分類して実行します。たとえばPersonオブジェクトにはいくつかの属性があります。これらの属性はget/set方法を持っています。また、いくつかの一般的な方法があります。属性を取得したget法と一般的な方法を分類試験することができる。例えば:

public class PersonTest{
  @Category(AttributeFun.class)
  @Test
  public void testGetAge(){
    int age = person.getAge();
    assertEquals(3, age);
  }
  @Category(AttributeFun.class)
  @Test
  public void testGetName(){
    String name = person.getName();
    assertEquals("Willard", name);
  }
  @Category(BehaviorFun.class)
  @Test
  public void testTalk(){
    String message = person.talkTo("Jimy");
    assertNotNull(message);
  }
  @Category(BehaviorFun.class)
  @Test(timeout=200)
  public void testWalk(){
    person.walk();
  }
}
//           :
@RunWith(Categories.class)
@SuiteClasses(PersonTest.class)
@IncludeCategory(AttributeFun.class)
public class CategoryTest{
 //  ,    @IncludeCategory  ,      Suit        。
}
四、Therores------原理や推測の意味を意味しますが、ここではより直感的に表現しています。パラメータのセットの整列グループ合値を待つ方法のない入力パラメータとして提供します。また、TheroresというRunnerを使う時、私達の測定待ち方は入力パラメータを持つことができますが、これは他のRunnerでのテスト方法はいけません。以下は一例です。

@RunWith(Theories.class)public class TheoriesTest{
  @DataPoint
  public static String nameValue1 = "Tony";
  @DataPoint
  public static String nameValue2 = "Jim";
  @DataPoint  public static int ageValue1 = 10;
  @DataPoint
  public static int ageValue2 = 20;
  @Theory
  public void testMethod(String name, int age){
    System.out.println(String.format("%s's age is %s", name, age));
  }
}
上のコードの意味は、「Tony」、「Jim」、10、20の4つのパラメータをタイプの合法的な配列で組み合わせて送る方法がないということです。出力の結果は必ず2 x 2=4種類があります。

  Tony's age is 10
  Tony's age is 20
  Jim's age is 10
  Jim's age is 20
ただし、簡単にするためには、@DataPoint注解を使ってパラメータを提供するほか、@DataPoints注解を通じてパラメータを提供することもできます。上記のコードを参照して、@DataPoint注解で表示されている4つのフィールドパラメータを下記の2つに置き換えるだけでいいです。

@DataPoints
public static String[] names = {"Tony", "Jim"};
@DataPoints
public static int[] ageValue1 = {10, 20};
で4つのJunnitアクチュエータの使用例を示し、この4つのアクチュエータのサポートがあり、基本的にほとんどのテストニーズが解決されます。もちろんJunnitが提供している機能はこれらだけではないです。このほかに、Junit 4が提供するRule/Asume/Asssertなども利用できます。
Ruleを使用するとセルテストのための試験規則を指定できます。これらの利用可能なRule:
       Verifeier:テスト実行結果の正確性を検証します。
       Error Collector:テスト方法で発生したエラー情報を収集します。テストは中断されません。エラーが発生したらテスト終了後にマークが失敗します。
       ExpectedException:柔軟な異常検証機能を提供します。
      Timeout:タイムアウトをテストするためのRule。
      External Resource:外部資源管理。
     TemporaryFolder:JUnitのテスト実行前後に、新しい一時ディレクトリを作成し、削除します。
     TestWatch:試験方法のライフサイクルの各段階を監視します。
     TestName:テスト方法の実行中にテスト名を取得する能力を提供します。
また、Asumeは仮説を示していますが、実際には方法がないパラメータに対して合法的な検査を行っています。もし検査が不合格なら、直接に異常を投げてテストを実行しません。これはGavaのPrectionと似ている。Asumeが提供する検査規則は以下の通りです。
      asume True/asumeFalse、asumeNotNull、asumeThat、asume NoException
例えば:(下記のコードでも見られます。パラメータを使うには@Thory注解を使用します。)

@Theory
public void printAge(String name, int age){
    Assume.assumeTrue(age > 0);//    age<=0,  AssumptionViolatedException  
    System.out.println(String.format("%s's Name is %s.", name, age));
}
AsssertはJunitが提供した断言です。Aspsumeとは違って、Asssertはテスト結果のチェックです。その検査規則は以下の通りです。
      AsertTrue、AsertFalse:結果のtrue、false。
      AsertThat:Matchを使ってカスタマイズのチェックを行います。
      AsertEquals、AsertNotEquals:2つのオブジェクトが等しいかどうかを判断する。
      AsertNull、AsertNotNull:対象が空かどうかを判断します。
      AsertSame:二つのオブジェクトが同じかどうかを判断します。equalsとは違って、ここでは「=」を使って判断します。
      AsertArayEquals:2つの配列が等しいかどうかを判断する。
締め括りをつける
以上がjunnit 4ユニットの高級用法テストの全部です。興味のある友達はJava非閉塞I/Oの使い方を参照してください。  Javaにおけるmapエルゴード方式の選択問題の詳細  Javaは4つの混合演算コードの例を実装します。などです。皆さんが当駅を応援してください。