JUnit
日本語 | Java単体テスト |
英語 | java unit test |
ふりがな | じぇーゆにっと、じぇぃゆにっと |
フリガナ | ジェーユニット、ジェィユニット |
単体テストを行うためのフレームワーク。
値をチェックするためのassertEquals()メソッド等を持ち、テストを行うメソッドを自動的に呼ぶ機能を持つTestCaseクラス等を含む、フリーのライブラリ。
テストファーストを行うためには必須のライブラリである。
単純にプログラムのテストを行うプログラムを作るだけであれば、どのようなプログラムを作ってもいい。
だが、JUnitはテスト用フレームワークとして一般に広まっているため、JUnitを使用してテストプログラムを作ることで多くのメリットが得られる。
たとえばEclipseではJUnitのテストの実行を標準で備えている。
また、単体テストの性質上、多くのプログラマーが実装するものであり、その個人差を大幅に減らすことで可読性やメンテナンス性を高めることができる。認知度の高さにより、推奨や徹底もしやすい。
値をチェックするためのassertEquals()メソッド等を持ち、テストを行うメソッドを自動的に呼ぶ機能を持つTestCaseクラス等を含む、フリーのライブラリ。
テストファーストを行うためには必須のライブラリである。
単純にプログラムのテストを行うプログラムを作るだけであれば、どのようなプログラムを作ってもいい。
だが、JUnitはテスト用フレームワークとして一般に広まっているため、JUnitを使用してテストプログラムを作ることで多くのメリットが得られる。
たとえばEclipseではJUnitのテストの実行を標準で備えている。
また、単体テストの性質上、多くのプログラマーが実装するものであり、その個人差を大幅に減らすことで可読性やメンテナンス性を高めることができる。認知度の高さにより、推奨や徹底もしやすい。
参考サイト
// Sample.java
public class Sample
{
/**
* テスト対象のメソッド。
*/
public int plus( int iL, int iR )
{
return iL + iR;
}
/**
* テスト対象のメソッド(バグってる版)。
*/
public int minus( int iL, int iR )
{
return iR - iL;
// 間違えて逆に引いています。
}
}
// Tester.java
import junit.framework.Test;
import junit.framework.TestSuite;
/**
* このクラスを使うために、junit.jarに
* クラスパスを通してください。junit.jarは
* Junitをダウンロードしてくれば入っているはずです。
*/
/**
* 各テストメソッドを呼び出すクラス。
*
* コンパイルを通すために、junit.jarにクラスパスを
* 通してください。junit.jarはEclipseに付いていますが、
* 最新版をダウンロードした方がいいでしょう。
*
* Eclipseで実行する場合、メニューの【実行】-【デバッグ】の
* 【起動構成】から【JUnit】を選び【新規】で新規作成し、
* 【テスト・クラス】でこのクラスを指定してください。
*
*/
public class Tester
{
/**
* JUnitから呼ばれるメソッド。
* main()メソッドみたいなものです。
*/
public static Test suite()
{
// テストを登録するためのTestSuiteを作ります。
TestSuite suite = new TestSuite();
// テストケースを追加します。
// このクラスのtestメソッドが呼ばれます。
suite.addTestSuite( SampleTest.class );
// TestSuite を返します。
// この中に登録したテストクラスが実行されます。
return suite;
}
}
// SampleTest.java
import junit.framework.TestCase;
/**
* Sampleクラスのテストクラスです。
*/
public class SampleTest extends TestCase
{
/**
* コンストラクタ。
*/
public SampleTest()
{
// クラス名をセットします。
super( SampleTest.class.toString() );
}
/**
* Sample#plus()メソッドをテストします。
*/
public void testPlus()
{
Sample sample = new Sample();
int result = sample.plus( 2, 1 );
// 結果をチェックします。
// 第1引数に「予想される結果」を、
// 第2引数にテスト対象の変数を渡します。
assertEquals( 3, result );
// 結果が一致しているので何も起きません。
}
public void testMinus()
{
Sample sample = new Sample();
assertEquals( 1, sample.minus( 2, 1 ) );
// junit.framework.AssertionFailedError: expected:<1> but was:<-1>
// at junit.framework.Assert.fail(Assert.java:47)
// at junit.framework.Assert.failNotEquals(Assert.java:282)
// at junit.framework.Assert.assertEquals(Assert.java:64)
// at junit.framework.Assert.assertEquals(Assert.java:201)
// at junit.framework.Assert.assertEquals(Assert.java:207)
// at SampleTest.testMinus(SampleTest.java:26)
// at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
// at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
// at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
// at java.lang.reflect.Method.invoke(Method.java:324)
// at junit.framework.TestCase.runTest(TestCase.java:154)
// at junit.framework.TestCase.runBare(TestCase.java:127)
// at junit.framework.TestResult$1.protect(TestResult.java:106)
// at junit.framework.TestResult.runProtected(TestResult.java:124)
// at junit.framework.TestResult.run(TestResult.java:109)
// at junit.framework.TestCase.run(TestCase.java:118)
// at junit.framework.TestSuite.runTest(TestSuite.java:208)
// at junit.framework.TestSuite.run(TestSuite.java:203)
// at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:392)
// at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:276)
// at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:167)
// 結果が異なっているとこのように例外が発生します。
// 最初の一文の「expected:<1> but was:<-1>」は、
// 「期待した値は1だったけど、実際には-1だった」という意味です。
}
/**
* 関係ないメソッド。"test"から始まらない
* メソッドは関係ありません。
*/
public void output()
{
System.out.println( "output()" );
}
}
public class Sample
{
/**
* テスト対象のメソッド。
*/
public int plus( int iL, int iR )
{
return iL + iR;
}
/**
* テスト対象のメソッド(バグってる版)。
*/
public int minus( int iL, int iR )
{
return iR - iL;
// 間違えて逆に引いています。
}
}
// Tester.java
import junit.framework.Test;
import junit.framework.TestSuite;
/**
* このクラスを使うために、junit.jarに
* クラスパスを通してください。junit.jarは
* Junitをダウンロードしてくれば入っているはずです。
*/
/**
* 各テストメソッドを呼び出すクラス。
*
* コンパイルを通すために、junit.jarにクラスパスを
* 通してください。junit.jarはEclipseに付いていますが、
* 最新版をダウンロードした方がいいでしょう。
*
* Eclipseで実行する場合、メニューの【実行】-【デバッグ】の
* 【起動構成】から【JUnit】を選び【新規】で新規作成し、
* 【テスト・クラス】でこのクラスを指定してください。
*
*/
public class Tester
{
/**
* JUnitから呼ばれるメソッド。
* main()メソッドみたいなものです。
*/
public static Test suite()
{
// テストを登録するためのTestSuiteを作ります。
TestSuite suite = new TestSuite();
// テストケースを追加します。
// このクラスのtestメソッドが呼ばれます。
suite.addTestSuite( SampleTest.class );
// TestSuite を返します。
// この中に登録したテストクラスが実行されます。
return suite;
}
}
// SampleTest.java
import junit.framework.TestCase;
/**
* Sampleクラスのテストクラスです。
*/
public class SampleTest extends TestCase
{
/**
* コンストラクタ。
*/
public SampleTest()
{
// クラス名をセットします。
super( SampleTest.class.toString() );
}
/**
* Sample#plus()メソッドをテストします。
*/
public void testPlus()
{
Sample sample = new Sample();
int result = sample.plus( 2, 1 );
// 結果をチェックします。
// 第1引数に「予想される結果」を、
// 第2引数にテスト対象の変数を渡します。
assertEquals( 3, result );
// 結果が一致しているので何も起きません。
}
public void testMinus()
{
Sample sample = new Sample();
assertEquals( 1, sample.minus( 2, 1 ) );
// junit.framework.AssertionFailedError: expected:<1> but was:<-1>
// at junit.framework.Assert.fail(Assert.java:47)
// at junit.framework.Assert.failNotEquals(Assert.java:282)
// at junit.framework.Assert.assertEquals(Assert.java:64)
// at junit.framework.Assert.assertEquals(Assert.java:201)
// at junit.framework.Assert.assertEquals(Assert.java:207)
// at SampleTest.testMinus(SampleTest.java:26)
// at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
// at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
// at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
// at java.lang.reflect.Method.invoke(Method.java:324)
// at junit.framework.TestCase.runTest(TestCase.java:154)
// at junit.framework.TestCase.runBare(TestCase.java:127)
// at junit.framework.TestResult$1.protect(TestResult.java:106)
// at junit.framework.TestResult.runProtected(TestResult.java:124)
// at junit.framework.TestResult.run(TestResult.java:109)
// at junit.framework.TestCase.run(TestCase.java:118)
// at junit.framework.TestSuite.runTest(TestSuite.java:208)
// at junit.framework.TestSuite.run(TestSuite.java:203)
// at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:392)
// at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:276)
// at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:167)
// 結果が異なっているとこのように例外が発生します。
// 最初の一文の「expected:<1> but was:<-1>」は、
// 「期待した値は1だったけど、実際には-1だった」という意味です。
}
/**
* 関係ないメソッド。"test"から始まらない
* メソッドは関係ありません。
*/
public void output()
{
System.out.println( "output()" );
}
}
// Sample.java public class Sample { /** * テスト対象のメソッド。 */ public int plus( int iL, int iR ) { return iL + iR; } /** * テスト対象のメソッド(バグってる版)。 */ public int minus( int iL, int iR ) { return iR - iL; // 間違えて逆に引いています。 } } // Tester.java import junit.framework.Test; import junit.framework.TestSuite; /** * このクラスを使うために、junit.jarに * クラスパスを通してください。junit.jarは * Junitをダウンロードしてくれば入っているはずです。 */ /** * 各テストメソッドを呼び出すクラス。 * * コンパイルを通すために、junit.jarにクラスパスを * 通してください。junit.jarはEclipseに付いていますが、 * 最新版をダウンロードした方がいいでしょう。 * * Eclipseで実行する場合、メニューの【実行】-【デバッグ】の * 【起動構成】から【JUnit】を選び【新規】で新規作成し、 * 【テスト・クラス】でこのクラスを指定してください。 * */ public class Tester { /** * JUnitから呼ばれるメソッド。 * main()メソッドみたいなものです。 */ public static Test suite() { // テストを登録するためのTestSuiteを作ります。 TestSuite suite = new TestSuite(); // テストケースを追加します。 // このクラスのtestメソッドが呼ばれます。 suite.addTestSuite( SampleTest.class ); // TestSuite を返します。 // この中に登録したテストクラスが実行されます。 return suite; } } // SampleTest.java import junit.framework.TestCase; /** * Sampleクラスのテストクラスです。 */ public class SampleTest extends TestCase { /** * コンストラクタ。 */ public SampleTest() { // クラス名をセットします。 super( SampleTest.class.toString() ); } /** * Sample#plus()メソッドをテストします。 */ public void testPlus() { Sample sample = new Sample(); int result = sample.plus( 2, 1 ); // 結果をチェックします。 // 第1引数に「予想される結果」を、 // 第2引数にテスト対象の変数を渡します。 assertEquals( 3, result ); // 結果が一致しているので何も起きません。 } public void testMinus() { Sample sample = new Sample(); assertEquals( 1, sample.minus( 2, 1 ) ); // junit.framework.AssertionFailedError: expected:<1> but was:<-1> // at junit.framework.Assert.fail(Assert.java:47) // at junit.framework.Assert.failNotEquals(Assert.java:282) // at junit.framework.Assert.assertEquals(Assert.java:64) // at junit.framework.Assert.assertEquals(Assert.java:201) // at junit.framework.Assert.assertEquals(Assert.java:207) // at SampleTest.testMinus(SampleTest.java:26) // at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) // at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) // at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) // at java.lang.reflect.Method.invoke(Method.java:324) // at junit.framework.TestCase.runTest(TestCase.java:154) // at junit.framework.TestCase.runBare(TestCase.java:127) // at junit.framework.TestResult$1.protect(TestResult.java:106) // at junit.framework.TestResult.runProtected(TestResult.java:124) // at junit.framework.TestResult.run(TestResult.java:109) // at junit.framework.TestCase.run(TestCase.java:118) // at junit.framework.TestSuite.runTest(TestSuite.java:208) // at junit.framework.TestSuite.run(TestSuite.java:203) // at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:392) // at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:276) // at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:167) // 結果が異なっているとこのように例外が発生します。 // 最初の一文の「expected:<1> but was:<-1>」は、 // 「期待した値は1だったけど、実際には-1だった」という意味です。 } /** * 関係ないメソッド。"test"から始まらない * メソッドは関係ありません。 */ public void output() { System.out.println( "output()" ); } }