SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

早期に問題を発見、品質向上に貢献するJava対応静的解析・単体テストツール「Jtest」(AD)

JUnitの単体テストを30秒で作成! 工数削減への近道は「Jtest」を使った単体テストの高速化

  • このエントリーをはてなブックマークに追加

 単体テストは実装中や実装直後など開発の早い工程でバグを発見でき、手戻りが少なく費用対効果の高いテストとされています。そのため、多くのシステム開発現場で導入が進んでいます。Java開発における単体テストの自動化フレームワークとしては「JUnit」が有名ですが、膨大なテストコードを書いたり、デバッグに多くの時間を費やしたりするケースも多々あります。せっかく費用対効果の高いテストを自動化したとしても、これでは十分なメリットを享受できたとはいえません。そこで、本記事ではJUnitを使った単体テストを効率よく行うための手法を解説し、さらに、テストツール「Jtest」の単体テストアシスタント(Unit Test Assistant)を活用して、30秒で単体テストの実装を行う方法や、テスト失敗の原因をひと目で確認する方法を紹介します。

  • このエントリーをはてなブックマークに追加

関連記事

さまざまな現場で導入される単体テスト

 昨今のシステム開発では、Webやデスクトップだけではなく、モバイル、クラウドといったプラットフォームも増加し、開発のスピードが求められています。もちろん、システムが高品質であることは大前提です。それに応えるため、開発現場ではツールを使ったビルドやテストの自動化も当たり前に行われており、その中でも特に単体テストの導入が広がってきています。以前は金融などのクリティカルな分野や、技術力の高い一部のチームなどを中心に実施されていましたが、現在ではさまざまな現場で単体テストが導入されつつあります。

単体テストの定義と目的

 単体テストは実装中や実装直後など開発の早い段階で、機能が仕様通りに実装されているかを確認するために実施されます。結合テストやGUIテストなど、開発の後工程で行われるテストに比べて早い段階でバグをつぶすことができるため、手戻りが少なく費用対効果(ROI)の高いテストとされています。

単体テストはROIの高いテスト
単体テストはROIの高いテスト

 ここでいう単体テストとは、テスティングフレームワークを使ったテストプログラムで、メソッドなどの小さな単位で行うテストのことです。Java開発では多くのプロジェクトでオープンソースの「JUnit」が使われています。まれに、Webブラウザからひとつの画面を実行するテストや、呼び出しプログラムを作成し、デバッグ実行で値を変えながら実施するテストを単体テストと呼んでいる場合もありますが、このようなテストは繰り返し実行しづらい、網羅的なテストが難しいなどのデメリットがあります。一方で、JUnitを使った単体テストには以下のメリットがあります。

  • 小さな単位でテストを行うため、網羅的なテストができる
  • テストプログラムのため、実行から結果の確認までを自動化できる
  • 同じコードであれば、いつでも、誰が実行しても同じ結果を得ることができる

単体テストを行う上での課題

 単体テストを行う上で必ずといってよいほど課題となるのが「工数がかかる」ことではないでしょうか。JUnitを使った単体テストは、テストコードを書く必要があり、テスト対象と同じくらい、またはそれ以上のコード量を書かなくてはいけません。また、テストもプログラムなので、意図した通りにテストが動くかを確認するためにはデバッグが不可欠です。網羅的なテストを行おうとすると、実装にさらに多くの工数が必要です。単体テストに慣れていない新人や新しいメンバーがプロジェクトに参画した場合は、まず単体テストの実装に慣れなくてはならず、教育を行う必要があるかもしれません。

対象を絞り込み、少ない工数で効率よく単体テストを実施

 では、少ない工数で成果を得るためにはどうすればいいのでしょうか?

 その答えのひとつが「テスト対象を絞ってしまう」ことです。単体テストに取り組む際に、目標をカバレッジ100%に設定したり、指針として、すべてのメソッドをテストしようとしたりすることがよくあります。しかし、その実装には多くの時間がかかり、テストの実装が難しいメソッドに多くの時間を割いてしまう懸念もあります。それよりも、重要な部分に絞ってテストを行うことで、なるべく少ない工数で大きな効果を得ることができるのです。

 テスト対象を絞り込む例として、以下の基準が考えられます。

テストが必須

  • ビジネスロジック(MVCのModel部分)
  • 新規コード、追加、修正コード(保守開発の場合)

テストを検討

  • 以下いずれかに当てはまるコード
    • 複雑なコード、大きなコード
    • 多くのプログラムから参照されるコード
    • 変更が頻繁にあるコード

テストから除外

  • 動かしてテストしたほうが効率的にテストできる部分
    • 画面表示部やGUIと密接に関わっている箇所など

 「テストから除外」としたテストがやりづらい部分については、ブラウザからアプリケーションを動かしてテストをするといった方法でカバーするのもひとつの方法です。ブラウザから行うテストのデメリットも冒頭で挙げましたが、JUnitでやりづらい、例えば画面周りなどのテストを試みて多大な時間をかけるのであれば、別の方法を検討したほうが効率がいい場合もあります。

 また「これから単体テストの実施を徹底したい」「単体テスト未経験者を育てていきたい」といった場合には、さらに対象を絞ってテストをしやすい箇所から経験を積んでいくことがいいでしょう。例えば、なるべく依存関係の少ないユーティリティー系のクラスやPOJOなどをテスト対象として、テストの書き方、進め方に慣れてから徐々にテスト範囲を広げていく方法も有効です。

さらに効率化を図るために

 ここまで、テスト対象を絞って効率的にテストを行う方法を説明しましたが、それでもコードを書く時間やデバッグの時間は必要となります。それを効率化するのが「Jtest」の単体テストアシスタント(Unit Test Assistant)です。

Jtestの無料体験版を入手!

 Jtestの無料体験版を配布しております。以下のリンクからダウンロード可能です。

関連記事

わずか30秒で単体テストを実装

 単体テストを行うためには、テストコードを書き、入力値を設定し、期待した動作をしているか検証する必要があります。通常は一からテストコードを書いていくか、またはIDEの機能を使ってテストコードが空のテンプレートを作成後、テストコードを実装しなくてはいけません。Jtestを使うと、簡単なテストであればわずか30秒で実行可能なテストコードの作成が可能です。

 次の3ステップを実行するだけでテンプレートに沿った単体テストコードが実装できてしまいます。

[1]テストケーステンプレートを作成

 クリックひとつでテストケースのテンプレートを作成できます。テストケースのスケルトンだけではなく、値の設定が必要なパラメータの定義や空のアサートも作成してくれます。

[2]テスト対象メソッドに渡すパラメータを設定

 テスト対象メソッドに渡すパラメータを手動でテストコード内に記述します。

テストケーステンプレートの作成とパラメータの設定
テストケーステンプレートの作成とパラメータの設定

[3]アサートのテンプレート作成

 テスト結果(期待値)を現在の動作に合わせる場合は、テストを実行し、期待値が正しいことを確認後、クリックひとつでアサートを作成します。

アサートの作成
アサートの作成

 このように、クリック操作と簡単なテストケースの修正でテストを実装することができました。テストを実施する上で必要となる作業について、大幅に軽減されたことがお分かりいただけたと思います。時間にすると、わずか30秒でテストケースの実装が可能となります。テストケースの入力値と期待値はあらかじめユーザーが用意する必要があるものの、Jtestはテストケースの作成を大きく効率化してくれます。

Jtestを使った単体テスト

 Jtestを使った[1]~[3]のステップを動画で体感できます。

 動画中で使用しているサンプルコードはこちらからダウンロードできます。

なぜテストが失敗したのかをひと目で確認

 もうひとつ、単体テストにおいて意外と面倒なのがテストのデバッグ作業です。テストが失敗した場合や、期待通りに動作しなかった場合、通常はステップ実行によって変数の値の変化を見たり、デバッグログなどを挟んでプログラムがどのように動いたかを確認したりします。この作業もJtestを使えば、実行したテストが期待通りの動作にならなかった際、テスト対象のどのコードが実行され、どのように処理がされたのかを瞬時に確認することができます。

実行箇所の見える化とスタックトレースの監視
実行箇所の見える化とスタックトレースの監視

 また、カバレッジや実行時の処理フローを追うことで、実行されていないコードを見つけ出すことができます。さらに、Jtestでは実行された処理の経路(スタックトレース)を監視しているため、メソッドの戻り値や引数の値を確認してなぜ実行されなかったのか、テスト実行時の状態を見える化することができます。

Jtestの無料体験版を入手!

 Jtestの無料体験版を配布しております。以下のリンクからダウンロード可能です。

関連記事

モックの監視やパラメータライズのテンプレートまで生成

 また、JtestではモックライブラリのMockitoをサポートしています。通常、モックの利用には手順の習得や慣れが必要ですが、Jtestがモック化可能な箇所をレポートしたり、モックの生成を手助けしたりしてくれるため、経験の少ない開発者でも容易にモックを使うことができます。サポートするモックフレームワークは今後も追加される予定です。

モック呼び出しの監視とテンプレートの生成
モック呼び出しの監視とテンプレートの生成

モックのテンプレート生成やモック呼び出しの監視方法

 モックのテンプレート生成やモック呼び出しの監視方法を動画で体感できます。

 動画中で使用しているサンプルコードはこちらからダウンロードできます。

 また、JUnit4 Parameterizedのテンプレートも生成できるため、バリエーションの多いテストを行う際に役立ちます。

JUnit4 Parameterizedのテンプレート生成
JUnit4 Parameterizedのテンプレート生成

 このように、さまざまなテンプレートを生成することによって、単体テストを手順化できることはJtestの大きな魅力のひとつです。経験の少ない開発者でもテストの作成を手順化することで、迷いなくテストを実装することができ、単体テストの実装レベルを平準化できるのです。

単体テスト対象から除外した箇所のテスト

 Jtestの単体テストアシスタントを使うことで、単体テストの実装を効率化することができました。JUnitで実装しづらく単体テストの対象から除外した箇所は、実際にアプリケーションを動かしてテストを行う方法がいいでしょう。その場合でも、十分にテストができているのか、プロジェクト全体でどのくらいテストが実行できたのか確認する必要が出てきます。また、エビデンスを取得しなければならないケースもあります。

 その場合も、Jtestではアプリケーションサーバー上で動作させた際のソースコードの実行カバレッジを取得することが可能です。また、JUnitによる単体テストのカバレッジとマージを行い、プロジェクト全体でのカバー率を見える化することもできます。アプリケーションを動かしてテストを行う場合、SeleniumやRanorexなどUIテスト自動化ツールを使うことも可能なのです。

テストのカバレッジを統合して見える化
テストのカバレッジを統合して見える化

まとめ

 単体テストは費用対効果が高いというものの、実施にあたって最も大きな課題は工数となります。なるべく少ない工数で成果を得るためにはテスト範囲を限定し、単体テストを行うこともひとつの方法であると解説しました。しかし、それでもテストコードを記述しなくてはならず、デバッグを行う必要もあります。そこで、Jtestの単体テストアシスタントを使うと、テストコードの記述量は確実に減り、実行を見える化することで効率的なデバッグが可能となります。特に単体テストで苦労した開発者はその効果を体感できると思います。「単体テストの工数を削減したい」「効率的に単体テストを行いたい」と考えている方はぜひJtestをお試しください。

Jtestの無料体験版を入手!

 Jtestの無料体験版を配布しております。以下のリンクからダウンロード可能です。

関連記事

お問い合わせ

 テクマトリックス株式会社

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10367 2017/09/04 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング