
NetBeans IDE での Junit テストの記述
このチュートリアルでは、NetBeans IDE で JUnit ユニットのテストを記述および実行するための基本情報を紹介します。アプリケーションのテストは開発サイクルに不可欠な部分であり、単体テストの記述および管理はソースコード内の個々のメソッドが正しく動作することを確実にするために役立ちます。JUnit 単体テストフレームワークに対する IDE の統合サポートにより、JUnit テストとテストスイートを迅速かつ容易に作成することができます。
このチュートリアルでは、Java クラスライブラリプロジェクト用の、JUnit 3 および JUnit 4 という 単純な単体テストとテストスイートを作成します。チュートリアルの第一部では、JUnit 3 でテストを作成する方法を説明します。第二部では、JUnit の注釈を使用して同じテストを JUnit 4 で作成する方法を説明します。テストは同じであるためチュートリアルの両方の部分を完了する必要はありませんが、両方のバージョンでのテストの記述方法を見ることにより、JUnit 4 で導入された変更のいくつかを確認できます。
JUnit の使用方法の詳細については、www.junit.org を参照してください。
目次
このチュートリアルに従うには、次のソフトウェアとリソースが必要です。
プロジェクトの作成
このチュートリアルを完了するには、最初に JUnit-Sample という Java クラスライブラリプロジェクトを作成します。プロジェクトを作成したあと、サンプルプロジェクト JUnitSampleSol の 2 つのクラスを、プロジェクト JUnit-Sample にコピーします。
Java クラスライブラリプロジェクトの作成
- メインメニューから「ファイル」>「新規プロジェクト」を選択します。
- 「Java」カテゴリから「Java クラスライブラリ」を選択し、「次へ」をクリックします。
- プロジェクトとして「JUnit-Sample」と入力し、プロジェクトの場所を設定します。
- 専用フォルダを使用するオプションが選択されている場合は選択を解除します。
このチュートリアルでは、ライブラリをほかのユーザーまたはプロジェクトと共有する必要がないので、プロジェクトライブラリを専用のフォルダにコピーする理由はほとんどありません。
「完了」をクリックします。
JUnit テストをはじめて作成すると、IDE からバージョンを選択するよう求められ、そのあとに「テストライブラリ」ノードと JUnit ライブラリが追加されます。
ソリューションプロジェクトのダウンロード
このチュートリアルで使用するプロジェクト JUnitSampleSol は、次の方法でダウンロードできます。
注 (NetBeans IDE 7.0 および 7.1)。 IDE のインストール時に JUnit プラグインをインストールしなかった場合は、NetBeans プロジェクトを開いたときに、JUnit ライブラリへの参照を解決するために JUnit プラグインをインストールするよう求められます。
Java クラスの作成
この課題では、JUnitSampleSol サンプルプロジェクトから Utils.java ファイルおよび Vectors.java ファイルを、作成したクラスライブラリプロジェクトにコピーします。
- 「プロジェクト」ウィンドウで、JUnit-Sample プロジェクトの「ソースパッケージ」ノードを右クリックし、ポップアップメニューから「新規」>「Java パッケージ」を選択します。
- パッケージ名として「sample」と入力します。「完了」をクリックします。
- JUnitSampleSol プロジェクトを開き (まだ開いていない場合)、「プロジェクト」ウィンドウで「ソースパッケージ」ノードを展開します。
- JUnitSampleSol プロジェクト内のクラス Utils.java と Vectors.java をコピーし、それらを JUnit-Sample 内の sample ソースパッケージにペーストします。
クラスのソースコードを見ると、Utils.java に 3 つのメソッド (computeFactorial、concatWords、および normalizeWord) があり、Vectors.java に 2 つのメソッド (equal および scalarMultiplication) があることがわかります。次の手順では、各クラス用のテストクラスを作成し、メソッド用にいくつかのテストクラスを記述します。
注: JUnitSampleSol プロジェクトは、もう必要がなくなったため閉じてかまいません。JUnitSampleSol プロジェクトには、このドキュメントで説明されているすべてのテストが含まれています。
JUnit 3 単体テストの記述
チュートリアルのこの部分では、Vectors.java クラスおよび Utils.java クラス用の基本的な JUnit 3 単体テストを作成します。IDE を使用して、プロジェクト内のクラスに基づいたスケルトンテストクラスを作成します。次に、生成されたテストメソッドを変更し、新しいテストメソッドを追加します。
IDE を使用してはじめてプロジェクト用のテストを作成する場合、JUnit バージョンの選択を求めるメッセージが表示されます。選択したバージョンがデフォルトの JUnit バージョンになり、以降のすべてのテストおよびテストスイートがそのバージョンで生成されます。
Vectors.java 用のテストクラスの作成
この課題では、Vectors.java 用の JUnit テストスケルトンを作成します。
- Vectors.java を右クリックし、「ツール」>「JUnit テストを作成」を選択します。
- 「JUnit のバージョンを選択」ダイアログで「JUnit 3.x」を選択します。
JUnit 3.x を選択すると、プロジェクトから JUnit 4 ライブラリが削除されます。
- 「テストを作成」ダイアログで、テストクラスの名前を VectorsJUnit3Test に変更します。
テストクラスの名前を変更するときは、名前が変更されることを警告するメッセージが表示されます。デフォルト名は、テスト対象のクラス名をベースに、末尾に「Test」を追加したものです。たとえば、MyClass.java クラスの場合、テストクラスのデフォルト名は「MyClassTest.java」です。通常はデフォルト名のままにするのが最適ですが、このチュートリアルでは JUnit 4 テストも同じパッケージ内に作成するため、また、テストクラスの名前は一意にする必要があるため、名前を変更します。
- 「テスト初期化」および「テスト終了」を選択解除します。「了解」をクリックします。
「了解」をクリックすると、IDE によって、「プロジェクト」ウィンドウ内の「テストパッケージ」ノードの下にある sample パッケージ内に VectorsJUnit3Test.java テストクラスが作成されます。
プロジェクトには、テストを作成するためのテストパッケージ用ディレクトリが必要です。テストパッケージディレクトリのデフォルトの場所はプロジェクトのルートレベルですが、プロジェクトの種類によって、プロジェクトの「プロパティー」ダイアログでディレクトリに別の場所を指定できます。
生成したテストクラス VectorsJUnit3Test.java をエディタで表示すると、次のテストクラスが equal メソッドと scalarMultiplication メソッドに対するテストメソッドとともに生成されたことがわかります。
public class VectorsJUnit3Test extends TestCase {
/**
* Test of equal method, of class Vectors.
*/
public void testEqual() {
System.out.println("equal");
int[] a = null;
int[] b = null;
boolean expResult = false;
boolean result = Vectors.equal(a, b);
assertEquals(expResult, result);
// TODO review the generated test code and remove the default call to fail.
fail("The test case is a prototype.");
}
/**
* Test of scalarMultiplication method, of class Vectors.
*/
public void testScalarMultiplication() {
System.out.println("scalarMultiplication");
int[] a = null;
int[] b = null;
int expResult = 0;
int result = Vectors.scalarMultiplication(a, b);
assertEquals(expResult, result);
// TODO review the generated test code and remove the default call to fail.
fail("The test case is a prototype.");
}
}
生成された各テストのメソッド本体は、ガイドとしてのみ用意されており、実際のテストケースにするには変更する必要があります。コードを生成しない場合は、「テストを作成」ダイアログの「デフォルトのメソッド本体」を選択解除します。
IDE がテストメソッドの名前を生成する場合、各メソッド名の先頭に「test」が付加されます。これは、JUnit 3 ではテストを識別するために命名規則とリフレクションが使用されるためです。テストメソッドを識別するために、各テストメソッドは「test<名前>」という構文に従う必要があります。
JUnit 4 では注釈を使用してテストメソッドを識別できるため、このテストメソッドの命名構文を使用する必要がなくなり、テストクラスは TestCase を拡張する必要がなくなりました。
Vectors.java 用のテストメソッドの記述
この課題では、生成したテストメソッドを変更してテストが機能するようにし、デフォルトの出力メッセージを変更します。テストを実行するために出力メッセージを変更する必要はありませんが、「JUnit テスト結果」出力ウィンドウに表示される結果を識別するのに役立つよう、出力を変更します。
- エディタで VectorsJUnit3Test.java を開きます。
- println の値を変更し、生成された変数を削除することによって、testScalarMultiplication のテストスケルトンを変更します。テストメソッドは次のようになるはずです (ボールド部分が変更箇所)。
public void testScalarMultiplication() {
System.out.println("* VectorsJUnit3Test: testScalarMultiplication()");
assertEquals(expResult, result);
}
- ここで、メソッドをテストするためのアサーションを追加します。
public void testScalarMultiplication() {
System.out.println("* VectorsJUnit3Test: testScalarMultiplication()");
assertEquals( 0, Vectors.scalarMultiplication(new int[] { 0, 0}, new int[] { 0, 0}));
assertEquals( 39, Vectors.scalarMultiplication(new int[] { 3, 4}, new int[] { 5, 6}));
assertEquals(-39, Vectors.scalarMultiplication(new int[] {-3, 4}, new int[] { 5,-6}));
assertEquals( 0, Vectors.scalarMultiplication(new int[] { 5, 9}, new int[] {-9, 5}));
assertEquals(100, Vectors.scalarMultiplication(new int[] { 6, 8}, new int[] { 6, 8}));
}
このテストメソッドでは、JUnit の assertEquals メソッドが使用されます。アサーションを使用するには、入力変数と、期待する結果を指定します。テストに合格するには、テスト済みメソッドを実行したときに、テストメソッドが供給した変数に基づいて、期待されるすべての結果を正常に返す必要があります。さまざまな考えられる並べ替えを実行するため、十分な数のアサーションを追加するようにしてください。
- 生成されたメソッド本体を削除し、次の println を追加することによって、testEqual のテストスケルトンを変更します。
System.out.println("* VectorsJUnit3Test: testEqual()");
テストメソッドは次のようになるはずです。
public void testEqual() {
System.out.println("* VectorsJUnit3Test: testEqual()");
}
- 次のアサーションを追加することによって testEqual メソッドを変更します (ボールド部分が変更箇所)。
public void testEqual() {
System.out.println("* VectorsJUnit3Test: testEqual()");
assertTrue(Vectors.equal(new int[] {}, new int[] {}));
assertTrue(Vectors.equal(new int[] {0}, new int[] {0}));
assertTrue(Vectors.equal(new int[] {0, 0}, new int[] {0, 0}));
assertTrue(Vectors.equal(new int[] {0, 0, 0}, new int[] {0, 0, 0}));
assertTrue(Vectors.equal(new int[] {5, 6, 7}, new int[] {5, 6, 7}));
assertFalse(Vectors.equal(new int[] {}, new int[] {0}));
assertFalse(Vectors.equal(new int[] {0}, new int[] {0, 0}));
assertFalse(Vectors.equal(new int[] {0, 0}, new int[] {0, 0, 0}));
assertFalse(Vectors.equal(new int[] {0, 0, 0}, new int[] {0, 0}));
assertFalse(Vectors.equal(new int[] {0, 0}, new int[] {0}));
assertFalse(Vectors.equal(new int[] {0}, new int[] {}));
assertFalse(Vectors.equal(new int[] {0, 0, 0}, new int[] {0, 0, 1}));
assertFalse(Vectors.equal(new int[] {0, 0, 0}, new int[] {0, 1, 0}));
assertFalse(Vectors.equal(new int[] {0, 0, 0}, new int[] {1, 0, 0}));
assertFalse(Vectors.equal(new int[] {0, 0, 1}, new int[] {0, 0, 3}));
}
このテストは JUnit の assertTrue メソッドと assertFalse メソッドを使用して、考えられるさまざまな結果をテストします。このメソッドのテストに合格するには、assertTrue がすべて true 、assertFalse がすべて false である必要があります。
- 変更を保存します。
比較: Vectors.java 用のテストメソッドの記述 (JUnit 4)
Utils.java 用のテストクラスの作成
ここで、Utils.java のテストスケルトンを作成します。前の課題でテストを作成したとき、JUnit のバージョンを確認するメッセージが表示されました。今回はバージョンの選択を求めるメッセージは表示されません。
- Utils.java を右クリックし、「ツール」>「JUnit テストを作成」を選択します。
- ダイアログで「テスト初期化」および「テスト終了」が選択されていない場合は選択します。
- 「テストを作成」ダイアログで、テストクラスの名前を UtilsJUnit3Test に変更します。「了解」をクリックします。
「了解」をクリックすると、「テストパッケージ」の samples ディレクトリに、テストファイル UtilsJUnit3Test.java が作成されます。Utils.java 内にあるメソッド用に testComputeFactorial、testConcatWords、および testNormalizeWord のテストスケルトンを作成するほか、テスト初期化メソッド setUp およびテスト終了メソッド tearDown も作成されます。
Utils.java 用のテストメソッドの記述
この課題では、共通の JUnit テスト要素の一部を示す、いくつかのテストケースを追加します。一部のメソッドはデフォルトで出力をプリントしないため、println もメソッドに追加します。println をメソッドに追加することで、メソッドが実行されたかどうか、どの順番でメソッドが実行されたかを、あとで JUnit テスト結果ウィンドウで確認できます。
テスト初期化およびテスト終了
setUp メソッドおよび tearDown メソッドは、テスト条件を初期化および終了するために使用されます。Utils.java のテストに setUp メソッドと tearDown メソッドは必要ありませんが、ここではこれらのメソッドの機能を示すために使用します。
setUp メソッドはテスト初期化メソッドであり、テストクラスの各テストケースの前に実行されます。テストの実行にテスト初期化メソッドは必須ではありませんが、テストの実行前に一部の変数を初期化する必要がある場合は、テスト初期化メソッドを使用します。
tearDown メソッドはテスト終了メソッドであり、テストクラスの各テストケースのあとに実行されます。テストの実行にテスト終了メソッドは必須ではありませんが、テストケースの実行時に求められたデータをクリーンアップするために終了メソッドが必要になる場合があります。
- 次の変更 (ボールドで表示) を行なって、各メソッドに println を追加します。
@Override
protected void setUp() throws Exception {
super.setUp();
System.out.println("* UtilsJUnit3Test: setUp() method");
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
System.out.println("* UtilsJUnit3Test: tearDown() method");
}
テストを実行すると、各メソッドの println テキストが「JUnit テスト結果」出力ウィンドウに表示されます。println を追加しないと、メソッドが実行されたことを示す出力は表示されません。
単純なアサーションを使用したテスト
この単純なテストケースでは、concatWords メソッドをテストします。生成されたテストメソッドの testConcatWords を使用する代わりに、単一の単純なアサーションを使用してメソッドが文字列を正しく連結するかどうかをテストする、testHelloWorld という新しいテストメソッドを追加します。テストケースの assertEquals では、予想した結果と実際の結果が同じであるかどうかをテストするために、構文 assertEquals(EXPECTED_RESULT, ACTUAL_RESULT) が使用されます。この例では、concatWords メソッドへの入力が「Hello」、「,」、「world」および「!」の場合、予想結果は「Hello, world!」と同じになるはずです。
- UtilsJUnit3Test.java 内の生成されたテストメソッド testConcatWords を削除します。
- concatWords メソッドをテストするため、次のメソッドを追加します。
public void testHelloWorld() {
assertEquals("Hello, world!", Utils.concatWords("Hello", ", ", "world", "!"));
}
- テストに関するテキストを「JUnit テスト結果」ウィンドウに表示するため、println 文を追加します。
public void testHelloWorld() {
System.out.println("* UtilsJUnit3Test: test method 1 - testHelloWorld()");
assertEquals("Hello, world!", Utils.concatWords("Hello", ", ", "world", "!"));
比較: 単純なアサーションを使用したテスト (JUnit 4)
タイムアウトを使用したテスト
このテストでは、メソッドの完了までに時間がかかりすぎているかどうかを確認する方法を示します。メソッドの時間がかかりすぎている場合は、テストスレッドが中断され、テストは失敗します。テストでは時間制限を指定できます。
テストメソッドにより、Utils.java の computeFactorial メソッドが呼び出されます。computeFactorial メソッドは正しいと想定できますが、ここでテストするのは、計算が 1000 ミリ秒以内に完了するかどうかです。computeFactorial スレッドおよびテストスレッドは同時に開始されます。テストスレッドは 1000 ミリ秒後に停止し、computeFactorial スレッドが先に終了しないかぎり、TimeoutException をスローします。メッセージを追加すると、TimeoutException がスローされたときにメッセージが表示されます。
- 生成されたテストメソッド testComputeFactorial を削除します。
- ランダムに生成された数字の階乗を計算する testWithTimeout メソッドを追加します。
public void testWithTimeout() throws InterruptedException, TimeoutException {
final int factorialOf = 1 + (int) (30000 * Math.random());
System.out.println("computing " + factorialOf + '!');
Thread testThread = new Thread() {
public void run() {
System.out.println(factorialOf + "! = " + Utils.computeFactorial(factorialOf));
}
};
}
- java.util.concurrent.TimeoutException をインポートするために、インポートを修正します。
- テストの実行に時間がかかりすぎる場合にスレッドを中断し、メッセージを表示するため、次のコード (ボールドで表示) をメソッドに追加します。
Thread testThread = new Thread() {
public void run() {
System.out.println(factorialOf + "! = " + Utils.computeFactorial(factorialOf));
}
};
testThread.start();
Thread.sleep(1000);
testThread.interrupt();
if (testThread.isInterrupted()) {
throw new TimeoutException("the test took too long to complete");
}
}
タイムアウトがスローされる前にミリ秒の数字を変更するには、Thread.sleep 行を変更します。
- テストに関するテキストを「JUnit テスト結果」ウィンドウに出力するには、次の println (ボールドで表示) を追加します。
public void testWithTimeout() throws InterruptedException, TimeoutException {
System.out.println("* UtilsJUnit3Test: test method 2 - testWithTimeout()");
final int factorialOf = 1 + (int) (30000 * Math.random());
System.out.println("computing " + factorialOf + '!');
比較: タイムアウトを使用したテスト (JUnit 4)
予想される例外のテスト
このテストでは、予想される例外のテスト方法を示します。このメソッドは、予想される指定の例外がスローされない場合、失敗します。この例では、入力変数が負の数 (-5) の場合に、computeFactorial メソッドが IllegalArgumentException をスローするかどうかをテストします。
- computeFactorial メソッドを呼び出す次の testExpectedException メソッドを、-5 の入力とともに追加します。
public void testExpectedException() {
try {
final int factorialOf = -5;
System.out.println(factorialOf + "! = " + Utils.computeFactorial(factorialOf));
fail("IllegalArgumentException was expected");
} catch (IllegalArgumentException ex) {
}
}
- テストに関するテキストを「JUnit テスト結果」ウィンドウに出力するには、次の println (ボールドで表示) を追加します。
public void testExpectedException() {
System.out.println("* UtilsJUnit3Test: test method 3 - testExpectedException()");
try {
比較: 予想される例外のテスト (JUnit 4)
テストの無効化
このテストでは、テストメソッドを一時的に無効にする方法を示します。JUnit 3 では、名前の先頭が test でないメソッドはテストメソッドとして認識されません。この例では、テストメソッドの名前の前に DISABLED_ を付加して無効にします。
- 生成されたテストメソッド testNormalizeWord を削除します。
- 次のテストメソッドをテストクラスに追加します。
public void testTemporarilyDisabled() throws Exception {
System.out.println("* UtilsJUnit3Test: test method 4 - checkExpectedException()");
assertEquals("Malm\u00f6", Utils.normalizeWord("Malmo\u0308"));
}
テストクラスを実行すると、テストメソッド testTemporarilyDisabled が実行されます。
- テストメソッドの名前の先頭に DISABLED_ (ボールドで表示) を付加します。
public void DISABLED_testTemporarilyDisabled() throws Exception {
System.out.println("* UtilsJUnit3Test: test method 4 - checkExpectedException()");
assertEquals("Malm\u00f6", Utils.normalizeWord("Malmo\u0308"));
}
比較: テストの無効化 (JUnit 4)
これでテストが記述されたので、テストを実行し、テスト出力を「JUnit テスト結果」ウィンドウで確認できます。
テストの実行
JUnit テストを実行すると、結果が IDE の「JUnit テスト結果」ウィンドウに表示されます。個々の JUnit テストクラスを実行するか、またはメインメニューから「実行」>「<プロジェクト名> のテスト」を選択して、プロジェクトのすべてのテストを実行できます。「実行」>「テスト」を選択すると、「テストパッケージ」フォルダにあるすべてのテストクラスが実行されます。個々のテストクラスを実行するには、「テストパッケージ」ノードのテストクラスを右クリックし、「ファイルを実行」を選択します。
- 「プロジェクト」ウィンドウで「JUnit-Sample」プロジェクトノードを右クリックし、「主プロジェクトとして設定」を選択します。
- メインメニューから「実行」>「プロジェクト (JUnit-Sample) をテスト」を選択します。
テストの実行時、「JUnit テスト結果」ウィンドウに次の結果のいずれかが表示されます。
この画像 (クリックして大きい画像を表示) では、プロジェクトがすべてのテストに合格したことがわかります。左区画には個々のテストメソッドの結果が表示され、右区画にはテスト出力が表示されます。出力を確認すると、テストが実行された順序がわかります。各テストメソッドに追加した println により、テストの名前が出力ウィンドウに出力されます。UtilJUnit3Test では、各テストメソッドの前に setUp メソッドが実行されたこと、および各メソッドのあとに tearDown メソッドに実行されたことも確認できます。
この画像 (クリックして大きい画像を表示) では、プロジェクトがテストの 1 つに失敗したことがわかります。testTimeout メソッドの完了に時間がかかりすぎ、テストスレッドが中断されたため、テストが失敗しました。ランダムに生成された数字 (22991) の階乗の計算に 1000 ミリ秒以上かかりました。
単体テストクラス作成後の次の手順は、テストスイートの作成です。指定されたテストをグループとして実行し、各テストを個々に実行しなくて済むようにする方法については、「JUnit 3 テストスイートの作成」を参照してください。
JUnit 4 テストの記述
この課題では、Vectors.java クラスと Utils.java クラス用の JUnit 4 単体テストを作成します。JUnit 4 のテストケースは JUnit 3 のテストケースと同じですが、テストを記述する構文がより簡単になっています。
プロジェクト内のクラスに基づいて、IDE のテスト作成スケルトンを使用します。テストスケルトンを作成するために IDE をはじめて使用する際は、JUnit のバージョンを選択するよう求められます。
テストのデフォルトバージョンとしてすでに JUnit 3.x を選択している場合は、デフォルトバージョンを JUnit 4.x に変更する必要があります。JUnit のデフォルトバージョンを変更するには、「テストライブラリ」ノードを展開し、JUnit ライブラリを右クリックして「削除」を選択します。これで、「ライブラリを追加」ダイアログボックスを使用して JUnit 4 ライブラリを明示的に追加するか、または新しいテストの作成時に JUnit バージョンの選択を求められたときにバージョン 4.x を選択することができます。JUnit 3 テストを実行することは可能ですが、新しく作成されるテストでは JUnit 4 が使用されます。
Vectors.java 用のテストクラスの作成
この課題では、Vectors.java 用の JUnit テストスケルトンを作成します。
- Vectors.java を右クリックし、「ツール」>「JUnit テストを作成」を選択します。
- 「JUnit のバージョンを選択」ダイアログで JUnit 4.x を選択します。
- 「テストを作成」ダイアログで、テストクラスの名前を VectorsJUnit4Test に変更します。
テストクラスの名前を変更するときは、名前が変更されることを警告するメッセージが表示されます。デフォルト名は、テスト対象のクラス名をベースに、末尾に「Test」を追加したものです。たとえば、MyClass.java クラスの場合、テストクラスのデフォルト名は「MyClassTest.java」です。JUnit 3 とは異なり、JUnit 4 ではテスト名の末尾に「Test」を付ける必要はありません。通常はデフォルト名をそのまま使用するのが最適ですが、このチュートリアルではすべての JUnit テストを同じパッケージ内に作成するため、テストクラスの名前は一意にします。
- 「テスト初期化」および「テスト終了」を選択解除します。「了解」をクリックします。
「了解」をクリックすると、IDE によって、「プロジェクト」ウィンドウ内の「テストパッケージ」ノードの下にある sample パッケージ内に VectorsJUnit4Test.java テストクラスが作成されます。
注: プロジェクトには、テストを作成するためのテストパッケージ用ディレクトリが必要です。テストパッケージディレクトリのデフォルトの場所は、プロジェクトのルートレベルですが、プロジェクトの「プロパティー」ダイアログでディレクトリ用の別の場所を指定することもできます。
エディタで VectorsJUnit3Test.java を表示すると、テストメソッドの testEqual と testScalarMultiplication が生成されていることがわかります。VectorsJUnit4Test.java では、各テストメソッドに @Test という注釈が付きます。Vectors.java 内のメソッド名に基づいてテストメソッドの名前が生成されますが、テストメソッドの名前の先頭に test を付加する必要はありません。生成された各テストメソッドのデフォルトの本体はガイドとしてのみ用意され、実際のテストケースになるように変更する必要があります。
メソッドの本体を生成しないようにするには、「テストを作成」ダイアログの「デフォルトのメソッド本体」を選択解除します。
また、次のテストクラスの初期化メソッドと終了メソッドが生成されました。
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
JUnit 4 のテストクラスを作成するときに、クラスの初期化メソッドと終了メソッドがデフォルトで生成されます。注釈 @BeforeClass および @AfterClass は、テストクラスの実行前後に実行するべきメソッドをマークするために使用されます。メソッドを使用して Vectors.java をテストする必要はないため、これらのメソッドは削除してかまいません。
「オプション」ウィンドウで JUnit オプションを構成することにより、デフォルトで生成されるメソッドを構成できます。
注: JUnit 4 テストでは、org.junit.Assert.* のための静的なインポート宣言が IDE によってデフォルトで追加されることに注意してください。
Vectors.java 用のテストメソッドの記述
この課題では、JUnit assert メソッドを使用してメソッドをテストし、テストメソッドの名前を変更するため、生成された各テストメソッドを変更します。JUnit 4 では、テストメソッドが @Test という注釈で示され、テストメソッド名の先頭に test を付けなくてもよいため、テストメソッドの名前の付け方により柔軟性があります。
- エディタで VectorsJUnit4Test.java を開きます。
- メソッド名を変更し、println の値を変更して生成された変数を削除することによって、testScalarMultiplication のテストメソッドを変更します。テストメソッドは次のようになるはずです (ボールド部分が変更箇所)。
@Test
public void ScalarMultiplicationCheck() {
System.out.println("* VectorsJUnit4Test: ScalarMultiplicationCheck()");
assertEquals(expResult, result);
}
注: テストを記述する場合、表示される出力を変更することは必須ではありません。これはこの課題で行うため、テスト結果を出力ウィンドウで確認しやすくなります。
- ここで、メソッドをテストするためのアサーションを追加します。
@Test
public void ScalarMultiplicationCheck() {
System.out.println("* VectorsJUnit4Test: ScalarMultiplicationCheck()");
assertEquals( 0, Vectors.scalarMultiplication(new int[] { 0, 0}, new int[] { 0, 0}));
assertEquals( 39, Vectors.scalarMultiplication(new int[] { 3, 4}, new int[] { 5, 6}));
assertEquals(-39, Vectors.scalarMultiplication(new int[] {-3, 4}, new int[] { 5,-6}));
assertEquals( 0, Vectors.scalarMultiplication(new int[] { 5, 9}, new int[] {-9, 5}));
assertEquals(100, Vectors.scalarMultiplication(new int[] { 6, 8}, new int[] { 6, 8}));
}
このテストメソッドでは、JUnit assertEquals メソッドを使用します。アサーションを使用するには、入力変数と、期待する結果を指定します。テストに合格するには、テスト済みメソッドを実行したときに、テストメソッドが供給した変数に基づいて、期待されるすべての結果を正常に返す必要があります。さまざまな考えられる並べ替えを実行するため、十分な数のアサーションを追加するようにしてください。
- testEqual テストメソッドの名前を equalsCheck に変更します。
- equalsCheck テストメソッドの生成されたメソッドの本文を削除します。
- 次の println を equalsCheck テストメソッドに追加します。
System.out.println("* VectorsJUnit4Test: equalsCheck()");
テストメソッドは次のようになるはずです。
@Test
public void equalsCheck() {
System.out.println("* VectorsJUnit4Test: equalsCheck()");
}
- 次のアサーション (ボールドで表示) を追加することによって、equalsCheck メソッドを変更します。
@Test
public void equalsCheck() {
System.out.println("* VectorsJUnit4Test: equalsCheck()");
assertTrue(Vectors.equal(new int[] {}, new int[] {}));
assertTrue(Vectors.equal(new int[] {0}, new int[] {0}));
assertTrue(Vectors.equal(new int[] {0, 0}, new int[] {0, 0}));
assertTrue(Vectors.equal(new int[] {0, 0, 0}, new int[] {0, 0, 0}));
assertTrue(Vectors.equal(new int[] {5, 6, 7}, new int[] {5, 6, 7}));
assertFalse(Vectors.equal(new int[] {}, new int[] {0}));
assertFalse(Vectors.equal(new int[] {0}, new int[] {0, 0}));
assertFalse(Vectors.equal(new int[] {0, 0}, new int[] {0, 0, 0}));
assertFalse(Vectors.equal(new int[] {0, 0, 0}, new int[] {0, 0}));
assertFalse(Vectors.equal(new int[] {0, 0}, new int[] {0}));
assertFalse(Vectors.equal(new int[] {0}, new int[] {}));
assertFalse(Vectors.equal(new int[] {0, 0, 0}, new int[] {0, 0, 1}));
assertFalse(Vectors.equal(new int[] {0, 0, 0}, new int[] {0, 1, 0}));
assertFalse(Vectors.equal(new int[] {0, 0, 0}, new int[] {1, 0, 0}));
assertFalse(Vectors.equal(new int[] {0, 0, 1}, new int[] {0, 0, 3}));
}
このテストは JUnit の assertTrue メソッドと assertFalse メソッドを使用して、考えられるさまざまな結果をテストします。このメソッドのテストに合格するには、assertTrue がすべて true 、assertFalse がすべて false である必要があります。
比較: Vectors.java 用のテストメソッドの記述 (JUnit 3)
Utils.java 用のテストクラスの作成
ここで、Utils.java の JUnit テストメソッドを作成します。前の課題でテストクラスを作成したとき、JUnit のバージョンを確認するメッセージが表示されましたが、すでに JUnit バージョンを選択したため、以降に作成されたすべての JUnit テストはそのバージョンなので、ここではバージョンの選択を求められません。
注: バージョンとして JUnit 4 を選択しても、引き続き JUnit 3 テストを記述して実行することはできますが、IDE はテストスケルトンの生成に JUnit 4 テンプレートを使用します。
- Utils.java を右クリックし、「ツール」>「JUnit テストを作成」を選択します。
- ダイアログで「テスト初期化」および「テスト終了」が選択されていない場合は選択します。
- 「テストを作成」ダイアログで、テストクラスの名前を UtilsJUnit4Test に変更します。「了解」をクリックします。
「了解」をクリックすると、IDE によって、「テストパッケージ」の sample ディレクトリ内にテストファイル UtilsJUnit4Test.java が作成されます。Utils.java 内にあるメソッド用に、testComputeFactorial、testConcatWords、testNormalizeWord の各テストメソッドが生成されたことがわかります。テストおよびテストクラスに対して初期化メソッドと終了メソッドも生成されます。
Utils.java 用のテストメソッドの記述
この課題では、JUnit で共通のテスト要素の一部を示すテストケースを追加します。一部のメソッドは、メソッドが実行されたことやメソッドがテストに合格したことを示す出力を「JUnit テスト結果」ウィンドウにプリントしないため、メソッドに println も追加します。println をメソッドに追加することで、メソッドが実行されたかどうか、およびどの順番でメソッドが実行されたかを確認できます。
テスト初期化およびテスト終了
Utils.java 用のテストクラスを作成するとき、注釈付きの初期化メソッドと終了メソッドが生成されます。メソッド名には必須の命名規則がないため、任意の名前を付けることができます。
注: Utils.java をテストするために初期化および終了メソッドは必要ありませんが、このチュートリアルでは、それらの動作を示すために含まれています。
JUnit 4 では、次の種類の初期化メソッドと終了メソッドをマークするために注釈を使用できます。
- テストクラス初期化。 @BeforeClass 注釈により、メソッドがテストクラス初期化メソッドとしてマークされます。テストクラス初期化メソッドは、テストクラス内のほかのメソッドの前に、一回だけ実行されます。たとえば、テスト初期化でデータベース接続を作成したり、各テストメソッドの前に新しい接続を作成する代わりに、テストを実行する前にテストクラス初期化を使用して接続を開きます。続いて、テストクラス終了を使用して接続を閉じます。
- テストクラス終了。 @AfterClass 注釈により、メソッドがテストクラス終了メソッドとしてマークされます。テストクラス終了メソッドは、テストクラス内のほかのすべてのメソッドが終了したあと、一回だけ実行されます。
- テスト初期化。 @Before 注釈により、メソッドがテスト初期化メソッドとしてマークされます。テスト初期化メソッドは、テストクラスの各テストケースの前に実行されます。テストの実行にテスト初期化メソッドは必須ではありませんが、テストの実行前に一部の変数を初期化する必要がある場合は、テスト初期化メソッドを使用します。
- テスト終了。 @After 注釈により、メソッドがテスト終了メソッドとしてマークされます。テスト終了メソッドは、テストクラスの各テストケースのあとに実行されます。テストの実行にテスト終了メソッドは必須ではありませんが、テストケースの実行時に求められたデータをクリーンアップするために終了メソッドが必要になる場合があります。
UtilsJUnit4Test.java で、次の変更 (太字で表示されています) を行います。
@BeforeClass
public static void setUpClass() throws Exception {
System.out.println("* UtilsJUnit4Test: @BeforeClass method");
}
@AfterClass
public static void tearDownClass() throws Exception {
System.out.println("* UtilsJUnit4Test: @AfterClass method");
}
@Before
public void setUp() {
System.out.println("* UtilsJUnit4Test: @Before method");
}
@After
public void tearDown() {
System.out.println("* UtilsJUnit4Test: @After method");
}
比較: テストの初期化および終了 (JUnit 3)
テストクラスを実行すると、追加した println テキストが「JUnit テスト結果」ウィンドウの出力区画に表示されます。println を追加しない場合、初期化メソッドと終了メソッドが実行されたことを示す出力は表示されません。
単純なアサーションを使用したテスト
この単純なテストケースでは、concatWords メソッドをテストします。生成されたテストメソッドの testConcatWords を使用する代わりに、単一の単純なアサーションを使用してメソッドが文字列を正しく連結するかどうかをテストする、helloWorldCheck という新しいテストメソッドを追加します。テストケースの assertEquals では、予想した結果と実際の結果が同じであるかどうかをテストするために、構文 assertEquals(EXPECTED_RESULT, ACTUAL_RESULT) が使用されます。この例では、concatWords メソッドへの入力が「Hello」、「,」、「world」および「!」の場合、予想結果は「Hello, world!」と同じになるはずです。
- 生成された testConcatWords テストメソッドを削除します。
- Utils.concatWords をテストするため、次の helloWorldCheck メソッドを追加します。
@Test
public void helloWorldCheck() {
assertEquals("Hello, world!", Utils.concatWords("Hello", ", ", "world", "!"));
}
- テストに関するテキストを「JUnit テスト結果」ウィンドウに表示するため、println 文を追加します。
@Test
public void helloWorldCheck() {
System.out.println("* UtilsJUnit4Test: test method 1 - helloWorldCheck()");
assertEquals("Hello, world!", Utils.concatWords("Hello", ", ", "world", "!"));
比較: 単純なアサーションを使用したテスト (JUnit 3)
タイムアウトを使用したテスト
このテストでは、メソッドの完了までに時間がかかりすぎているかどうかを確認する方法を示します。メソッドの時間がかかりすぎている場合は、テストスレッドが中断され、テストは失敗します。テストでは時間制限を指定できます。
テストメソッドにより、Utils.java の computeFactorial メソッドが呼び出されます。computeFactorial メソッドは正しいと想定できますが、ここでテストするのは、計算が 1000 ミリ秒以内に完了するかどうかです。これは、1000 ミリ秒後にテストスレッドを中断することによって行います。スレッドが中断されると、テストメソッドは TimeoutException を返します。
- 生成されたテストメソッド testComputeFactorial を削除します。
- ランダムに生成された数字の階乗を計算する testWithTimeout メソッドを追加します。
@Test
public void testWithTimeout() {
final int factorialOf = 1 + (int) (30000 * Math.random());
System.out.println("computing " + factorialOf + '!');
System.out.println(factorialOf + "! = " + Utils.computeFactorial(factorialOf));
}
- タイムアウトを設定し、メソッドの実行に時間がかかりすぎる場合にスレッドを中断するには、次のコード (ボールドで表示) を追加します。
@Test(timeout=1000)
public void testWithTimeout() {
final int factorialOf = 1 + (int) (30000 * Math.random());
タイムアウトが 1000 ミリ秒に設定されていることがわかります。
- テストに関するテキストを「JUnit テスト結果」ウィンドウに出力するには、次の println (ボールドで表示) を追加します。
@Test(timeout=1000)
public void testWithTimeout() {
System.out.println("* UtilsJUnit4Test: test method 2 - testWithTimeout()");
final int factorialOf = 1 + (int) (30000 * Math.random());
System.out.println("computing " + factorialOf + '!');
比較: タイムアウトを使用したテスト (JUnit 3)
予想される例外のテスト
このテストでは、予想される例外のテスト方法を示します。このメソッドは、予想される指定の例外がスローされない場合、失敗します。この例では、入力変数が負の数 (-5) の場合に、computeFactorial メソッドが IllegalArgumentException をスローするかどうかをテストします。
- computeFactorial メソッドを呼び出す次の testExpectedException メソッドを、-5 の入力とともに追加します。
@Test
public void checkExpectedException() {
final int factorialOf = -5;
System.out.println(factorialOf + "! = " + Utils.computeFactorial(factorialOf));
}
- テストが IllegalArgumentException を返すように指定するには、次のプロパティー (ボールドで表示) を @Test 注釈に追加します。
@Test(expected=IllegalArgumentException.class)
public void checkExpectedException() {
final int factorialOf = -5;
System.out.println(factorialOf + "! = " + Utils.computeFactorial(factorialOf));
}
- テストに関するテキストを「JUnit テスト結果」ウィンドウに出力するには、次の println (ボールドで表示) を追加します。
@Test (expected=IllegalArgumentException.class)
public void checkExpectedException() {
System.out.println("* UtilsJUnit4Test: test method 3 - checkExpectedException()");
final int factorialOf = -5;
System.out.println(factorialOf + "! = " + Utils.computeFactorial(factorialOf));
}
比較: 予想される例外のテスト (JUnit 3)
テストの無効化
このテストでは、テストメソッドを一時的に無効にする方法を示します。JUnit 4 でテストを無効にするには、単純に @Ignore 注釈を追加します。
- 生成されたテストメソッド testNormalizeWord を削除します。
- 次のテストメソッドをテストクラスに追加します。
@Test
public void temporarilyDisabledTest() throws Exception {
System.out.println("* UtilsJUnit4Test: test method 4 - checkExpectedException()");
assertEquals("Malm\u00f6", Utils.normalizeWord("Malmo\u0308"));
}
テストクラスを実行すると、テストメソッド temporarilyDisabledTest が実行されます。
- テストを無効にするには、@Test の上に @Ignore 注釈 (ボールドで表示) を追加します。
@Ignore
@Test
public void temporarilyDisabledTest() throws Exception {
System.out.println("* UtilsJUnit4Test: test method 4 - checkExpectedException()");
assertEquals("Malm\u00f6", Utils.normalizeWord("Malmo\u0308"));
}
- org.junit.Ignore をインポートするために、インポートを修正します。
比較: テストの無効化 (JUnit 3)
これでテストが記述されたので、テストを実行し、テスト出力を「JUnit テスト結果」ウィンドウで確認できます。
テストの実行
アプリケーション全体または個々のファイルで JUnit テストを実行し、結果を IDE で確認できます。プロジェクトのすべての単体テストをもっとも簡単な方法で実行するには、メインメニューから「実行」>「<プロジェクト名> のテスト」を選択します。この方法を選択すると、「テストパッケージ」内のすべてのテストが実行されます。個々のテストクラスを実行するには、「テストパッケージ」ノードのテストクラスを右クリックし、「ファイルを実行」を選択します。
- 「プロジェクト」ウィンドウで UtilsJUnit4Test.java を右クリックします。
- 「ファイルをテスト」を選択します。
UtilsJUnit4Test.java を実行するときは、テストクラス内のテストのみが実行されます。クラスがすべてのテストに合格すると、次の画像に似た内容が「JUnit テスト結果」ウィンドウに表示されます。
この画像 (クリックして大きい画像を表示) では、Utils.java で JUnit テストが実行されたこと、およびクラスがすべてのテストに合格したことがわかります。左区画には個々のテストメソッドの結果が表示され、右区画にはテスト出力が表示されます。出力を確認すると、テストが実行された順序がわかります。各テストメソッドに追加した println により、テストの名前が「テスト結果」ウィンドウおよび「出力」ウィンドウに出力されます。
UtilsJUnit4Test で、@BeforeClass という注釈が付いたテストクラス初期化メソッドが、ほかのメソッドより先に一回だけ実行されたことがわかります。@AfterClass という注釈が付いたテストクラス終了メソッドが、クラス内のほかのすべてのメソッドが実行されたあとで最後に実行されました。@Before という注釈が付いたテスト初期化メソッドが各テストメソッドより先に実行されました。
「テスト結果」ウィンドウの左側にあるコントロールを使用すると、テストを簡単に再実行できます。フィルタを使用すると、すべてのテスト結果と失敗したテストのみの表示を切り替えできます。矢印を使用して、次の失敗または前の失敗にスキップできます。
「テスト結果」ウィンドウでテスト結果を右クリックすると、ポップアップメニューを使用してテストのソースに移動したり、テストを再度実行したり、テストをデバックしたりできます。
単体テストクラス作成後の次の手順は、テストスイートの作成です。指定されたテストをグループとして実行し、各テストを個々に実行しなくて済むようにする方法については、「JUnit 4 テストスイートの作成」を参照してください。
テストスイートの作成
プロジェクト用のテストを作成するときは通常、多数のテストクラスができます。テストクラスを個別に実行することも、プロジェクト内のすべてのテストをまとめて実行することもできます。多くの場合、テストのサブセットを実行するか、特定の順序でテストを実行します。これは、1 つまたは複数のテストスイートを作成することで実現できます。たとえば、コードの特定の側面または特定の条件をテストするテストスイートを作成できます。
テストスイートとは、基本的にメソッドを持つクラスであり、特定のテストクラス、テストクラス内のテストメソッド、およびその他のテストスイートなどの指定したテストケースを起動します。テストスイートはテストクラスの一部として含めることができますが、ベストプラクティスとしては、個々のテストスイートクラスを作成することをお勧めします。
プロジェクト用の JUnit 3 および JUnit 4 のテストスイートは、手動で作成することも、IDE が生成することもできます。IDE がテストスイートを生成する場合、デフォルトで、同じパッケージ内のすべてのテストクラスをテストスイートとして呼び出すコードが生成されます。テストスイートを作成したあと、スイートの一部として実行するテストを指定するようにクラスを変更できます。
JUnit 3 テストスイートの作成
テストのバージョンとして JUnit 3 を選択した場合、IDE ではテストパッケージのテストクラスに基づいて JUnit 3 テストスイートが生成されます。JUnit 3 では、TestSuite のインスタンスを作成し、各テストに対して addTest メソッドを使用することによって、テストスイートに含めるテストクラスを指定します。
- 「プロジェクト」ウィンドウで「JUnit-Sample」プロジェクトノードを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「JUnit」カテゴリと「テストスイート」を選択します。「次へ」をクリックします。
- 「クラス名」に「JUnit3TestSuite」と入力します。
- テストスイートを作成するため、テストパッケージフォルダのサンプルフォルダにある sample パッケージを選択します。
- 「テスト初期化」および「テスト終了」を選択解除します。「完了」をクリックします。
「完了」をクリックすると、sample パッケージにテストスイートクラスが作成され、クラスがエディタに表示されます。このテストスイートには次のコードが含まれます。
public class JUnit3TestSuite extends TestCase {
public JUnit3TestSuite(String testName) {
super(testName);
}
public static Test suite() {
TestSuite suite = new TestSuite("JUnit3TestSuite");
return suite;
}
}
- suite() メソッドを変更して、このスイートの一部として実行されるテストクラスを追加します。
public JUnit3TestSuite(String testName) {
super(testName);
}
public static Test suite() {
TestSuite suite = new TestSuite("JUnit3TestSuite");
suite.addTest(new TestSuite(sample.VectorsJUnit3Test.class));
suite.addTest(new TestSuite(sample.UtilsJUnit3Test.class));
return suite;
}
- 変更を保存します。
JUnit 4 テストスイートの作成
テストのバージョンとして JUnit 4 を選択した場合、IDE では JUnit 4 テストスイートを生成できます。JUnit 4 は下位互換性があるので、JUnit 4 と JUnit 3 のどちらのテストを含む JUnit 4 テストスイートも実行できます。JUnit 4 のテストスイートでは、テストスイートに含めるテストクラスを @Suite 注釈の値として指定します。
注: JUnit 3 テストスイートを JUnit 4 テストスイートの一部として実行するには、JUnit 4.4 以降が必要です。
- 「プロジェクト」ウィンドウでプロジェクトノードを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「JUnit」カテゴリと「テストスイート」を選択します。「次へ」をクリックします。
- ファイル名に「JUnit4TestSuite」と入力します。
- テストスイートを作成するため、テストパッケージフォルダのサンプルフォルダにある sample パッケージを選択します。
- 「テスト初期化」および「テスト終了」を選択解除します。「完了」をクリックします。
「完了」をクリックすると、sample パッケージにテストスイートクラスが作成され、クラスがエディタに表示されます。このテストスイートには次のようなコードが含まれます。
@RunWith(Suite.class)
@Suite.SuiteClasses(value={UtilsJUnit4Test.class, VectorsJUnit4Test.class})
public class JUnit4TestSuite {
}
このテストスイートを実行すると、IDE によって各テストクラスが、リストされている順序で実行されます。
テストスイートの実行
テストスイートは、個々のテストクラスを実行する場合と同じ方法で実行します。
- 「プロジェクト」ウィンドウで「テストパッケージ」ノードを展開します。
- テストスイートクラスを右クリックし、「ファイルをテスト」を選択します。
テストスイートを実行すると、スイートに含まれるテストが一覧表示された順に実行されます。結果は「JUnit テスト結果」ウィンドウに表示されます。
この画像 (クリックして大きい画像を表示) では、JUnit 3 テストスイートのテスト結果がわかります。テストスイートにより UtilsJUnit3Test テストクラスと VectorsJUnit3Test テストクラスが単一のテストとして実行され、単一テストの結果として、テスト結果が左区画に表示されました。右区画の出力は、テストを個別に実行した場合と同じ内容です。
この画像 (クリックして大きい画像を表示) では、JUnit 4 テストスイートのテスト結果がわかります。テストスイートにより UtilsJUnit4Test テストクラスと VectorsJUnit4Test テストクラスが単一のテストとして実行され、単一のテストの結果としてテスト結果が左区画に表示されました。右区画の出力は、テストを個別に実行した場合と同じ内容です。
この画像 (クリックして大きい画像を表示) では、混合型のテストスイートのテスト結果がわかります。このテストスイートには JUnit 4 テストスイートと JUnit 3 のテストクラスのうち 1 つが含まれています。テストスイートにより UtilsJUnit3Test.java テストクラスと JUnit4TestSuite.java テストクラスが単一のテストとして実行され、単一のテストの結果としてテスト結果が左区画に表示されました。右区画の出力は、テストを個別に実行した場合と同じ内容です。
まとめ
このチュートリアルでは、NetBeans IDE で JUnit 単体テストとテストスイートを作成するための基本を紹介しました。IDE では JUnit 3 および JUnit 4 がサポートされています。また、このドキュメントでは、テストの作成および実行をより簡素化するように設計されている JUnit 4 での変更点をいくつか示しました。
このチュートリアルで示されているように、JUnit 4 での主な改善点の 1 つは注釈のサポートです。JUnit 4 では、注釈を使用して次を行うことができます。
- 命名規則の代わりに @Test 注釈を使用してテストを識別する
- @Before 注釈および @After 注釈を使用して、setUp メソッドおよび tearDown メソッドを識別する
- テストクラス全体に適用する setUp メソッドおよび tearDown メソッドを識別する。@BeforeClass という注釈が付いたメソッドは、クラス内の任意のテストメソッドが実行される前に、一回だけ実行されます。@AfterClass という注釈が付いたメソッドも、すべてのテストメソッドが終了したあとに、一回だけ実行されます。
- 予期している例外を識別する
- @Ignore 注釈を使用して省略するテストを識別する
- テストのタイムアウトパラメータを指定する
JUnit の使用および JUnit 4 でのその他の変更点に関する詳細は、次のリソースを参照してください。
コードのテストは、コードにわずかな変更を加えてもアプリケーションが壊れないことを確認するのに役立ちます。JUnit などの自動テストツールを使用するとテストのプロセスを合理化でき、テストを頻繁に行うことでコードエラーを早期に発見できます。
関連項目
NetBeans IDE を使用した Java アプリケーションの開発方法についての詳細は、次のリソースを参照してください。
|
|