Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

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

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

 単体テストは実装中や実装直後など開発の早い工程でバグを発見でき、手戻りが少なく費用対効果の高いテストとされています。そのため、多くのシステム開発現場で導入が進んでいます。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の無料体験版を配布しております。以下のリンクからダウンロード可能です。

関連記事


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

著者プロフィール

バックナンバー

連載:早期に問題を発見、品質向上に貢献するJava対応静的解析・単体テストツール「Jtest」
All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5