JUnit簡単な使用チュートリアル

6272 ワード

JUnitの概要


JUnitはErich GammaとKent Beckによって作成された回帰テストフレームワークである.JUnitテストはプログラマーテスト、いわゆるホワイトボックステストです.プログラマーはテストされたソフトウェアがどのように機能を完成するか、どのような機能を完成するかを知っているからです.

単純作成ユニットテストインスタンス

public class JunitAnnotation {

    // execute before class
    @BeforeClass
    public static void beforeClass() {
        System.out.println("in before class");
    }
 
    // execute after class
    @AfterClass
    public static void afterClass() {
        System.out.println("in after class");
    }

    // execute before test
    @Before
    public void before() {
        System.out.println("in before");
    }

    // execute after test
    @After
    public void after() {
        System.out.println("in after");
    }

    // test case
    @Test
    public void test() {
        System.out.println("in test");
    }

    // test case ignore and will not execute
    @Ignore(“unimplemented”)
    public void ignoreTest() {
        System.out.println("in ignore test");
    }
}

JUnit常用注記の紹介


      @Test:JUnit 3.xは、テストメソッドの名前(test+メソッド名)を付けてテストであるかどうかを決定し、すべてのテストクラスがTestCaseを継承する必要があります.JUnit 4.xはメソッドの前に@Testを付けるだけでテストメソッドを定義できます.
注意:テスト方法はpublic void、すなわち共通で、戻り値がない必要があります.異常を投げ出すことができます.
@Ignore:注記タグのテスト方法は、テストでは無視されます.テストの方法がまだ実装されていない場合、またはテストの方法が古くなっている場合、または何らかの条件でこの方法をテストすることができます(例えば、データベース接続が必要ですが、ローカルテストの場合、データベースは接続されていません).この注釈を使用して、この方法をマークします.同時に、この注記にStringのパラメータを渡すことができ、なぜこのテスト方法を無視したのかを示します.たとえば、@lgnore(「このメソッドはまだ実装されていません」)は、実行時にメソッドが実装されていないことのみが報告され、テストメソッドは実行されません.
@BeforeClass:関連するいくつかの使用例を実行すると、データの準備や他の事前準備で同じコマンドが実行される可能性があります.この場合、コードをより明確にし、冗長性を少なくするために、共通の部分を抽出し、1つの方法に配置し、この方法に@BeforeClassを注釈することができます.テストクラスのすべての使用例が実行される前に、この方法を1回実行することを意味します.たとえば、データベース接続の作成、ファイルの読み込みなどです.
注意:メソッド名は任意ですが、public static void、すなわち公開、静的、戻り値なしでなければなりません.この方法は一度しか実行されません.
@AfterClass:@BeforeClassに対応し、テストクラス内のすべてのインスタンスが実行された後、1回実行します.データのクリーンアップ、現場のリカバリなど、テストの後続作業を処理するために使用されます.
注意:公開、静的、戻り値のないpublic static voidも必要です.この方法は一度しか実行されません.
@Before:この注記を使用したメソッドは、各テストメソッドが実行される前に1回実行されます.主に、使用例とは独立した準備作業に使用されます.たとえば、両方の使用例はデータベース内のユーザA情報を読み込む必要があるが、最初の使用例はこのユーザAを削除し、2番目の使用例はユーザAを変更する必要がある.では、@BeforeClassでデータベース接続を作成できます.@BeforeでユーザA情報を挿入します.
注意:public voidでなければstaticではありません.
@After:この注記を使用した方法は、各テスト方法の実行後に一度実行します.
@Runwith:つまり、テストクラス名の前にテストクラスがどのように実行されているかを決定するテストランナであり、この注釈を指定しない場合は、デフォルトのRunnerを使用してテストコード、すなわち@RunWith(JUnit 4.class)を実行します.
一般的なドライバは次のとおりです.
(1)@RunWith(Parameterized.class):パラメータ化ドライバ、@Parametersと組み合わせてJUnitのパラメータ化機能を使用します.
      (2)@RunWith(Suite.class)
         @SuiteClasses({ATest.class,BTest.class,CTest.class})
テストセットオペレータは、テストセット機能を組み合わせて使用します.    
(3)@RunWith(JUnit 4.class):JUnit 4のデフォルトドライバ
(4)@RunWith(JUnit 38 ClassRunner.class):junit 3に対応する.8のドライバ
(5)他のいくつかのドライバは、より多くの機能を備えている.例えば@RunWith(SpringJUnit 4 ClassRunner.class)はSpringのいくつかの機能を統合しています.
@Parameters:JUnitのパラメータ化機能に使用し、データの準備方法をマークします.
注意:この方法は一定の要求を満たす必要があります.
(1)この方法はpublic staticの
(2)メソッドの戻り値はjavaである必要がある.util.Collectionタイプ
(3)この方法の名前は要求しない
(4)この方法にはパラメータがない

パラメトリックテスト


ユニットテストの厳密性を保証するために,異なるテストデータをシミュレートして方法の処理能力をテストし,そのために大量のユニットテスト方法を記述した.これらのテスト方法は大きく異なります.コード構造は同じで、異なるのはテストデータと期待値だけです.コードの冗長性を下げるため、JUnit 4はパラメータ化テストを提供して、つまり1つのテスト方法だけを書いて、これらのいくつかの情況をパラメータとして伝達して、一度にテストを完成します. 
JUnit 4パラメータ化テストの5つのステップ:
(1)パラメトリックテストを使用するテストクラスに特殊なドライバorgを指定する.junit.runners.Parameterized.
(2)テストクラスにいくつかの変数を宣言し、それぞれ所望値とテストに使用するデータを格納する.
(3)テストクラスにパラメータ付きの共通構造関数を宣言し、第2の段階で宣言されたいくつかの変数に値を付与する.
(4)テストクラスに注釈を使用するorgを宣言する.junit.runners.Parameterized.Parametersはjavaを返します.util.Collectionの共通静的メソッドで、テストが必要なすべてのパラメータペアを初期化します.
(5)テスト方法を記述し,定義した変数をパラメータとしてテストする.
Demoは以下の通りです.
@RunWith(Parameterized.class)
public class SquareTest {

    private static Calculator calculator = new Calculator();

    private int param;// 

    private int result;// 

    //    
    @Parameters   
    public static Collection data() {
        return Arrays.asList(new Object[][]{{2, 4},{0, 0},{-3, 9}});
    }

    // , 
    public SquareTest(int param, int result) {
        this.param = param;
        this.result = result;
    }

    @Test   
    public void square() {
        calculator.square(param);
        assertEquals(result, calculator.getResult());
    }
 }

パッケージテスト


1つのプロジェクトでは、1つのテストクラスだけを書くことは不可能であり、多くのテストクラスを書くことができます.しかし、これらのテストクラスは一つ一つ実行しなければならないのも面倒なことです.これに鑑みて、JUnitは私たちにテストをパッケージ化する機能を提供して、すべての実行する必要があるテストクラスを集中して、一度に実行して、大いに私たちのテストの仕事を便利にしました.具体的なコードは以下の通りです.
@RunWith(Suite.class)
@Suite.SuiteClasses({ CalculatorTest.class,SquareTest.class})
public class AllCalculatorTests{
}

この機能も特殊なRunnerを使用する必要があるので、@RunWith注釈にパラメータSuiteを渡す必要があります.class.また、もう一つの注釈@Suiteが必要です.SuiteClassesは、このクラスがパッケージテストクラスであることを示します.パッケージするクラスをパラメータとしてこの注釈に渡せばよい.この2つの注釈があれば、すべての意味を完全に表現しているので、次のクラスはもう重要ではありません.勝手にクラス名をつけて、内容はすべて空です.

異常テスト


JUnit 4の前に、エラーのテストに対して、私たちはfailでエラーを生成して、tryブロックの中でassertTrue(true)でテストするしかありません.@Test注記のexpectedプロパティで例外をテストできるようになりました.expectedプロパティの値は例外のタイプです.
Demoは以下の通りです.
@Test(expected=ArithmeticException.class)
public void testDivide() {
    new Calculator().divide(6, 0);
}

タイムリミットテスト


論理が複雑で、ループが深くネストされているプログラムでは、デッドループが発生する可能性が高いので、予防措置を取らなければなりません.時間制限テストは良い解決策です.私たちはこれらのテスト方法に実行時間を設定して、この時間を超えると、彼らはシステムに強制的に終了され、システムはあなたにこの方法が終了した原因がタイムアウトしたためであることを報告して、このようにあなたはこれらのBugを発見することができます.この機能を実装するには、@Test注釈にtimeoutプロパティを追加するだけです.この注釈は、指定した時間内にテストメソッドに時間(ミリ秒)を入力し、指定した時間内にテストメソッドが実行されなかった場合、テストに失敗します.
Demoは以下の通りです.
@Test(timeout=1000)
public void testDeathLoop() {
    new Calculator().deathLoop();
}

ユニットテスト実行結果:java.lang.Exception: test timed out after 1000 milliseconds
         at test.Calculator.deathLoop(Calculator.java:25)
         at test.CaculatorTest.testDeathLoop(CaculatorTest.java:26)
         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
         …………………………