Junit-quick-guide
JUnit-概要
テストとは、アプリケーションの機能をチェックして、要件に従って実行されることを確認するプロセスです。 単体テストは、開発者レベルで明らかになります。単一のエンティティ(クラスまたはメソッド)のテストです。 単体テストは、ソフトウェア会社が高品質の製品を顧客に提供するのを支援する上で重要な役割を果たします。
ユニットテストは、手動テストと自動テストの2つの方法で実行できます。
Manual Testing | Automated Testing |
---|---|
Executing a test cases manually without any tool support is known as manual testing. | Taking tool support and executing the test cases by using an automation tool is known as automation testing. |
Time-consuming and tedious − Since test cases are executed by human resources, it is very slow and tedious. | Fast − Automation runs test cases significantly faster than human resources. |
Huge investment in human resources − As test cases need to be executed manually, more testers are required in manual testing. | Less investment in human resources − Test cases are executed using automation tools, so less number of testers are required in automation testing. |
Less reliable − Manual testing is less reliable, as it has to account for human errors. | More reliable − Automation tests are precise and reliable. |
Non-programmable − No programming can be done to write sophisticated tests to fetch hidden information. | Programmable − Testers can program sophisticated tests to bring out hidden information. |
JUnitとは何ですか?
JUnitは、Javaプログラミング言語の単体テストフレームワークです。 テスト駆動開発の重要な役割を果たし、xUnitとして総称される単体テストフレームワークのファミリーです。
JUnitは、「最初にテストしてからコーディングする」という考え方を推進しています。これは、最初にテストしてから実装できるコードのテストデータを設定することに重点を置いています。 このアプローチは、「少しテストし、少しコーディングし、少しテストし、少しコーディングする」ようなものです。プログラマーの生産性とプログラムコードの安定性が向上し、プログラマーのストレスとデバッグにかかる時間が削減されます。
JUnitの機能
- JUnitは、テストの作成と実行に使用されるオープンソースフレームワークです。
- テストメソッドを識別するための注釈を提供します。
- 期待される結果をテストするためのアサーションを提供します。
- テストを実行するためのテストランナーを提供します。
- JUnitテストを使用すると、コードをより速く書くことができ、品質が向上します。
- JUnitはエレガントでシンプルです。 それほど複雑ではなく、時間がかかりません。
- JUnitテストは自動的に実行でき、独自の結果を確認してすぐにフィードバックを提供します。 テスト結果のレポートを手動で確認する必要はありません。
- JUnitテストは、テストケースやその他のテストスイートを含むテストスイートに編成できます。
- JUnitは、テストがスムーズに実行されている場合は緑のバーでテストの進行状況を示し、テストが失敗すると赤に変わります。
ユニットテストケースとは何ですか?
ユニットテストケースはコードの一部であり、コードの別の部分(メソッド)が期待どおりに機能することを保証します。 目的の結果を迅速に達成するには、テストフレームワークが必要です。 JUnitは、Javaプログラミング言語の完璧な単体テストフレームワークです。
正式な単体テストケースは、既知の入力と期待される出力によって特徴付けられ、テストが実行される前に解決されます。 既知の入力は前提条件をテストし、予想される出力は事後条件をテストする必要があります。
要件ごとに少なくとも2つのユニットテストケースが必要です。1つは陽性テスト、もう1つは陰性テストです。 要件に下位要件がある場合、各下位要件には少なくとも2つのテストケースが陽性および陰性である必要があります。
JUnit-環境設定
ローカル環境のセットアップ
JUnitはJavaのフレームワークなので、最初の要件はJDKをマシンにインストールすることです。
システム要件
JDK | 1.5 or above. |
Memory | No minimum requirement. |
Disk Space | No minimum requirement. |
Operating System | No minimum requirement. |
ステップ1:マシンでのJavaインストールの検証
まず、コンソールを開き、作業しているオペレーティングシステムに基づいてjavaコマンドを実行します。
OS | Task | Command |
---|---|---|
Windows | Open Command Console | c:\> java -version |
Linux | Open Command Terminal | $ java -version |
Mac | Open Terminal | machine:~ joseph$ java -version |
すべてのオペレーティングシステムの出力を確認しましょう-
OS | Output |
---|---|
Windows |
java version "1.8.0_101" Java(TM)SEランタイム環境(ビルド1.8.0_101) |
Linux |
java version "1.8.0_101" Java(TM)SEランタイム環境(ビルド1.8.0_101) |
Mac |
java version "1.8.0_101" Java(TM)SEランタイム環境(ビルド1.8.0_101) |
システムにJavaがインストールされていない場合は、次のリンクからJavaソフトウェア開発キット(SDK)をダウンロードしてください。https://www.oracle.com/technetwork/java/javase/downloads/indexl [https://www .oracle.com]。 このチュートリアルのインストールバージョンとしてJava 1.8.0_101を想定しています。
ステップ2:JAVA環境を設定する
*JAVA_HOME* 環境変数を設定して、Javaがマシンにインストールされているベースディレクトリの場所を指すようにします。 例えば。
OS | Output |
---|---|
Windows | Set the environment variable JAVA_HOME to C:\Program Files\Java\jdk1.8.0_101 |
Linux | export JAVA_HOME =/usr/local/java-current |
Mac | export JAVA_HOME =/Library/Java/Home |
Javaコンパイラの場所をシステムパスに追加します。
OS | Output |
---|---|
Windows | Append the string C:\Program Files\Java\jdk1.8.0_101\bin *at the end of the system variable, Path*. |
Linux | export PATH = $PATH:$JAVA_HOME/bin/ |
Mac | not required |
上記の説明に従って、コマンド java -version を使用してJavaのインストールを確認します。
ステップ3:JUnitアーカイブをダウンロードする
http://www.junit.orgからJUnit jarファイルの最新バージョンをダウンロードします。 このチュートリアルを書いている時点で、Junit-4.12.jarをダウンロードし、C:\> JUnitフォルダーにコピーしました。
OS | Archive name |
---|---|
Windows | junit4.12.jar |
Linux | junit4.12.jar |
Mac | junit4.12.jar |
ステップ4:JUnit環境を設定する
*JUNIT_HOME* 環境変数を設定して、マシン上のJUNIT jarが格納されているベースディレクトリの場所を指すようにします。 JUNITフォルダーにjunit4.12.jarを保存したと仮定しましょう。
Sr.No | OS & Description |
---|---|
1 |
Windows 環境変数JUNIT_HOMEをC:\ JUNITに設定します |
2 |
Linux エクスポートJUNIT_HOME =/usr/local/JUNIT |
3 |
Mac export JUNIT_HOME =/Library/JUNIT |
ステップ5:CLASSPATH変数を設定する
JCLASS jarの場所を指すように CLASSPATH 環境変数を設定します。
Sr.No | OS & Description |
---|---|
1 |
Windows 環境変数CLASSPATHを%CLASSPATH%;%JUNIT_HOME%\ junit4.12.jar;。;に設定します。 |
2 |
Linux export CLASSPATH = $ CLASSPATH:$ JUNIT_HOME/junit4.12.jar:。 |
3 |
Mac export CLASSPATH = $ CLASSPATH:$ JUNIT_HOME/junit4.12.jar:。 |
ステップ6:JUnitセットアップのテスト
*C:\> JUNIT_WORKSPACE* にJavaクラスファイル名TestJunitを作成します
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
@Test
public void testAdd() {
String str = "Junit is working fine";
assertEquals("Junit is working fine",str);
}
}
テストケースを実行するには、 C:\> JUNIT_WORKSPACE にJavaクラスファイル名TestRunnerを作成します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
ステップ7:結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
C:\JUNIT_WORKSPACE>javac TestJunit.java TestRunner.java
次に、テストランナーを実行して、次のように結果を確認します-
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。
true
JUnit-テストフレームワーク
JUnitは、開発者がJavaで単体テストを実装し、プログラミング速度を加速し、コードの品質を向上させるために使用する*回帰テストフレームワーク*です。 JUnit Frameworkは、次のいずれかと簡単に統合できます-
- エクリプス
- Ant
- メーベン
JUnitテストフレームワークの機能
JUnitテストフレームワークは、次の重要な機能を提供します-
- 備品
- テストスイート
- テストランナー
- JUnitクラス
備品
- フィクスチャー*は、テストを実行するためのベースラインとして使用される一連のオブジェクトの固定状態です。 テストフィクスチャの目的は、結果が再現可能になるようにテストが実行される既知の固定環境があることを確認することです。 それが含まれています-
- setUp()メソッド。すべてのテスト呼び出しの前に実行されます。
- tearDown()メソッド。すべてのテストメソッドの後に実行されます。
1つの例を確認しましょう-
import junit.framework.*;
public class JavaTest extends TestCase {
protected int value1, value2;
//assigning the values
protected void setUp(){
value1 = 3;
value2 = 3;
}
//test method to add two values
public void testAdd(){
double result = value1 + value2;
assertTrue(result == 6);
}
}
テストスイート
テストスイートは、いくつかのユニットテストケースをバンドルし、それらを一緒に実行します。 JUnitでは、@ RunWithアノテーションと@Suiteアノテーションの両方を使用して、スイートテストを実行します。 以下に、TestJunit1およびTestJunit2テストクラスを使用する例を示します。
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
//JUnit Suite Test
@RunWith(Suite.class)
@Suite.SuiteClasses({
TestJunit1.class ,TestJunit2.class
})
public class JunitTestSuite {
}
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit1 {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
assertEquals(message, messageUtil.printMessage());
}
}
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit2 {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
テストランナー
テストランナーは、テストケースの実行に使用されます。 以下は、テストクラス TestJunit が既に存在することを前提とする例です。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
JUnitクラス
JUnitクラスは重要なクラスで、JUnitの作成とテストに使用されます。 重要なクラスのいくつかは-
- Assert -assertメソッドのセットが含まれています。
- TestCase -複数のテストを実行するフィクスチャを定義するテストケースが含まれています。
- TestResult -テストケースの実行結果を収集するメソッドが含まれています。
JUnit-基本的な使用法
ここで、JUnitを使用する段階的なプロセスを示す基本的な例を示します。
クラスを作成する
*C:\> JUNIT_WORKSPACE* に、テストするJavaクラス(MessageUtil.javaなど)を作成します
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
//prints the message
public String printMessage(){
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
TestJunit.javaなどのJavaテストクラスを作成します。
テストメソッドtestPrintMessage()をテストクラスに追加します。
メソッドtestPrintMessage()にAnnotaion @Testを追加します。
テスト条件を実装し、JUnitのassertEquals APIを使用して条件を確認します。
*C:\> JUNIT_WORKSPACE* にJavaクラスファイル名TestJunit.javaを作成します。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
assertEquals(message,messageUtil.printMessage());
}
}
テストランナークラスを作成する
TestRunner Javaクラスを作成します。
JUnitのJUnitCoreクラスのrunClassesメソッドを使用して、上記で作成したテストクラスのテストケースを実行します。
結果オブジェクトで実行されたテストケースの結果を取得します。
ResultオブジェクトのgetFailures()メソッドを使用して失敗を取得します。
ResultオブジェクトのwasSuccessful()メソッドを使用して成功結果を取得します。
*C:\> JUNIT_WORKSPACE* にTestRunner.javaという名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用して、MessageUtil、テストケース、およびテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。
Hello World
true
テストが失敗するように、 C:\> JUNIT_WORKSPACE のTestJunitを更新します。 メッセージ文字列を変更します。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
message = "New Word";
assertEquals(message,messageUtil.printMessage());
}
}
残りのクラスはそのままにして、同じテストランナーを実行してみましょう。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。
Hello World
testPrintMessage(TestJunit): expected:<[New Wor]d> but was:<[Hello Worl]d>
false
JUnit-API
JUnitで最も重要なパッケージは junit.framework で、これにはすべてのコアクラスが含まれています。 重要なクラスのいくつかは次のとおりです-
Sr.No. | Class Name | Functionality |
---|---|---|
1 | Assert | A set of assert methods. |
2 | TestCase | A test case defines the fixture to run multiple tests. |
3 | TestResult | A TestResult collects the results of executing a test case. |
4 | TestSuite | A TestSuite is a composite of tests. |
クラスをアサート
以下は org.junit.Assert クラスの宣言です-
public class Assert extends java.lang.Object
このクラスは、テストの作成に役立つ一連のアサーションメソッドを提供します。 失敗したアサーションのみが記録されます。 Assertクラスの重要なメソッドのいくつかは次のとおりです-
Sr.No. | Methods & Description |
---|---|
1 |
void assertEquals(boolean expected, boolean actual) 2つのプリミティブ/オブジェクトが等しいことを確認します。 |
2 |
void assertFalse(boolean condition) 条件が偽であることを確認します。 |
3 |
void assertNotNull(Object object) オブジェクトがnullでないことを確認します。 |
4 |
void assertNull(Object object) オブジェクトがnullであることを確認します。 |
5 |
void assertTrue(boolean condition) 条件が真であることを確認します。 |
6 |
void fail() メッセージなしでテストに失敗します。 |
上記の方法のいくつかを例で使用してみましょう。 C:\> JUNIT_WORKSPACE にTestJunit1.javaという名前のJavaクラスファイルを作成します。
import org.junit.Test;
import static org.junit.Assert.*;
public class TestJunit1 {
@Test
public void testAdd() {
//test data
int num = 5;
String temp = null;
String str = "Junit is working fine";
//check for equality
assertEquals("Junit is working fine", str);
//check for false condition
assertFalse(num > 6);
//check for not null value
assertNotNull(temp);
}
}
次に、C:\> JUNIT_WORKSPACEに TestRunner1.java という名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner1 {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit1.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用してテストケースとテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac TestJunit1.java TestRunner1.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner1
出力を確認します。
true
TestCaseクラス
以下は org.junit.TestCase クラスの宣言です-
public abstract class TestCase extends Assert implements Test
テストケースは、複数のテストを実行するフィクスチャを定義します。 TestCase クラスの重要なメソッドのいくつかは次のとおりです-
Sr.No. | Methods & Description |
---|---|
1 |
int countTestCases() run(TestResult result)によって実行されたテストケースの数をカウントします。 |
2 |
TestResult createResult() デフォルトのTestResultオブジェクトを作成します。 |
3 |
String getName() TestCaseの名前を取得します。 |
4 |
TestResult run() このテストを実行する便利なメソッドで、デフォルトのTestResultオブジェクトで結果を収集します。 |
5 |
void run(TestResult result) テストケースを実行し、TestResultで結果を収集します。 |
6 |
void setName(String name) TestCaseの名前を設定します。 |
7 |
void setUp() ネットワーク接続を開くなど、フィクスチャをセットアップします。 |
8 |
void tearDown() たとえば、フィクスチャを引き裂くと、ネットワーク接続が閉じられます。 |
9 |
String toString() テストケースの文字列表現を返します。 |
上記の方法のいくつかを例で使用してみましょう。 C:\> JUNIT_WORKSPACEに TestJunit2.java という名前のJavaクラスファイルを作成します。
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
public class TestJunit2 extends TestCase {
protected double fValue1;
protected double fValue2;
@Before
public void setUp() {
fValue1 = 2.0;
fValue2 = 3.0;
}
@Test
public void testAdd() {
//count the number of test cases
System.out.println("No of Test Case = "+ this.countTestCases());
//test getName
String name = this.getName();
System.out.println("Test Case Name = "+ name);
//test setName
this.setName("testNewAdd");
String newName = this.getName();
System.out.println("Updated Test Case Name = "+ newName);
}
//tearDown used to close the connection or clean up activities
public void tearDown( ) {
}
}
次に、C:\> JUNIT_WORKSPACEに TestRunner2.java という名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner2 {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit2.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用してテストケースとテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac TestJunit2.java TestRunner2.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner2
出力を確認します。
No of Test Case = 1
Test Case Name = testAdd
Updated Test Case Name = testNewAdd
true
TestResultクラス
以下は org.junit.TestResult クラスの宣言です-
public class TestResult extends Object
TestResultは、テストケースの実行結果を収集します。 これは、収集パラメータパターンのインスタンスです。 テストフレームワークは、失敗とエラーを区別します。 失敗が予想され、アサーションでチェックされます。 エラーは、ArrayIndexOutOfBoundsExceptionのような予期しない問題です。 TestResult クラスの重要なメソッドのいくつかは次のとおりです-
Sr.No. | Methods & Description |
---|---|
1 |
void addError(Test test, Throwable t) エラーのリストにエラーを追加します。 |
2 |
void addFailure(Test test, AssertionFailedError t) 失敗のリストに失敗を追加します。 |
3 |
void endTest(Test test) テストが完了したことを結果に通知します。 |
4 |
int errorCount() 検出されたエラーの数を取得します。 |
5 |
Enumeration<TestFailure> errors() エラーの列挙を返します。 |
6 |
int failureCount() 検出された障害の数を取得します。 |
7 |
void run(TestCase test) TestCaseを実行します。 |
8 |
int runCount() 実行テストの数を取得します。 |
9 |
void startTest(Test test) テストが開始されることを結果に通知します。 |
10 |
void stop() テストの実行を停止する必要があることを示します。 |
C:\> JUNIT_WORKSPACEに TestJunit3.java という名前のJavaクラスファイルを作成します。
import org.junit.Test;
import junit.framework.AssertionFailedError;
import junit.framework.TestResult;
public class TestJunit3 extends TestResult {
//add the error
public synchronized void addError(Test test, Throwable t) {
super.addError((junit.framework.Test) test, t);
}
//add the failure
public synchronized void addFailure(Test test, AssertionFailedError t) {
super.addFailure((junit.framework.Test) test, t);
}
@Test
public void testAdd() {
//add any test
}
//Marks that the test run should stop.
public synchronized void stop() {
//stop the test here
}
}
次に、C:\> JUNIT_WORKSPACEに TestRunner3.java という名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner3 {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit3.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用してテストケースとテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac TestJunit3.java TestRunner3.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner3
出力を確認します。
true
TestSuiteクラス
以下は org.junit.TestSuite クラスの宣言です。
public class TestSuite extends Object implements Test
TestSuiteは、テストの複合です。 テストケースのコレクションを実行します。 TestSuite クラスの重要なメソッドのいくつかは次のとおりです-
Sr.No. | Methods & Description |
---|---|
1 |
void addTest(Test test) スイートにテストを追加します。 |
2 |
void addTestSuite(Class<? extends TestCase> testClass) 指定されたクラスのテストをスイートに追加します。 |
3 |
int countTestCases() このテストで実行されるテストケースの数をカウントします。 |
4 |
String getName() スイートの名前を返します。 |
5 |
void run(TestResult result) テストを実行し、結果をTestResultに収集します。 |
6 |
void setName(String name) スイートの名前を設定します。 |
7 |
Test testAt(int index) 指定されたインデックスでテストを返します。 |
8 |
int testCount() このスイート内のテストの数を返します。 |
9 |
static Test warning(String message) 失敗するテストを返し、警告メッセージを記録します。 |
C:\> JUNIT_WORKSPACEに JunitTestSuite.java という名前のJavaクラスファイルを作成して、テストスイートを作成します。
import junit.framework.*;
public class JunitTestSuite {
public static void main(String[] a) {
//add the test's in the suite
TestSuite suite = new TestSuite(TestJunit1.class, TestJunit2.class, TestJunit3.class );
TestResult result = new TestResult();
suite.run(result);
System.out.println("Number of test cases = " + result.runCount());
}
}
javacを使用してテストスイートクラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac JunitTestSuite.java
次に、テストスイートを実行します。
C:\JUNIT_WORKSPACE>java JunitTestSuite
出力を確認します。
No of Test Case = 1
Test Case Name = testAdd
Updated Test Case Name = testNewAdd
Number of test cases = 3
JUnit-テストの作成
ここでは、テストランナーによって実行される、POJOクラス、ビジネスロジッククラス、およびテストクラスを使用したJUnitテストの完全な例が1つ表示されます。
C:\> JUNIT_WORKSPACEに EmployeeDetails.java を作成します。これはPOJOクラスです。
public class EmployeeDetails {
private String name;
private double monthlySalary;
private int age;
/**
*@return the name
*/
public String getName() {
return name;
}
/**
*@param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
*@return the monthlySalary
*/
public double getMonthlySalary() {
return monthlySalary;
}
/**
*@param monthlySalary the monthlySalary to set
*/
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
/**
*@return the age
*/
public int getAge() {
return age;
}
/**
*@param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
}
*EmployeeDetails* クラスを使用して-
- 従業員の名前の値を取得/設定します。
- 従業員の月給の値を取得/設定します。
- 従業員の年齢の値を取得/設定します。
C:\> JUNIT_WORKSPACEに EmpBusinessLogic.java というファイルを作成します。このファイルにはビジネスロジックが含まれています。
public class EmpBusinessLogic {
//Calculate the yearly salary of employee
public double calculateYearlySalary(EmployeeDetails employeeDetails) {
double yearlySalary = 0;
yearlySalary = employeeDetails.getMonthlySalary() * 12;
return yearlySalary;
}
//Calculate the appraisal amount of employee
public double calculateAppraisal(EmployeeDetails employeeDetails) {
double appraisal = 0;
if(employeeDetails.getMonthlySalary() < 10000){
appraisal = 500;
}else{
appraisal = 1000;
}
return appraisal;
}
}
*EmpBusinessLogic* クラスは計算に使用されます-
- 従業員の年sal。
- 従業員の評価額。
C:\> JUNIT_WORKSPACEに TestEmployeeDetails.java というファイルを作成します。このファイルには、テストするテストケースが含まれています。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestEmployeeDetails {
EmpBusinessLogic empBusinessLogic = new EmpBusinessLogic();
EmployeeDetails employee = new EmployeeDetails();
//test to check appraisal
@Test
public void testCalculateAppriasal() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double appraisal = empBusinessLogic.calculateAppraisal(employee);
assertEquals(500, appraisal, 0.0);
}
//test to check yearly salary
@Test
public void testCalculateYearlySalary() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double salary = empBusinessLogic.calculateYearlySalary(employee);
assertEquals(96000, salary, 0.0);
}
}
*TestEmployeeDetails* クラスは、 *EmpBusinessLogic* クラスのメソッドのテストに使用されます。 It
- 従業員の年salをテストします。
- 従業員の評価額をテストします。
次に、C:\> JUNIT_WORKSPACEに TestRunner.java という名前のJavaクラスを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestEmployeeDetails.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用してテストケースとテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac EmployeeDetails.java
EmpBusinessLogic.java TestEmployeeDetails.java TestRunner.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。
true
JUnit-アサーションの使用
アサーション
すべてのアサーションはAssertクラスにあります。
public class Assert extends java.lang.Object
このクラスは、テストの記述に役立つ一連のアサーションメソッドを提供します。 失敗したアサーションのみが記録されます。 Assertクラスの重要なメソッドのいくつかは次のとおりです-
Sr.No. | Methods & Description |
---|---|
1 |
void assertEquals(boolean expected, boolean actual) 2つのプリミティブ/オブジェクトが等しいことを確認します。 |
2 |
void assertTrue(boolean condition) 条件が真であることを確認します。 |
3 |
void assertFalse(boolean condition) 条件が偽であることを確認します。 |
4 |
void assertNotNull(Object object) オブジェクトがnullでないことを確認します。 |
5 |
void assertNull(Object object) オブジェクトがnullであることを確認します。 |
6 |
void assertSame(object1, object2) assertSame()メソッドは、2つのオブジェクト参照が同じオブジェクトを指しているかどうかをテストします。 |
7 |
void assertNotSame(object1, object2) assertNotSame()メソッドは、2つのオブジェクト参照が同じオブジェクトを指していないかどうかをテストします。 |
8 |
void assertArrayEquals(expectedArray, resultArray); assertArrayEquals()メソッドは、2つの配列が互いに等しいかどうかをテストします。 |
上記の方法のいくつかを例で使用してみましょう。 C:\> JUNIT_WORKSPACEに TestAssertions.java という名前のJavaクラスファイルを作成します。
import org.junit.Test;
import static org.junit.Assert.*;
public class TestAssertions {
@Test
public void testAssertions() {
//test data
String str1 = new String ("abc");
String str2 = new String ("abc");
String str3 = null;
String str4 = "abc";
String str5 = "abc";
int val1 = 5;
int val2 = 6;
String[] expectedArray = {"one", "two", "three"};
String[] resultArray = {"one", "two", "three"};
//Check that two objects are equal
assertEquals(str1, str2);
//Check that a condition is true
assertTrue (val1 < val2);
//Check that a condition is false
assertFalse(val1 > val2);
//Check that an object isn't null
assertNotNull(str1);
//Check that an object is null
assertNull(str3);
//Check if two object references point to the same object
assertSame(str4,str5);
//Check if two object references not point to the same object
assertNotSame(str1,str3);
//Check whether two arrays are equal to each other.
assertArrayEquals(expectedArray, resultArray);
}
}
次に、C:\> JUNIT_WORKSPACEに TestRunner.java という名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner2 {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestAssertions.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用して、テストケースとテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac TestAssertions.java TestRunner.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。
true
アノテーション
注釈は、コードに追加してメソッドやクラスに適用できるメタタグのようなものです。 JUnitのこれらの注釈は、テストメソッドに関する次の情報を提供します-
- どのメソッドがテストメソッドの前後に実行されるか。
- どのメソッドがすべてのメソッドの前後に実行されるか、および。 *実行中に無視されるメソッドまたはクラス。
次の表は、JUnitでの注釈とその意味のリストです-
Sr.No. | Annotation & Description |
---|---|
1 |
Testアノテーションは、JUnitにアタッチされたパブリックvoidメソッドをテストケースとして実行できることを伝えます。 |
2 |
@Before いくつかのテストでは、実行する前に同様のオブジェクトを作成する必要があります。 public voidメソッドに@Beforeの注釈を付けると、各Testメソッドの前にそのメソッドが実行されます。 |
3 |
@After Beforeメソッドで外部リソースを割り当てる場合、テストの実行後にそれらを解放する必要があります。 @Afterを使用してpublic voidメソッドに注釈を付けると、そのメソッドはTestメソッドの後に実行されます。 |
4 |
@BeforeClass @BeforeClassを使用してpublic static voidメソッドに注釈を付けると、クラス内のテストメソッドの前に1回実行されます。 |
5 |
@AfterClass これは、すべてのテストが終了した後にメソッドを実行します。 これを使用して、クリーンアップアクティビティを実行できます。 |
6 |
@Ignore Ignore注釈は、テストを無視するために使用され、そのテストは実行されません。 |
C:\> JUNIT_WORKSPACEに JunitAnnotation.java という名前のJavaクラスファイルを作成して、注釈をテストします。
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
public class JunitAnnotation {
//execute before class
@BeforeClass
public static void beforeClass() {
System.out.println("in before class");
}
//execute after class
@AfterClass
public static void afterClass() {
System.out.println("in after class");
}
//execute before test
@Before
public void before() {
System.out.println("in before");
}
//execute after test
@After
public void after() {
System.out.println("in after");
}
//test case
@Test
public void test() {
System.out.println("in test");
}
//test case ignore and will not execute
@Ignore
public void ignoreTest() {
System.out.println("in ignore test");
}
}
次に、C:\> JUNIT_WORKSPACEに TestRunner.java という名前のJavaクラスファイルを作成して、注釈を実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(JunitAnnotation.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用して、テストケースとテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac JunitAnnotation.java TestRunner.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。
in before class
in before
in test
in after
in after class
true
JUnit-実行手順
この章では、呼び出されるメソッドの順序を定義するJUnitのメソッドの実行手順について説明します。 以下に、JUnitテストAPIメソッドの実行手順と例を示します。
C:\> JUNIT_WORKSPACEにExecutionProcedureJunit.javaという名前のJavaクラスファイルを作成して、アノテーションをテストします。
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
public class ExecutionProcedureJunit {
//execute only once, in the starting
@BeforeClass
public static void beforeClass() {
System.out.println("in before class");
}
//execute only once, in the end
@AfterClass
public static void afterClass() {
System.out.println("in after class");
}
//execute for each test, before executing test
@Before
public void before() {
System.out.println("in before");
}
//execute for each test, after executing test
@After
public void after() {
System.out.println("in after");
}
//test case 1
@Test
public void testCase1() {
System.out.println("in test case 1");
}
//test case 2
@Test
public void testCase2() {
System.out.println("in test case 2");
}
}
次に、C:\> JUNIT_WORKSPACEに TestRunner.java という名前のJavaクラスファイルを作成して、注釈を実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(ExecutionProcedureJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用して、テストケースとテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac ExecutionProcedureJunit.java TestRunner.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。
in before class
in before
in test case 1
in after
in before
in test case 2
in after
in after class
上記の出力を参照してください。 実行手順は次のとおりです-
- まず、beforeClass()メソッドは1回だけ実行されます。
- afterClass()メソッドは1回だけ実行されます。
- before()メソッドはテストケースごとに実行されますが、テストケースを実行する前に実行されます。
- after()メソッドはテストケースごとに実行されますが、テストケースの実行後に実行されます。
- before()とafter()の間で、各テストケースが実行されます。
JUnit-テストの実行
テストケースは JUnitCore クラスを使用して実行されます。 JUnitCoreは、テストを実行するためのファサードです。 JUnit 4テスト、JUnit 3.8.xテスト、および混合の実行をサポートしています。 コマンドラインからテストを実行するには、java org.junit.runner.JUnitCore <TestClass>を実行します。 ワンショットテストの実行には、静的メソッドrunClasses(Class [])を使用します。
以下は、 org.junit.runner.JUnitCore クラスの宣言です。
public class JUnitCore extends java.lang.Object
ここでは、JUnitCoreを使用してテストを実行する方法を説明します。
クラスを作成する
C:\> JUNIT_WORKSPACEに、テストするJavaクラス、たとえば MessageUtil.java を作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
//prints the message
public String printMessage(){
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
- TestJunit.javaなどのJavaテストクラスを作成します。
- テストメソッドtestPrintMessage()をテストクラスに追加します。
- メソッドtestPrintMessage()にAnnotaion @Testを追加します。
- テスト条件を実装し、JUnitのassertEquals APIを使用して条件を確認します。
C:\> JUNIT_WORKSPACEに TestJunit.java という名前のJavaクラスファイルを作成します。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
assertEquals(message,messageUtil.printMessage());
}
}
テストランナークラスを作成する
次に、C:\> JUNIT_WORKSPACEに TestRunner.java という名前のJavaクラスファイルを作成して、テストケースを実行します。 JUnitCoreクラスをインポートし、テストクラス名をパラメーターとして受け取るrunClasses()メソッドを使用します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用して、テストケースとテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。
Hello World
true
JUnit-スイートテスト
テストスイート*は、いくつかのユニットテストケースをバンドルして一緒に実行するために使用されます。 JUnitでは、 *@ RunWith および @ Suite 注釈の両方がスイートテストの実行に使用されます。 この章では、Test Suiteを使用して一緒に実行される2つのテストクラス TestJunit1 および TestJunit2 の例を取り上げます。
クラスを作成する
C:\> JUNIT_WORKSPACEに MessageUtil.java などのテスト対象のJavaクラスを作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
//prints the message
public String printMessage(){
System.out.println(message);
return message;
}
//add "Hi!" to the message
public String salutationMessage(){
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
C:\> JUNIT_WORKSPACEに TestJunit1.java という名前のJavaクラスファイルを作成します。
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit1 {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
assertEquals(message, messageUtil.printMessage());
}
}
C:\> JUNIT_WORKSPACEに TestJunit2.java という名前のJavaクラスファイルを作成します。
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit2 {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
テストスイートクラスを作成する
- Javaクラスを作成します。
- @RunWith(Suite.class)アノテーションをクラスに添付します。
- @ Suite.SuiteClassesアノテーションを使用して、JUnitテストクラスへの参照を追加します。
C:\> JUNIT_WORKSPACEに TestSuite.java という名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
TestJunit1.class,
TestJunit2.class
})
public class JunitTestSuite {
}
テストランナークラスを作成する
C:\> JUNIT_WORKSPACEに TestRunner.java という名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(JunitTestSuite.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用してすべてのJavaクラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit1.java
TestJunit2.java JunitTestSuite.java TestRunner.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。
Inside testPrintMessage()
Robert
Inside testSalutationMessage()
Hi Robert
true
JUnit-テストを無視
テストケースの実行中にコードの準備が完全に整っていない場合があります。 その結果、テストケースは失敗します。 @ Ignore 注釈は、このシナリオで役立ちます。
- @Ignoreアノテーションが付けられたテストメソッドは実行されません。
- テストクラスに@Ignoreアノテーションが付けられている場合、そのテストメソッドは実行されません。
それでは、@ Ignoreの動作を見てみましょう。
クラスを作成する
C:\> JUNIT_WORKSPACEに MessageUtil.java などのテスト対象のJavaクラスを作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
//prints the message
public String printMessage(){
System.out.println(message);
return message;
}
//add "Hi!" to the message
public String salutationMessage(){
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
- TestJunit.javaなどのJavaテストクラスを作成します。
- テストメソッドtestPrintMessage()またはtestSalutationMessage()をテストクラスに追加します。
- メソッドtestPrintMessage()にAnnotaion @Ignoreを追加します。
C:\ JUNIT_WORKSPACEに TestJunit.java という名前のJavaクラスファイルを作成します。
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Ignore
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Robert";
assertEquals(message,messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
テストランナークラスを作成する
C:\> JUNIT_WORKSPACEに TestRunner.java という名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用して、MessageUtil、テストケース、およびテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java
次に、提供されたテストケースクラスで定義されているtestPrintMessage()テストケースを実行しないテストランナーを実行します。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。 testPrintMessage()テストケースはテストされていません。
Inside testSalutationMessage()
Hi!Robert
true
次に、C:\> JUNIT_WORKSPACEのTestJunitを更新して、すべてのテストケースを無視します。 クラスレベルで@Ignoreを追加します。
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
@Ignore
public class TestJunit {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Robert";
assertEquals(message,messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
javacを使用してテストケースをコンパイルします。
C:\JUNIT_WORKSPACE>javac TestJunit.java
次のようにテストランナーを変更しないでください-
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
テストランナーを実行します。これは、提供されたテストケースクラスで定義されたテストケースを実行しません。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。 テストケースはテストされていません。
true
JUnit-時間テスト
JUnitは、タイムアウトの便利なオプションを提供します。 テストケースに指定されたミリ秒数よりも時間がかかる場合、JUnitは自動的に失敗としてマークします。 Timeout パラメーターは@Testアノテーションと一緒に使用されます。 アクションの@Test(timeout)を見てみましょう。
クラスを作成する
C:\> JUNIT_WORKSPACEに MessageUtil.java などのテスト対象のJavaクラスを作成します。
printMessage()メソッド内に無限のwhileループを追加します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
//prints the message
public void printMessage(){
System.out.println(message);
while(true);
}
//add "Hi!" to the message
public String salutationMessage(){
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
*TestJunit.java* などのJavaテストクラスを作成します。 testPrintMessage()テストケースに1000のタイムアウトを追加します。
C:\> JUNIT_WORKSPACEに TestJunit.java という名前のJavaクラスファイルを作成します。
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test(timeout = 1000)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
messageUtil.printMessage();
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
テストランナークラスを作成する
C:\> JUNIT_WORKSPACEに TestRunner.java という名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用して、MessageUtil、テストケース、およびテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。 testPrintMessage()テストケースは、ユニットテストが失敗したことをマークします。
Inside testPrintMessage()
Robert
Inside testSalutationMessage()
Hi!Robert
testPrintMessage(TestJunit): test timed out after 1000 milliseconds
false
JUnit-例外テスト
JUnitは、コードの例外処理をトレースするオプションを提供します。 コードが目的の例外をスローするかどうかをテストできます。 expected パラメーターは@Testアノテーションとともに使用されます。 アクションの@Test(expected)を見てみましょう。
クラスを作成する
C:\> JUNIT_WORKSPACEに MessageUtil.java などのテスト対象のJavaクラスを作成します。
printMessage()メソッド内にエラー条件を追加します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
//prints the message
public void printMessage(){
System.out.println(message);
int a = 0;
int b = 1/a;
}
//add "Hi!" to the message
public String salutationMessage(){
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
*TestJunit.java* というJavaテストクラスを作成します。 予期される例外ArithmeticExceptionをtestPrintMessage()テストケースに追加します。
C:\> JUNIT_WORKSPACEに TestJunit.java という名前のJavaクラスファイルを作成します。
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test(expected = ArithmeticException.class)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
messageUtil.printMessage();
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
テストランナークラスを作成する
C:\> JUNIT_WORKSPACEに TestRunner.java という名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用して、MessageUtil、テストケース、およびテストランナークラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。 testPrintMessage()テストケースが渡されます。
Inside testPrintMessage()
Robert
Inside testSalutationMessage()
Hi!Robert
true
JUnit-パラメーター化されたテスト
JUnit 4は、 parameterized tests と呼ばれる新しい機能を導入しました。 パラメーター化されたテストにより、開発者は異なる値を使用して同じテストを繰り返し実行できます。 パラメーター化されたテストを作成するには、5つの手順を実行する必要があります。
- @RunWith(Parameterized.class)でテストクラスに注釈を付けます。
- オブジェクトのコレクションを(配列として)テストデータセットとして返す@Parametersアノテーションが付けられたパブリック静的メソッドを作成します。
- テストデータの1つの「行」に相当するものを受け取るパブリックコンストラクターを作成します。
- テストデータの「列」ごとにインスタンス変数を作成します。
- インスタンス変数をテストデータのソースとして使用して、テストケースを作成します。
テストケースは、データの行ごとに1回呼び出されます。 実行中のパラメータ化されたテストを見てみましょう。
クラスを作成する
C:\> JUNIT_WORKSPACEに PrimeNumberChecker.java などのテスト対象のJavaクラスを作成します。
public class PrimeNumberChecker {
public Boolean validate(final Integer primeNumber) {
for (int i = 2; i < (primeNumber/2); i++) {
if (primeNumber % i == 0) {
return false;
}
}
return true;
}
}
パラメーター化されたテストケースクラスの作成
*PrimeNumberCheckerTest.java* などのJavaテストクラスを作成します。 C:\> JUNIT_WORKSPACEに *PrimeNumberCheckerTest.java* という名前のJavaクラスファイルを作成します。
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.Before;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {
private Integer inputNumber;
private Boolean expectedResult;
private PrimeNumberChecker primeNumberChecker;
@Before
public void initialize() {
primeNumberChecker = new PrimeNumberChecker();
}
//Each parameter should be placed as an argument here
//Every time runner triggers, it will pass the arguments
//from parameters we defined in primeNumbers() method
public PrimeNumberCheckerTest(Integer inputNumber, Boolean expectedResult) {
this.inputNumber = inputNumber;
this.expectedResult = expectedResult;
}
@Parameterized.Parameters
public static Collection primeNumbers() {
return Arrays.asList(new Object[][] {
{ 2, true },
{ 6, false },
{ 19, true },
{ 22, false },
{ 23, true }
});
}
//This test will run 4 times since we have 5 parameters defined
@Test
public void testPrimeNumberChecker() {
System.out.println("Parameterized Number is : " + inputNumber);
assertEquals(expectedResult,
primeNumberChecker.validate(inputNumber));
}
}
テストランナークラスを作成する
C:\> JUNIT_WORKSPACEに TestRunner.java という名前のJavaクラスファイルを作成して、テストケースを実行します。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(PrimeNumberCheckerTest.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
javacを使用して、PrimeNumberChecker、PrimeNumberCheckerTestおよびTest Runnerクラスをコンパイルします。
C:\JUNIT_WORKSPACE>javac PrimeNumberChecker.java PrimeNumberCheckerTest.java
TestRunner.java
テストランナーを実行します。これにより、提供されたテストケースクラスで定義されたテストケースが実行されます。
C:\JUNIT_WORKSPACE>java TestRunner
出力を確認します。
Parameterized Number is : 2
Parameterized Number is : 6
Parameterized Number is : 19
Parameterized Number is : 22
Parameterized Number is : 23
true
JUnit-ANTを使用したプラグ
ANTを使用してJUnitを実行する方法を示す例があります。 以下の手順に従ってください。
ステップ1:Apache Antをダウンロードする
作業しているオペレーティングシステムに基づいてhttp://ant.apache.org/bindownload.cgi[Apache Ant]をダウンロードします。
OS | Archive Name |
---|---|
Windows | apache-ant-1.8.4-bin.zip |
Linux | apache-ant-1.8.4-bin.tar.gz |
Mac | apache-ant-1.8.4-bin.tar.gz |
ステップ2:Ant環境を設定する
*ANT_HOME* 環境変数を設定して、マシン上のANTライブラリが格納されているベースディレクトリの場所を指定します。 Antライブラリーがフォルダーapache-ant-1.8.4に保管されていると仮定します。
Sr.No. | OS & Description |
---|---|
1 |
Windows 環境変数ANT_HOMEをC:\ Program Files \ Apache Software Foundation \ apache-ant-1.8.4に設定します |
2 |
Linux export ANT_HOME =/usr/local/apache-ant-1.8.4 |
3 |
Mac export ANT_HOME =/Library/apache-ant-1.8.4 |
Antコンパイラの場所を次のようにシステムパスに追加します-
OS | Output |
---|---|
Windows | Append the string %ANT_HOME\bin *at the end of the system variable, Path*. |
Linux | export PATH = $PATH:$ANT_HOME/bin/ |
Mac | not required |
ステップ3:JUnitアーカイブをダウンロードする
オペレーティングシステムに合ったJUnitアーカイブをダウンロードします。
OS | Archive Name |
---|---|
Windows | junit4.10.jar |
Linux | junit4.10.jar |
Mac | junit4.10.jar |
ステップ4:プロジェクト構造を作成する
- C:\> JUNIT_WORKSPACEに TestJunitWithAnt フォルダーを作成します。
- C:\> JUNIT_WORKSPACE> TestJunitWithAntに src フォルダーを作成します。
- C:\> JUNIT_WORKSPACE> TestJunitWithAntに test フォルダーを作成します。
- C:\> JUNIT_WORKSPACE> TestJunitWithAntに lib フォルダーを作成します。
- C:\> JUNIT_WORKSPACE> TestJunitWithAnt> srcfolderに MessageUtil クラスを作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
//prints the message
public String printMessage(){
System.out.println(message);
return message;
}
//add "Hi!" to the message
public String salutationMessage(){
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
フォルダーC:\> JUNIT_WORKSPACE> TestJunitWithAnt> srcに TestMessageUtil クラスを作成します。
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestMessageUtil {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
assertEquals(message,messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
junit-4.10.jarをフォルダーC:\> JUNIT_WORKSPACE> TestJunitWithAnt> libにコピーします。
ANT Build.xmlを作成する
Antで <junit> タスクを使用して、JUnitテストケースを実行します。
<project name = "JunitTest" default = "test" basedir = ".">
<property name = "testdir" location = "test"/>
<property name = "srcdir" location = "src"/>
<property name = "full-compile" value = "true"/>
<path id = "classpath.base"/>
<path id = "classpath.test">
<pathelement location = "lib/junit-4.10.jar"/>
<pathelement location = "${testdir}"/>
<pathelement location = "${srcdir}"/>
<path refid = "classpath.base"/>
</path>
<target name = "clean" >
<delete verbose = "${full-compile}">
<fileset dir = "${testdir}" includes = "**/*.class"/>
</delete>
</target>
<target name = "compile" depends = "clean">
<javac srcdir = "${srcdir}" destdir = "${testdir}"
verbose = "${full-compile}">
<classpath refid = "classpath.test"/>
</javac>
</target>
<target name = "test" depends = "compile">
<junit>
<classpath refid = "classpath.test"/>
<formatter type = "brief" usefile = "false"/>
<test name = "TestMessageUtil"/>
</junit>
</target>
</project>
次のAntコマンドを実行します。
C:\JUNIT_WORKSPACE\TestJunitWithAnt>ant
出力を確認します。
Buildfile: C:\JUNIT_WORKSPACE\TestJunitWithAnt\build.xml
clean:
compile:
[javac] Compiling 2 source files to C:\JUNIT_WORKSPACE\TestJunitWithAnt\test
[javac] [parsing started C:\JUNIT_WORKSPACE\TestJunitWithAnt\src\
MessageUtil.java]
[javac] [parsing completed 18ms]
[javac] [parsing started C:\JUNIT_WORKSPACE\TestJunitWithAnt\src\
TestMessageUtil.java]
[javac] [parsing completed 2ms]
[javac] [search path for source files: C:\JUNIT_WORKSPACE\
TestJunitWithAnt\src]
[javac] [loading java\lang\Object.class(java\lang:Object.class)]
[javac] [loading java\lang\String.class(java\lang:String.class)]
[javac] [loading org\junit\Test.class(org\junit:Test.class)]
[javac] [loading org\junit\Ignore.class(org\junit:Ignore.class)]
[javac] [loading org\junit\Assert.class(org\junit:Assert.class)]
[javac] [loading java\lang\annotation\Retention.class
(java\lang\annotation:Retention.class)]
[javac] [loading java\lang\annotation\RetentionPolicy.class
(java\lang\annotation:RetentionPolicy.class)]
[javac] [loading java\lang\annotation\Target.class
(java\lang\annotation:Target.class)]
[javac] [loading java\lang\annotation\ElementType.class
(java\lang\annotation:ElementType.class)]
[javac] [loading java\lang\annotation\Annotation.class
(java\lang\annotation:Annotation.class)]
[javac] [checking MessageUtil]
[javac] [loading java\lang\System.class(java\lang:System.class)]
[javac] [loading java\io\PrintStream.class(java\io:PrintStream.class)]
[javac] [loading java\io\FilterOutputStream.class
(java\io:FilterOutputStream.class)]
[javac] [loading java\io\OutputStream.class(java\io:OutputStream.class)]
[javac] [loading java\lang\StringBuilder.class
(java\lang:StringBuilder.class)]
[javac] [loading java\lang\AbstractStringBuilder.class
(java\lang:AbstractStringBuilder.class)]
[javac] [loading java\lang\CharSequence.class(java\lang:CharSequence.class)]
[javac] [loading java\io\Serializable.class(java\io:Serializable.class)]
[javac] [loading java\lang\Comparable.class(java\lang:Comparable.class)]
[javac] [loading java\lang\StringBuffer.class(java\lang:StringBuffer.class)]
[javac] [wrote C:\JUNIT_WORKSPACE\TestJunitWithAnt\test\MessageUtil.class]
[javac] [checking TestMessageUtil]
[javac] [wrote C:\JUNIT_WORKSPACE\TestJunitWithAnt\test\TestMessageUtil.class]
[javac] [total 281ms]
test:
[junit] Testsuite: TestMessageUtil
[junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.008 sec
[junit]
[junit] ------------- Standard Output ---------------
[junit] Inside testPrintMessage()
[junit] Robert
[junit] Inside testSalutationMessage()
[junit] Hi!Robert
[junit] ------------- ---------------- ---------------
BUILD SUCCESSFUL
Total time: 0 seconds
JUnit-Eclipseでプラグイン
EclipseでJUnitを設定するには、以下の手順に従います。
ステップ1:JUnitアーカイブをダウンロードする
システム上のオペレーティングシステムに基づいてJUnit jarをダウンロードします。
OS | Archive Name |
---|---|
Windows | junit4.10.jar |
Linux | junit4.10.jar |
Mac | junit4.10.jar |
上記のJARファイルをフォルダーC:\> JUnitにコピーしたと仮定します。
ステップ2:Eclipse環境を設定する
Eclipseを開き、プロジェクトを右クリックしてプロパティ>ビルドパス>ビルドパスの構成をクリックし、[外部Jarの追加]ボタンを使用してライブラリにjunit-4.10.jarを追加します。
EclipseにはJUnitプラグインが組み込まれていると想定しています。 C:\> eclipse \ pluginsディレクトリにない場合は、 JUnit Plugin からダウンロードできます。 ダウンロードしたzipファイルをEclipseのプラグインフォルダーに解凍します。 最後にEclipseを再起動します。
これで、EclipseでJUnitテストケースを開発する準備が整いました。
ステップ3:EclipseでJUnitのインストールを確認する
Eclipseの任意の場所でプロジェクト TestJunit を作成します。 次に、プロジェクトでテストするクラス MessageUtil を作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
//prints the message
public String printMessage(){
System.out.println(message);
return message;
}
}
プロジェクトにテストクラス TestJunit を作成します。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
assertEquals(message,messageUtil.printMessage());
}
}
以下は、プロジェクト構造でなければなりません-
最後に、プログラムを右クリックしてJUnitとして実行し、プログラムの出力を確認します。
結果を確認します。
JUnit-拡張機能
以下は、JUnit拡張機能です-
- カクタス
- JWebUnit
- XMLUnit
- モックオブジェクト
カクタス
Cactusは、サーバー側のJavaコード(サーブレット、EJB、タグライブラリ、フィルター)を単体テストするためのシンプルなテストフレームワークです。 Cactusの目的は、サーバー側コードのテストを記述するコストを削減することです。 JUnitを使用して拡張します。 Cactusは、コンテナ内でテストを実行するコンテナ内戦略を実装しています。
サボテン生態系はいくつかのコンポーネントで構成されています-
- Cactus Framework はCactusの中心です。 Cactusテストを記述するためのAPIを提供するのはエンジンです。
- Cactus Integration Modules は、Cactus Framework(Antスクリプト、Eclipseプラグイン、Mavenプラグイン)の簡単な使用方法を提供するフロントエンドおよびフレームワークです。
次のコードは、Cactusの使用方法を示しています。
import org.apache.cactus.*;
import junit.framework.*;
public class TestSampleServlet extends ServletTestCase {
@Test
public void testServlet() {
//Initialize class to test
SampleServlet servlet = new SampleServlet();
//Set a variable in session as the doSomething()
//method that we are testing
session.setAttribute("name", "value");
//Call the method to test, passing an
//HttpServletRequest object (for example)
String result = servlet.doSomething(request);
//Perform verification that test was successful
assertEquals("something", result);
assertEquals("otherValue", session.getAttribute("otherName"));
}
}
JWebUnit
JWebUnitは、Webアプリケーション用のJavaベースのテストフレームワークです。 HtmlUnitやSeleniumなどの既存のテストフレームワークを、統合されたシンプルなテストインターフェイスでラップして、Webアプリケーションの正確性をテストします。
JWebUnitは、一連のアサーションと組み合わせてWebアプリケーションをナビゲートし、アプリケーションの正確性を検証するための高レベルJava APIを提供します。 これには、リンクを介したナビゲーション、フォームの入力と送信、表の内容の検証、およびその他の典型的なビジネスWebアプリケーション機能が含まれます。
単純なナビゲーションメソッドとすぐに使用できるアサーションにより、JUnitまたはHtmlUnitのみを使用するよりも迅速なテスト作成が可能になります。 また、HtmlUnitからSelenium(近日提供予定)などの他のプラグインに切り替えたい場合は、テストを書き直す必要はありません。
これがサンプルコードです。
import junit.framework.TestCase;
import net.sourceforge.jwebunit.WebTester;
public class ExampleWebTestCase extends TestCase {
private WebTester tester;
public ExampleWebTestCase(String name) {
super(name);
tester = new WebTester();
}
//set base url
public void setUp() throws Exception {
getTestContext().setBaseUrl("http://myserver:8080/myapp");
}
//test base info
@Test
public void testInfoPage() {
beginAt("/infol");
}
}
XMLUnit
XMLUnitは、単一のJUnit拡張クラス、XMLTestCase、およびアサーションを可能にする一連のサポートクラスを提供します-
- 2つのXMLの違い(DiffおよびDetailedDiffクラス経由)。
- XMLの有効性(Validatorクラス経由)。
- XSLTを使用してXMLを変換した結果(Transformクラス経由)。
- XML上のXPath式の評価(XpathEngineインターフェースを実装するクラスを介して)。
- DOM Traversalによって(NodeTestクラスを介して)公開されるXMLの個々のノード。
比較したい2つのXMLがあり、それらが等しいことを断定するとします。 このような簡単なテストクラスを書くことができます-
import org.custommonkey.xmlunit.XMLTestCase;
public class MyXMLTestCase extends XMLTestCase {
//this test method compare two pieces of the XML
@Test
public void testForXMLEquality() throws Exception {
String myControlXML = "<msg><uuid>0x00435A8C</uuid></msg>";
String myTestXML = "<msg><localId>2376</localId></msg>";
assertXMLEqual("Comparing test xml to control xml", myControlXML, myTestXML);
}
}
モックオブジェクト
単体テストでは、モックオブジェクトは複雑で実際の(非モック)オブジェクトの動作をシミュレートできるため、実際のオブジェクトが単体テストに組み込むことが非現実的または不可能な場合に役立ちます。
モックオブジェクトでテストするための一般的なコーディングスタイルは次のとおりです-
- モックオブジェクトのインスタンスを作成します。
- モックオブジェクトに状態と期待値を設定します。
- パラメーターとしてモックオブジェクトを使用してドメインコードを呼び出します。
- モックオブジェクトの一貫性を確認します。
以下は、Jmockを使用したMockObjectの例です。
import org.jmock.Mockery;
import org.jmock.Expectations;
class PubTest extends TestCase {
Mockery context = new Mockery();
public void testSubReceivesMessage() {
//set up
final Sub sub = context.mock(Sub.class);
Pub pub = new Pub();
pub.add(sub);
final String message = "message";
//expectations
context.checking(new Expectations() {
oneOf (sub).receive(message);
});
//execute
pub.publish(message);
//verify
context.assertIsSatisfied();
}
}