JUnit4をコマンドラインから実行する
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