🐷

JUnit4をコマンドラインから実行する

2021/04/06に公開

JUnit4をコマンドラインから実行する方法について記述します。

Apache Maven, Gradleのようなbuild system経由ではなく、コマンドラインから実行します。

以下、そのための手順のようなものです。

  • junit4, hamcrestのjarファイルのダウンロード
  • junit4, hamcrestのjarファイルを任意のディレクトリにおく
  • コマンド実行

junit4, hamcrestのjarファイルのダウンロード

jarファイルをダウンロードします。今回は以下のversionをダウンロードすることにします。

  • junit 4.12
  • hamcrest 1.3

ダウンロードはここからできます。

junit4, hamcrestのjarファイルを任意のディレクトリにおく

ダウンロードしたjarファイルを、例えばテストをしたいjavaファイルのディレクトリにおきます。

今回、Stackを簡易に実装したクラス Stack2.javaを用意しました。

import java.util.NoSuchElementException;

public class Stack2 {
    private int arr[];
    private int current;

    public Stack2(int size) {
        arr = new int[size];
        current = 0;
    }

    public void push(int e) {
        current++;
        arr[current] = e;
    }

    public int pop() {
        if (empty()) {
            throw new NoSuchElementException();
        }
        int top = arr[current];
        current--;
        return top;
    }

    public boolean empty() {
        return current == 0;
    }

    public int size() {
        return current;
    }

}

このファイルがあるところに、2つのjarファイルを設置しましょう。

ついでにテスト用のファイルも作ります。

import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import java.util.NoSuchElementException;

public class Stack2Test
{
    @Test
    public void testPopLastElement()
    {
        Stack2 s = new Stack2(3);
        s.push(1);
        s.push(2);
        assertEquals(s.pop(), 2);
    }

    @Test
    public void testEmptyWhenFleshlyConstructed()
    {
        Stack2 s = new Stack2(3);
        assertTrue(s.empty());
    }

    @Test
    public void testNotEmptyWhenContainsOneElement()
    {
        Stack2 s = new Stack2(3);
        s.push(1);
        assertFalse(s.empty());
    }

    @Test(expected = NoSuchElementException.class) // junit4の書き方です。
    public void testPopFromEmptyStack()
    {
        Stack2 s = new Stack2(3);
        s.pop();
    }

    @Test
    public void testSize()
    {
        Stack2 s = new Stack2(3);
        assertEquals(s.size(), 0);
        s.push(1);
        assertEquals(s.size(), 1);
    }

    @Test
    public void testEmptyWhenLastElementPoped()
    {
        Stack2 s = new Stack2(3);
        s.push(1);
        s.push(2);
        s.pop();
        s.pop();
        assertTrue(s.empty());
    }
}

コマンドラインから実行する

Javaではプログラムの.javaファイルをコンパイルして、JavaVMで実行可能なバイトコードに変換する必要があります。-cpというクラスパスでjunitのパスを指定します。

javac -cp junit-4.12.jar Stack2.java Stack2Test.java

バイトコードは.classと言う名前で同ディレクトリに生成されます。
テストクラスにはmain関数がありません。そのためorg.junit.runner.JUnitCoreクラスのmainにテスト対象となるクラスを指定します。org.junit.runner.JUnitCoreはJUnitテストクラスを実行するトリガーとなっているわけです。

hamcrest-core-1.3.jarについてですが、これはJUnitに元々組み込まれていたUtilityなのですが、システム上色々あって分離されて、JUnitとは異なる開発サイクルに従ってます。

JUnitはHamcrestを利用しているのでJUnitを実行する際には依存を明示する必要があります。
org.junit.AssertがHamcrest coreに依存してます)

java -cp junit-4.12.jar:hamcrest-core-1.3.jar:.  org.junit.runner.JUnitCore  Stack2Test

参考

Discussion