JUnitはユニットテストが実行できるフレームワークの1つです。しかし、Java初学者や小規模開発をメインとしてきたエンジニアの方は、JUnitの本格的な利用経験がない場合もあります。
そこで本記事は、JUnitで環境構築してユニットテストまで行うための基礎知識からテストを実行するまでの手順、メソッドや拡張機能を利用したテストの効率化方法などを解説します。
目次
1.JUnitとは
JUnitとは、Javaのプログラミング言語で使えるテストフレームワークのことです。Kotlinでも一部利用できますが、基本はJavaのテスト自動化などに使われます。
特に、名称の「Unit」にもある通り、ユニットテスト(単体テスト)を作るためのライブラリがあり、それをテストコードで実行することが可能です。そのため、テストを効率的に実施できるフレームワークの位置付けとなります。
もともとJavaとの関係が長いJUnitは1997年から登場して黎明期を支え、いまではJavaの標準的なテストフレームワークとして周知されています。ちなみに、現在のバージョンは「JUnit 5.12.2」で、2024年4月にリリースしたものが最新です。
テストフレームワークの意味・役割
数あるテスト方法の中でも、JUnitは大規模システム開発やチーム開発において上位の選択肢となります。理由は、ソフトウェアテストをアジャイル開発やチーム共有で統一的に実施する上で便利だからです。
例えば、大規模開発では複数の人の手で作られますから、提供されたコードが実際には信用できないこともあります。
コードが壊れている
デバッグ漏れのケース
入力パターンの試行回数が少ない
セキュリティに不備がある
また、テストの量や入力回数の増加・修正で繰り返しのテストなど、効率的なユニットテストを実施する場合もJUnitが不可欠です。
特にJavaでは型やnullのエラーが及ぼす影響は大きく、全体の確認・修正が発生するため、十分な例外処理の検証がされないコードもあります。それをテストが不十分な状態でリリースした場合は、その後の対応の必要性から企業に大きな損失をもたらします。
また、見えない部分にもデメリットはあります。特に保守でブラックボックス化した場合です。担当開発者以外の保守が難しくなるため、レガシー化したときにその後の大きなエラーにつながるなど、拡張性や保守性を考えても基本的に避けなければなりません。製品の品質を高めるためにも、規模が大きくなるほどユニットテストは実施すべきです。
EclipseやAndroid Studioでの必要性
Javaのシステム開発やWEBアプリケーションの開発、スマホアプリ(Androidアプリ)の開発をするための環境では、JUnitの必要性が高いことで知られています。具体的には、EclipseやAndroid StudioなどのIDE(統合開発環境)です。
どちらも標準的なユニットテストとして使われており、特にAndroid Studioではテスト実行の際に標準でJUnitの環境が使えるようになる仕様です。最初の新規プロジェクト作成時に簡単なテストコードが生成されることもあります。
2.JUnitの環境の確認と構築の手順
JUnitはJavaの標準的なテストフレームワークですが、IDEなどで使う場合、プラグインやライブラリなどがインストールされていないと使えません。そこで、実行環境の確認方法とインストール手順を解説します。
JUnitのインストール状況の確認
まずは、JUnitのインストール状況の確認です。環境によって確認方法が異なります。環境は大きく分けるとJava SEとIDEの2種類です。IDEの場合はツール・アプリごとにインストール状況を確認します。
Java SE
Java SEのコマンドライン開発では、Java SEに標準としてJUnitは付いておらず、インストールではなく、ビルドツールで依存関係の設定が基本となります。Mavenのようなビルドツールを使わない場合、JUnit 5のJARファイルを手動で入れて設定が必要です。
そのため、JUnitは基本的にコマンドでの手動テストではなく、IDEを使用します。Eclipseなら視覚的なエラーの確認も容易で、デバッグしやすいでしょう。
Eclipse(IDE)
Eclipseの場合は、環境構築時にJUnit4がインストールされているIDEです。古いプロジェクトを実行する場合、JUnit4が必要になる場合もあるため、EclipseではJUnit4が標準搭載となります。JUnit5を使いたい場合は、別途インストールが必要となります。
それから、すでにJUnit5をインストールしていた場合でも、過去の利用時期のバージョンによってはJUnitが最新版ではないこともあるから要確認です。そのため、JUnit5があっても、更新してバージョンを最新のものにする必要があります。
意図して・意図せずにかかわらず、手動でIDEからアンインストールする場合もあるため、IDEにJUnitか事前に含まれるかの確認は必須となります。
確認手順は、上のメニューの「ファイル(File)」から「新規(New)」、「その他(Other)」を選択し、「Java」のファイルディレクトリにある「JUnit」を探します。クリックして展開すると、「JUnit Test Case」が確認できます。
これでJUnit4がインストールされていることがわかります。ただし、このとき画面内にバージョン表示がないケースもあるため、JUnit5のインストール状況を知りたいときは、Eclipseのインストールファイルを確認して、「Plugin」の中に「org.junit.jupiter_〇〇」や「org.junit.platform_〇〇」のjarファイルを探します。これがあればJUnit5はすでにインストールされていると確認が可能です。
Android Studio(IDE)
Android Studioでは、プロジェクトを開いたときの構成にある「build.gradle.kts」(appモジュール)ファイルから確認する方法が簡単です。
具体的には、依存関係を記述する「dependencies {」の中に「androidTestImplementation」のtest関連の記述があり、そこにjunit4やJUnit5があれば、各バージョンがインストールされています。
関連記事
【2025年版】Javaの最新バージョン|確認方法やインストール方法を解説
3.EclipseでJUnitのインストール~テストコードの書き方までの流れ
システム構築・開発のユニットテストの場合、基本はEclipse(IDE)を使った方法がデフォルトです。以下に、JUnit5が入っていない場合のインストール方法からテスト作成の手順を紹介します。
JUnitのインストール方法
先に、EclipseでJUnitがない場合や標準のJUnit4ではなくJUnit5を使いたい場合は、先にインストールを済ませておきます。以下はその方法と手順です。
Eclipseの画面で、上部メニューバーから「ヘルプ(Help)」の「Eclipse Marketplace」を選択して画面を開きます。画面の検索窓に「JUnit」を入力して検索し、該当するJUnitの最新Pluginをインストールします。JUnit5が必要な場合は5のバージョンを探しましょう。
ちなみに、JUnit4とJUnit5は別物で、同じJUnitの名称がついていても設計や使用方法が異なります。そのため、互換性が一切なく、JUnit4でJUnit5を同じように使うことはできず、逆もまた然りです。混同しないように注意しましょう。
プロジェクトの作成
今回は、「JUnitSample」という名称でプロジェクトを立ち上げてユニットテストに必要なものを用意します。
そこでまずは、Eclipseを再起動して、上記のメニューから「ファイル(File)」、「新規(New)」と開き、「Javaプロジェクト(Java Project)」をクリックします。
作成用の遷移画面に、プロジェクト名「JUnitSample」と入れて「完了(Finish)」を押せば作成ウィザードは終了です。
JUnitライブラリを手動で追加
次に、JUnitのライブラリをプロジェクトから追加します。プロジェクトを右クリックして、一覧下の「プロパティ」をクリックします。
小さい画面の左にあるメニューバーから「Javaのビルドパス(Java Build Path)」を選択し、その上部バーの「ライブラリー(Libraries)」を選びます。
次に、その中の「クラスパス」を選択すると追加項目が表示されるため、その「ライブラリーの追加(Add Library)」をクリックすることです。画面が立ち上がると、ライブラリの中から「JUnit」のライブラリを選択し、「次へ」でJUnitのバージョン「JUnit5」を選んだ状態から「完了(Finish)」をクリックします。
JUnit4の場合はそれをバージョン選択し直すだけです。後は、「適用して閉じる」を押せば、ライブラリの準備は完了です。
テスト用のフォルダ・パス・パッケージを作成
今度は、ソースフォルダのsrcに「src/test/java」のディレクトリとなるようにフォルダを追加します。
プロジェクトを右クリックの後、「新規(New)」、「ソースフォルダ(Source Folder)」と順にクリックします。新規の横にすぐ表示されない場合は、「その他」を開いて、Javaの下層から探すことでも選択が可能です。
ソースフォルダ名に「src/test/java」を入力して、下層に「test」ができたらOKです。次に、「test」を右クリックして、新規、パッケージと選択し、名前に「com.example.test」を入力して完了します。これで、JUnitのtest用クラスの作成準備が整った形です。
「com.example.test」の下にクラスを追加していきます。新規からウィザードのJUnit を展開し、「JUnit テスト・ケース(JUnit Test Case)」を選択、クリックして「ClassTest」というクラス名の入力で作成する流れです。
このとき、JUnit5(実際の画面では「JUnit Jupyter」と記載のある項目)を選択した状態で完了させます。
テストクラスの環境確認用コードの作成
パッケージが完成したら、その直下にテストクラスを作成します。作成してファイルを開くと、基本のテンプレートはコードが未実装となっているため、そこにテスト用のコードを追加します。
package com.example.test;
import static org.junit.jupiter.api.Assertions.*;
void simpleTest() { int expected = 4; int actual = 2 + 2; assertEquals(expected, actual, "2 + 2 should equal 4"); } } |
上記は、ごく簡単なJUnitのテスト環境を確かめるコードです。「@Test」のアノテーションを使用し、「expected」と「actual」で結果の検証が行われます。expectedが「期待される結果」で、actualが出力されるコードの実行結果です。
ちなみに、アサーションメソッドは「assertEquals」を使用しています。これらのコードに必要な記述やメソッドについては後ほど解説します。
環境テストの実行
JUnitの環境テストの実行は、まずテストしたいプロジェクトの右クリックで「Javaのビルドパス(Java Build Path)」を開いて、「ソース」の上部タグ選択から「フォルダの追加」で追加した「test」にチェックを入れて完了、適用して閉じます。
その後、JUnitの実行でこのプログラムを起動します。実行が成功すると、緑の横バーが表示されます。これでJUnit5のテスト環境構築が成功です。
関連記事
Javaでファイルを出力!CSV出力や文字コード指定、ファイル書き込みとレポート作成のテクニック
4.JUnitのテストの実行で必要となる基礎知識
ここでは、実践的なJUnitのテストの実行に必要となる基礎知識について厳選し、テストの作成や実行で押さえるべきポイントを紹介します。
JUnitで使うアノテーションの種類
JUnitでは、アノテーションを使ってユニットテストすることが必須です。通常のクラスメソッドの実行とは異なり、アノテーションでテストを指示するため、ないとテストが実行されない仕組みです。
以下は、アノテーションの利用目的やその実行指示・タイミングについてです。
@Test:テストの実行の際に、通常のテストメソッドに使用
@BeforeEach:テスト直前に都度実行で@Testの前に1回ずつ実行
@AfterEach:テスト直後に都度実行で@Testの後に1回ずつ実行
@BeforeAll:テストクラスの全体初期化で最初のテストの実行スタート前に1回だけ実行
@AfterAll:テストクラス全体の完了処理で最後のテスト終了後に1回だけ実行される
@Disabled:テストを一時的に無効化で実行できなくする
@DisplayName:テスト名をラベル付けでテスト表示名として使用
例えば、基本となる「@Test」は、環境テストに使用した実行時にテストします。メソッドの前において、そのメソッドをテストするかどうかを含めて指示を出している形です。
アサーションメソッドとそのバリエーション
アサーションメソッドは、ユニットテストが想定される結果と実際の結果で、動作を検証するためのメソッドです。基本的には、expectedとactualの結果が同じであることを確認します。
例えば、assertEqualsが「等価性」、assertSameが「参照の同一性」を確認するメソッドです。等価性は値が等しいことを確認し、参照の同一性はインスタンスが同じ場所を参照しているかを調べるものです。
また、他にも確認内容として、対象のオブジェクト、条件、配列が同一か確かめるため、さまざまなアサーションメソッドが存在します。
以下は、アサーションメソッドと実行時に確認できる内容です。
assertEquals(expected, actual)…:expectedとactualが同じことを確認
assertNotEquals(expected, actual)…:expectedとactualが異なることを確認
assertSame(expected, actual)…:expectedとactualが同一のインスタンスかを確認
assertNotSame(expected, actual)…:expectedとactualが異なるインスタンスかを確認
assertTrue(condition)…:条件がtrueであることを確認
assertFalse(condition)…:条件がfalseであることを確認
assertNull(object) …:オブジェクトがnullであることを確認
assertNotNull(object)…:オブジェクトがnullでないことを確認
assertArrayEquals(expectedArray, actualArray)…:配列が同じ内容を持つことを確認
assertAll(executables)…:複数アサーションをまとめて実行し、全部成功することを確認
そのため、実践的なJUnitのテストでは、これらのアサーションメソッドを利用して、expectedとactualが同じことを確認したり、条件を確認したりします。
効果的なテストは何を指示するかで決まるため、アサーションメソッドとそれが確認する内容を押さえておくことが大事です。
関連記事
ウォーターフォール型開発とは?工程の詳細やアジャイル型、V字モデルの違いも解説
5.JUnitのテストケースを作成するコツ
テスト用コードの基礎知識を押さえたら、次にテストケース(テストの設計図)を作成するコツを解説します。
メソッドの命名規則
まず、メソッド作成時の命名規則は、「対象メソッド_条件_結果」で名称をつけることをおすすめします。例えば、以下のようなコードのメソッド名で確認しましょう。
public class ClassTest { @Test void add_TwoPositiveNumbers_ReturnsCorrectSum() {} @Test void add_TwoPositiveNumbers_ReturnsCorrectSum_WithAlternativeStyle() {} } |
1つ目に使われている「add_TwoPositiveNumbers_ReturnsCorrectSum」は、名前の構成を以下のように分解できます。
add(対象がadd()メソッド)
+ TwoPositiveNumbers(2つの正の数を引き渡す条件)
+ ReturnsCorrectSum(正しい合計が期待される結果)
「対象メソッド_条件_結果」を順番に並べたものとマッチしています。命名規則は守らなくても通常は動作しますが、デバッグや保守の観点から統一し、わかりやすい名前をつけることです。
ベストプラクティスでテストを進める
ユニットテストを基本としたJUnitでテストを行う際は、テストコードにおけるベストプラクティスの書き方が決まっています。
例えば、以下のようなベストプラクティスにするためのポイントは下記です。
テストはメソッド1つだけ(1機能だけ)を検証する
異なるテストとの関係を排除する(依存関係を取り除く)
テスト内容や結果がわかりやすいように命名や書く順番を決める
境界値や異常系の確認も考慮したテストにする
特に関係解消の具体的な方法として、ユニットテストにmockを使用することです。外部からの依存関係を容易に取り除くことが可能です。そして、必要なデータは前もって個々に揃えておきます。
例外処理
拡張機能を利用する場合では、パラメータ化や構造化のテスト、例外の処理などが挙げられます。特に例外処理はテストを必要とする理由の1つで、方法を知っておくことです。
以下に、拡張機能で例外処理のテストを実施する事例を紹介します。
まずは例外処理のテストすべき機能部分として、整えたメッセージを返すprintMessageのメソッドを入れたクラスとその検証テストです。
package com.example; public class MessagePrinter { public String printMessage(String message) { if (message == null || message.isEmpty()) { throw new IllegalArgumentException("メッセージが空です"); } return "メッセージ: " + message; }
MessagePrinter printer = new MessagePrinter(); System.out.println(printer.printMessage("こんにちは")); } } |
上記のコードをJUnit5のテストで自動的に例外処理をチェックすることができます。アノテーションは実行時のテストで「@Test」のみを使用したものです。
package com.example.test;
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*;
void printMessage_NullInput_ThrowsIllegalArgumentException() { MessagePrinter printer = new MessagePrinter(); Exception exception = assertThrows(IllegalArgumentException.class, () -> { printer.printMessage(null); }); assertEquals("メッセージが空です", exception.getMessage()); }
void printMessage_EmptyInput_ThrowsIllegalArgumentException() { MessagePrinter printer = new MessagePrinter(); Exception exception = assertThrows(IllegalArgumentException.class, () -> { printer.printMessage(""); }); assertEquals("メッセージが空です", exception.getMessage()); }
void printMessage_ValidInput_ReturnsFormattedMessage() { MessagePrinter printer = new MessagePrinter(); String result = printer.printMessage("こんにちは"); assertEquals("メッセージ: こんにちは", result); } } |
使用しているアサーションメソッドは、「assertThrows」と「assertEquals」です。特に「assertThrows」では、nullや空文字の場合に、「IllegalArgumentException」がないか確認できます。つまり、例外処理のテスト確認ができるアサーションメソッドです。
返される結果も同じかどうか「assertEquals」で調べられるテストコードを作成しています。
拡張機能の利用
先の例外処理を踏まえて、拡張機能を使用したテストもできます。下記では、「@TestInstance」のアノテーション(テストインスタンスのライフサイクルを制御するもので、クラスごとに1つのインスタンスを使いまわすなどの設定が可能)や「Mockito」などの拡張機能を加え、テストコードで効率を高めた検証ができます。
ちなみに、Mockitoのテストは実行にMavenやGradleでビルド管理ツールの利用(もしくは変換)や更新作業が必要です。そのままJavaコードではエラーが出るため、MavenやGradleの構成などに合わせたコード配置と操作が必要となります。
手順は簡単で、例えばEclipseのMavenの場合、Mavenプロジェクトを作成して、「maven-archetype-quickstart」を選択(最新のチェックを外さないとバージョン1.0とする場合は出てこない場合あり)で「Group Id」と「Artifact Id」を入れて作成します。後は、拡張機能を入れたテストコードを作成して実行するだけです。
ただし、Mockitoの機能やMockのテストコード作成は、外部クラスに依存しない場合に意味が薄くなります。実践では、Web APIやデータベースで独立したテストをしたいときに使いましょう。
5.JUnitのテストでよくある質問
ここでは、JUnitのテストを実施する際によくある質問に回答します。
JUnitでやりがちな初歩的ミスは?
JUnitは大規模開発やチーム開発で初めて使うというエンジニアも少なくないため、入社してまだ経験の浅い方や個人の方は手慣れておらず、初歩的なミスをすることがあります。
例えば、アノテーションを入れていない、パスや依存関係を正しく追加していない、expectedとactualの値の順番が逆、などです。これらを間違えると、テストコードを実行できなかったり、正しいテストができなかったりします。
また、JUnit4とJUnit5ではテスト時のパッケージの変化や依存関係に不備が生じやすいため、混同すると実行不可や正しい結果が得られません。
JUnitのテストにおけるエラーメッセージへの対処は?
JUnitのテストでは、コンパイル時にさまざまなエラーメッセージが考えられます。代表的なのは、先にも挙げた依存関係やパス、バージョンの不合致などです。
バージョンエラーなら「java.lang.NoSuchMethodError」が出ますし、依存関係が足りなければ「NoClassDefFoundError」、クラスパスのトラブルは「The import org.junit cannot be resolved」のエラーメッセージが発生します。
対処方法としては、依存関係ならpom.xmlなどの記述確認、クラスならビルドパスの編集、バージョンならバージョンの再確認と依存関係の調整・統一などが有効です。
JUnitのカバレッジ分析?
JUnitのテストでは、「カバレッジ」という項目があります。カバレッジとはテストがカバーしている網羅率の分析を指し、テストの全体像やテスト確認の範囲を把握しやすくするものです。
場合によっては境界値や異常系のテストを追加して、テストの網羅性と結果の保証を高めることができます。カバレッジが不十分な場合、そのコードはテストをしていても信頼できないものとなるのです。
関連記事
Javaプログラミング能力認定試験とは?詳細や難易度、対策方法について解説
6.まとめ
今回は、JUnitのフレームワークで利用できるユニットテストについて解説しました。JUnitは、IDEではJUnit4を標準とし、最新のJUnit5のバージョンはインストールされていないことがあります。環境構築時はEclipseなどで別途、JUnit5をインストールしてライブラリなどを用意することが必要です。
また、JUnitでは、通常のコード作成にはないコード設計やルール、アサーションメソッドの利用、拡張機能などがあり、環境構築や使い方の基本を押さえておくことが大事です。
この記事で紹介したテストコード設計のポイントや問題・エラーへの対処方法などを参考に、JUnitのテストを活用しましょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。
自身に最適なフリーランスエージェントを探したい方はこちらよりご確認いただけます。