junitjunitを使い始める


備考

JUnitは、 Javaプログラミング言語の繰り返し可能なテストを書くためのシンプルなフレームワークです 。ユニットテストフレームワーク用のxUnitアーキテクチャのインスタンスです。

主な機能は次のとおりです。

  • テストで値をテストする方法をカスタマイズできるアサーション
  • クラスでテストを実行する方法を指定できるテストランナー
  • クラス内のテストの動作を柔軟に変更できるルール
  • スイートでは 、さまざまなクラスのテストスイートを一緒に構築できます

JUnitの便利な拡張機能:

  • AssertJ :Java用の流暢なアサーション
  • Mockito :JavaのためのMockingフレームワーク

バージョン

バージョン発売日
JUnit 5マイルストーン2 2016-07-23
JUnit 5マイルストーン1 2016-07-07
JUnit 4.12 2016-04-18
JUnit 4.11 2012-11-14
JUnit 4.10 2011-09-28
JUnit 4.9 2011-08-22
JUnit 4.8 2009-12-01
JUnit 4.7 2009年7月28日
JUnit 4.6 2009-04-14

インストールまたはセットアップ

JUnitはJavaライブラリなので、インストールするにはJavaプロジェクトのクラスパスに少数のJARファイルを追加するだけで済みます。

これらの2つのJARファイルを手動でダウンロードできます: junit.jarhamcrest-core.jar

Mavenを使用している場合は、単にpom.xml 依存関係を追加するだけです:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>
 

または、Gradleを使用している場合は、 build.gradle 依存関係を追加します。

apply plugin: 'java'

dependencies {
    testCompile 'junit:junit:4.12'
}
 

その後、最初のテストクラスを作成することができます:

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class MyTest {
    @Test
    public void onePlusOneShouldBeTwo() {
        int sum = 1 + 1;
        assertEquals(2, sum);
    }
}
 

コマンドラインから実行します:

  • Windows java -cp .;junit-X.YY.jar;hamcrest-core-XYjar org.junit.runner.JUnitCore MyTest
  • LinuxまたはOsX java -cp .:junit-X.YY.jar:hamcrest-core-XYjar org.junit.runner.JUnitCore MyTest

またはMaven: mvn test

@ビフォアーアフター

注釈付きメソッド@Before のすべての実行前に実行されます@Test 方法。 @After アノテートされたメソッドは@Test メソッドのたびに実行されます。これは、テスト設定を繰り返し設定し、すべてのテスト後にクリーンアップするために使用できます。したがって、テストは独立しており、準備コードは@Test メソッドの中にコピーされません。

例:

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.List;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class DemoTest {

    private List<Integer> list;

    @Before
    public void setUp() {
        list = new ArrayList<>();
        list.add(3);
        list.add(1);
        list.add(4);
        list.add(1);
        list.add(5);
        list.add(9);
    }

    @After
    public void tearDown() {
        list.clear();
    }

    @Test
    public void shouldBeOkToAlterTestData() {
        list.remove(0); // Remove first element of list.
        assertEquals(5, list.size()); // Size is down to five
    }

    @Test
    public void shouldBeIndependentOfOtherTests() {
        assertEquals(6, list.size());
    }
}
 

@Before または@After 注釈を付けられたメソッドは、 public void で、引数はゼロでなければなりません。

基本単位テストの例

この例は、junitを使用してStringBuilder.toString()をunittestingするための基本的な設定です。

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class StringBuilderTest {

    @Test
    public void stringBuilderAppendShouldConcatinate()  {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("String");
        stringBuilder.append("Builder");
        stringBuilder.append("Test");

        assertEquals("StringBuilderTest", stringBuilder.toString());
    }

}
 

予想される例外をキャッチする

try catch ブロックなしで簡単に例外をキャッチすることは可能です。

public class ListTest {
  private final List<Object> list = new ArrayList<>();

  @Test(expected = IndexOutOfBoundsException.class)
  public void testIndexOutOfBoundsException() {
    list.get(0);
  }
}
 

上記の例は、スローされた例外によって運ばれるメッセージをチェックする必要がない/必要がない場合に、より単純なケースで十分です。

例外に関する情報を確認する場合は、try / catchブロックを使用します。

@Test
public void testIndexOutOfBoundsException() {
    try {
        list.get(0);
        Assert.fail("Should throw IndexOutOfBoundException");
    } catch (IndexOutOfBoundsException ex) {
        Assert.assertEquals("Index: 0, Size: 0", ex.getMessage());
    }
}
 

この例では、例外がスローされないときにテストが失敗することを確実にするために、常にAssert.fail() を追加することに注意する必要があります。

より詳細なケースについては、JUnitにExpectedException @Rule があります。これはこの情報もテストでき、次のように使用されます。

public class SimpleExpectedExceptionTest {
     @Rule
     public ExpectedException expectedException = ExpectedException.none();

     @Test
     public void throwsNothing() {
         // no exception expected, none thrown: passes.
     }

     @Test
     public void throwsExceptionWithSpecificType() {
         expectedException.expect(NullPointerException.class);

         throw new NullPointerException();
     }

     @Test
     public void throwsExceptionWithSpecificTypeAndMessage() {
         expectedException.expect(IllegalArgumentException.class);
         expectedException.expectMessage("Wanted a donut.");

         throw new IllegalArgumentException("Wanted a donut.");
     }
}
 

JUnit5で例外をテストする

JUnit 5でこれを実現するには、 まったく新しいメカニズムを使用します。

試験された方法

public class Calculator {
    public double divide(double a, double b) {
        if (b == 0.0) {
            throw new IllegalArgumentException("Divider must not be 0");
        }
        return a/b;
    }
}
 

試験方法

public class CalculatorTest {
    @Test
    void triangularMinus5() { // The test method does not have to be public in JUnit5
        Calculator calc = new Calculator();

        IllegalArgumentException thrown = assertThrows(
            IllegalArgumentException.class, 
            () -> calculator.divide(42.0, 0.0));
        // If the exception has not been thrown, the above test has failed.

        // And now you may further inspect the returned exception...
        // ...e.g. like this:
        assertEquals("Divider must not be 0", thrown.getMessage());
}
 

テストを無視する

テストを無視するには、 @Ignore アノテーションをテストに追加し、必要に応じてその理由を持つアノテーションにパラメータを指定します。

@Ignore("Calculator add not implemented yet.")
@Test
public void testPlus() {
    assertEquals(5, calculator.add(2,3));
}
 

テストのコメントや@Test アノテーションの削除と比較して、テストランナーはこのテストを報告し、無視されることに注意してください。

JUnit 仮定を使用して条件付きでテストケースを無視することもできます。サンプルユースケースは、特定のバグが開発者によって修正された後にのみ、テストケースを実行することです。例:

import org.junit.Assume;
import org.junit.Assert;
...

@Test 
public void testForBug1234() {

    Assume.assumeTrue(isBugFixed(1234));//will not run this test until the bug 1234 is fixed

    Assert.assertEquals(5, calculator.add(2,3));
}
 

デフォルトのランナーは、失敗した前提を無視したテストを扱います。他のランナーが異なる動作をする可能性があります。たとえば、合格とみなして扱います。

JUnit - 基本的なアノテーションの例

理解しておくべき基本的なJUnit注釈がいくつかあります:

@BeforeClass – Run once before any of the test methods in the class, public static void 
@AfterClass – Run once after all the tests in the class has been run, public static void
@Before – Run before @Test, public void
@After – Run after @Test, public void
@Test – This is the test method to run, public void