JUnitを用いた単体テストの基礎まとめ
開発において、テストは品質を保つための重要な工程です。
本記事では、Java、MavenプロジェクトでJUnitを用いた単体テストの基礎を整理します。
初心者向けの内容として概要をつかむことを目的としていますので、詳細な書き方に関してはほかの資料も併せてご確認ください。
なぜテストが必要なのか
テストの目的は単なるバグ発見だけではありません。
一度テストコードを作成しておけば、コード変更後も何度でも自動で検証できますので保守性が上がります。
また人力で毎回動作確認をする必要がなくなり、開発効率が向上します。
また、既存機能を壊していないことを確認する「回帰テスト」にも有効です。
単体テストとは
単体テストは、プログラムを構成する部品が正しく動作するかを確認するテストです。
最小単位である、メソッド・クラスなど、部品単位で品質を担保することで、システム全体の不具合を未然に防ぎます。
単体でのテストをおろそかにして、部品が壊れていることに気が付かなければ、全体の動きに影響が出てきます。
テスト設計の基本パターン
初心者がまず押さえるべき観点は次の3つです。
• 正常系:想定どおりの入力値を与えた場合
• 異常系:不正な値や例外が発生する入力の場合
• 境界値:0、最大値、最小値などの境界付近の値
加えて、「例外が正しく投げられるか」「副作用がないか」なども確認対象になります。
大まかな流れ
junitをプロジェクトに追加→本番コードを書く→テストコードを書く→コマンドラインからテストを実行→失敗していればコードを修正
〇必要な準備
Java環境でテストを行うために、必要な主な要素は以下です。
・JDK(Java実行環境)
・本番コード
・テストコード
・テストフレームワーク
・ビルド・依存管理ツール
ここでは太文字の項目について触れていくのと、テストフレームワークにJUnit、ビルドツールにはApache Mavenを使用します。
〇JUnitとは
JUnitはJava向けの代表的なテストフレームワークです。
テストの実行、結果の集計、検証などを簡潔に記述してくれます。
〇Mavenでの設定方法
Mavenプロジェクトでは、pom.xmlに依存関係を記述することで自動的にライブラリを取得してくれます。
<!-- JUnitをテスト用依存として追加 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.13.4</version>
<scope>test</scope>
</dependency>
$\color{Gray}{\small \textsf{Spring Boot などのフレームワークを使用している場合は、spring-boot-starter-testというJunitを含んだパッケージを勝手にpomに書いておいてくれるので、個別に書かなくていい場合もあります。}}$
テストコードは src/test/java 配下に作成します。
// 半角スペースを除外して文字数をカウントできることを確認
@Test//正常系テスト
void testCountNonWhitespaceChars_normal() {
String text = "あいう えお";
int result = controller.countNonWhitespaceChars(text);
assertEquals(5, result);
//assertEquals…期待した値と実際の値が正しいか確認するメソッド。5が出力されるかテスト
}
実行はターミナルで以下のコマンドを入力します。
mvn test
また上記のコードの5を1に書き換えたりしてみると、

$\color{Gray}{\small \textsf{>1の出力を期待したが、結果は5だった}}$
BUILD FAILURE がターミナルに表示されます。
〇カバレッジとJaCoCo
補足的な内容として、カバレッジについても説明します。
コードのどれだけがテストによって実行されたかを示す指標を「カバレッジ」といいます。
一般的にこの指標が高いほど良いとされますが、数値だけを追うのではなく、重要なロジックがしっかりテストされているかが重要です。
カバレッジ計測にはJaCoCoを利用できます。Mavenではプラグインとしてpom.xmlに追加します。
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
</plugin>
</plugins>
</build>
mvn test実行後、target/site/jacocoに
こんな感じのindex.htmlでレポートが出力され、視覚的に確認できます。
html内リンク先に飛んで、テスト未実行箇所があれば赤色でマークしてくれるので、必要に応じてテストケースを追加しカバーしていきましょう。
〇まとめ
単体テストは、品質保証と保守性向上のための仕組みです。
テストを書くこと自体が目的ではなく、「将来の変更に耐えられるコードにする」ことが大事です。
まずは正常系・異常系・境界値の3点を意識し、小さなクラスからテストを書く習慣をつけることが重要です。MavenとJUnitを活用してテストを実施し、より堅牢なアプリケーション開発につなげましょう。
参考
Mavenを使ったプロジェクトへのJUnitの導入
(https://zenn.dev/yu_tanana2390/scraps/bfde4386b73f14)
JaCoCoを使ったJavaテストカバレッジの完全ガイド(https://ittrip.xyz/java/java-jacoco-test-coverage)
著者 N・W(株式会社ウィズツーワン)

