JUnit 単体テスト アシスタント

単体テストは、ソフトウェアの品質を確保する上で、とても優れたテストです。
メソッド単位のテストで品質の低下やバグの再発を防止することができます。また、JUnitなどの広く使われているテスティングフレームワークを用いて効率的にテストコードを作成することができ、テストコード自体がエビデンスとなります。
Jtestの単体テストアシスタントでは、EclipseやIntelliJ IDEA上のJUnitを用いた単体テストを効率化するための機能が盛り込まれています。単体テストに慣れていない開発者でもすぐに単体テストを始めることができます。

単体テストの導入や運用の障壁

単体テスト(ユニットテストと呼ばれることもあります)は、プログラムを構成する比較的小さな単位(ユニット)が個々の機能を正しく果たしているかどうかを検証するテストです。通常、メソッドが単体テストの単位(ユニット)となります。 プログラムが全体として正しく動作しているかを検証する結合テストは、開発の比較的後の段階でQAチームなどによって行なわれることが多いのとは対照的に、単体テストは、コード作成時などの早い段階で開発者によって実施されることが多いのが特徴です。

Javaの開発では多くのプロジェクトでオープンソースのテスティングフレームワーク「JUnit」が使われています。テスティングフレームワークを使った単体テストのメリットは、テストコードを一度作成することで同じ条件のテストを繰り返し実行でき、結果の確認を自動で行えることです。

「品質をもっと上げたい」「開発⼯数を減らしたい」といった期待を持ち、多くの開発者は単体テストや単体テストの⾃動化に取り組みます。しかし実際に導⼊し、運⽤してみると、「予想以上に工数がかかっているのに、思ったほど効果がでない」または「運⽤しているが⾮常に苦労している、ちっとも楽にならない」といったことに陥りがちです。

単体テストの導入や運用において、障壁となるのは以下の点です。
  • 単体テストの導入により工数が増大する
    • 実装コストや学習コストがかかる
  • 単体テストのメンテナンスコストが増大した
    • テストコードが複雑になり追加実装が難しい、修正に時間がかかる
  • ソースコードカバレッジの罠にハマった
    • カバレッジ100%が求められるが達成にはかなりの手間がかかる
    • カバレッジ100%を達成してもバグが減らない
Jtestの単体テストアシスタントは、これらの障壁を取り除き、効率的な単体テストの導入や運用を支援します。

単体テストアシスタントによる支援

単体テストアシスタントでは、さまざまな単体テストの支援を行います。
Jtest 10.4.0からは、Springフレームワーク(Spring MVC、Spring Boot)がサポートされ、Springフレームワークを考慮したテストテンプレートの作成やモック化が行えるようになりました。

テンプレートの作成

JUnitのテストメソッドのテンプレートやアサーションの作成を支援し、複数の引数をテストする際にCSVファイルなどに記載されたテストデータを用いることができます。

モック化

テスト対象メソッドの呼び出しに必要なクラスオブジェクトをモックとして作成します。モック化したオブジェクトが必要とするクラスオブジェクトも「深いモック」によりモックを作成することができます。

カバレッジの計測

JUnitのカバレッジ計測だけではなく、テストでカバーされていないコードをJtestが検知し、カバレッジ計測率を向上させるためのヒントを提示します。

単体テストの追跡や監視

モックの利用を推奨するテストコードの実装やアサートの有無のチェックなど、単体テスト実行時の振る舞いを監視し、改善を促します。

未カバー行をカバーするテストテンプレート作成

 未カバー行(実行されなかった行)に対して、その行を実行するために必要なテストケースを自動生成したり、テストテンプレート作成に役立つヒントを提供します。

Spring単体テストテンプレートの作成

Springの単体テストに必要な定形コードやSpringの提供するモックを使った単体テストケーステンプレートを作成します。

以下をダウンロードいただけます。
  • Jtest体験版、チュートリアル、チュートリアル用プロジェクト
  • 単体テストコードを作成する際に、単体テストアシスタントを利用した場合と、していない場合の作業工数の比較資料

単体テストアシスタントの詳細

Jtestの単体テストアシスタントは、Eclipse および IntelliJ IDEAのプラグインとして動作します。Jtestのプラグインを開発環境(IDE)へ適用すると、すぐに単体テストアシスタントをお使いいただけます。

eclipseにJtestをプラグインし、単体テストアシスタントを利用

テンプレートの作成

テストテンプレートの作成

Jtestの単体テストアシスタントでは、メソッドやクラスの単位でJUnitのテストメソッドのテンプレートを作成します。また、テスト対象メソッドの呼び出しやパラメータの定義を自動的にテストメソッド内に記述しますので、開発者はパラメータやテストの期待値を記述するのみで単体テストを実施することができるようになります。

JUnitテストテンプレートの作成例

上記は、Simpleクラスのmapメソッドのテストを作成する例です。開発者はJtestが作成したJUnitテンプレート上のパラメータと期待値を設定するのみで単体テストを実行できます。

引数のパターンを複数指定したテストを行う際は、テストクラス・メソッドを作成するときにパラメータライズを選択することで、複数のパラメータをリストで指定できるようになります。また、この際にCSVファイルなどを指定して、複数の引数を指定することができます。

パラメータライズのJUnitテストテンプレートの作成例

アサーションの作成

Jtestは、テストの結果を判断するためのアサーションおよびテンプレートの作成を支援します。また、テスト対象クラスの状態が変わった場合にテスト対象クラスを検証するためのアサーションのテンプレートを作成することも可能です。テストの期待値を調べる必要はなく、現在の動作した結果をテストの期待値として設定することで、単体テストの作成を効率化します。

JUnitテストコードを実行した際の結果(result=-1)をテストの期待値として設定

モック化

単体テストを行ううえで、複雑で手間がかかるのは、主にテスト対象のユニットを分離する作業です。Jtestは、テスト対象メソッドの呼び出しに必要なクラスオブジェクトをMockitoやPowerMockを使って、依存関係をモック化します。これにより、例えばデータベースにアクセスするオブジェクトを含む単体テストを簡単に作成できるようになります。

技術資料として公開している単体テストにおける工数削減のデータでは、このモック機能が最も単体テストの工数削減に寄与したという結果が出ています。

Jtestによる依存するサービスやさらに依存するサービスのモック化

カバレッジの計測

単体テストアシスタントでは、テスト対象のメソッドに対して、一定以上のカバレッジが計測されていないコードを検出し、カバレッジを向上させるためのヒントを提示します。カバレッジ計測の目視でのテストの抜け漏れの確認だけではなく、追加すべきテストパターンを具体的に提示することで、効率的にカバレッジを向上させることができます。

計測したカバレッジ。コード行の表示の左に、テストで実行された行が緑、実行されなかった行が赤で表示されます。

カバレッジ計測の結果から、カバレッジを向上させるためのヒントを表示

単体テストの追跡や監視

JtestはJUnitの単体テスト実行時に、さまざまなデータを収集します。
処理の経路やテストメソッド内の変数の値、モックの呼び出し、例外の有無を監視することで、テストを実行した際の振る舞いを確認できるため、テストの実装スピードの向上やテストが正しく実行できていることを確認するために役に立ちます。

Eclipse上のテストの処理の流れと実行時の値の監視

テスト実行時にモック化が可能な箇所を検知

未カバー行をカバーずるテストテンプレート作成

単体テストの実行時に処理が実施されなかった未カバー行(実施されなかった行)に対して、テスト対象のソースコードを分析し、その行を実行するために必要なテストケースを自動生成したり、自動生成できなかった場合、カバーするためのヒントをコメントで作成することが可能です。

単体テストでカバーされなかった行のテストケースの作成例

Spring単体テストテンプレートの作成

Springフレームワークはアプリケーションの構築だけでなく、単体テストのためのフレームワークやモックオブジェクトも提供しているため、フレームワークの仕組みに沿った単体テストの実施が可能です。
しかし、テストケースを適切にセットアップするには単純なテストでも多くの手作業による決まりきったコーディングが必要です。

テスト対象となるソースコードの例

たとえば、このソースコードであれば以下のような手順をコーディングする必要があります。
  • テスト対象のControllerとControllerが依存するTodoServiceを使用してSpringコンテナーを設定する。
  • findAllハンドラーメソッドに有効なリクエストを送信する。
  • 戻り値 ”todo/list”などのレスポンスを検証する。
JtestのJtest単体テストアシスタントを使えばこれらの面倒な手続きを自動で作成できるため、手作業のコーディングを減らし、テストケースの作り込みに時間を割くことができます。

Jtest単体テストアシスタントを使ったSpring単体テストテンプレートの作成例

さらに、MockMvcの監視も行うため、テスト実行時にモック化可能な箇所を検知しレポートします。そこからクリックするだけでモックテンプレートの作成が可能です。これによって、Springの単体テストやモックに慣れない開発者の学習コストを削減し、導入の敷居を下げます。もちろん、Springの単体テストでもJtest単体テストアシスタントの機能であるパラメータライズのテンプレート作成や、単体テストの追跡や監視といった機能も利用できます。

単体テストアシスタントによるモック化可能な箇所のレポートと作成したモックテンプレート

単体テストアシスタントの動画

単体テストアシスタントの操作動画です。
※ 動画中のJtestは10.3.1となります。
※ 全画面および最高画質での視聴を推奨します。また、日本語の字幕にて解説を入れております。字幕ONにてご視聴ください。


テストテンプレートの作成



アサーションの作成



モックの作成


Java対応静的解析・単体テストツール Jtestに
関するお問い合わせ

  • テクマトリックス株式会社
    東京本社

    ソフトウェアエンジニアリング事業部

    03-4405-7853

メールでのお問い合わせ
parasoft-info@techmatrix.co.jp

CONTACT

製品についてやテクマトリックスについてなど、
こちらよりお気軽にお問い合わせいただけます。