ガイド付きユニットテスト作成で課題を解決、ユニットテストを簡単に

(この記事は、開発元Parasoft社 Blog 「Guided Unit Test Creation Simplifies Unit Testing and Addresses its Pain Points」2018年3月22日の抜粋の翻訳記事です。)

開発者が語るユニットテストの課題

最近の顧客調査では、テストの作成モック化/テスト対象の分離メンテナンスの3つが、ユニットテストを成功させるために克服するべき大きな問題であることが明らかになりました。次の図1は、この調査の結果です。開発者がJavaでユニットテストを行う上での懸念事項として挙げた上位項目を示しています。

図1:調査結果は、ユニットテストで生じる主要な懸念事項(パーセンテージ)を示す。(訳者注:グラフの横軸のカテゴリは左から順に次の通りです:テスト作成時間、テスト対象の分離とモック化、メンテナンス、テスト実行時間。)

上記の調査結果でも示されているとおり、次のような問題があります。

  • テストの作成は負担を増やし、しばしば退屈です。広範囲をカバーするテストスイートを作成しながら、プロジェクトの目標と納期を維持しようとすることは、開発チームにとって相反する2つのプレッシャーです。
  • テストのメンテナンスはコストがかかります。コードと同様に、単体テストにもメンテナンスが必要です。コードが変更されると、関連するテストにも変更が生じる可能性があります。
  • テスト対象ユニットのモック化と分離は難しく、時間がかかります。テスト対象ユニットを分離することは非常に重要ですが、そのためには依存関係をモックする必要があり、困難で時間がかかる場合があります。

ユニットテストの作成は退屈で、プロジェクトのもっと面白い作業から注意を逸らします。テストコードは繰り返しが多く、テスト対象のコードを書くのと同じくらいの労力が必要になることもよくあります。そのうえ、テストコードも、コードである以上、修正とデバッグが必要です。

ガイド付きのテスト作成による負担の軽減

幸運にも、ユニットテストは自動化に適しています。ツールによるガイドはテストの作成を大幅に簡略化し、デバッグと修正の量を削減し、プロジェクトの分析に役立つテスト結果とメトリクスを収集することができます。

IDEを超えて

多くのIDEには、JUnitなどのユニットテスト作成ウィザードがありますが、作成プロセスを完全に自動化してくれるような「中身」は提供しません。アサーションは手動で定義する必要があります。また、モックフレームワークを使用する場合は、かなりの量の手作業によるコーディングが必要です。ここで、ガイド付きのテスト作成が役に立ちます。ガイド付きユニットテスト作成は、開発者のIDE内で、状況に応じたリアルタイムの支援を提供します。テストアシスタントが以下を実行するため、簡易的なスケルトンユニットテストに足りない「中身」を迅速かつ効率的に埋めることができます。

  • テストフレームワークを作成し、オブジェクトをインスタンス化し、適切なモックオブジェクトとメソッドを設定する
  • 自動テストの実行を分析し、テスト中に変化があったオブジェクトの値を示し、値を検証するためのアサーションを推奨する
  • テスト対象コードの分離を推進するために、モック化するべきメソッド呼び出しを指摘する
  • テスト中に作成されたが、テスト完了後に解放されなかったシステムリソースを検出する(このようなリソースは、テスト環境を不安定にする可能性があります)
  • コードカバレッジおよびその他のメトリクスを収集する

具体的なサンプルを見てみましょう。次の例では、IDEからParasoft Jtestのユニットテストアシスタント(UTA)を呼び出し、パラメーター化されたテストを作成しています。

ユニットテストアシスタントは、次のようなテストコードを作成します。開発者が必要に応じてパラメーターの値を埋めます。

さまざまなパラメーター値のテストケースを作成するために、テストケースウィザードがあります。

これでもうテストができました。

モックの複雑さを軽減する

ユニットテストでは、テスト対象オブジェクトを他の部分から分離することが不可欠です。これは、多くの依存関係が存在する場合には相当量の作業が必要です。MockitoPowerMockなどのモックフレームワークを使用しても、依然としてかなりの手作業でのコーディングが必要です。自動テストアシスタントツールを使用すると、依存関係を検出し、フレームワークが必要とする詳細を自動的に入力できます。

ツールがテスト対象のコードを分析し、依存関係を自動的に検出して、開発者に推奨事項を提示します。

たとえば、次のようにクラスIWorkspaceClassのユニットテストを実行しているとします。

実行時に依存関係が検出され、ツールは見つかった依存関係をモックするように提示します。

ツールで[モックする]を選択すると、ユニットテストに必要なモックコードが生成されます。生成後、必要に応じて適切なロジックを表すようにカスタマイズすることができます。依存関係の自動検出とそれに続くモックコードの生成は、オブジェクトをモック化するために必要な、間違いやすい手作業でのコーディングの量を大幅に削減します。

自動化によるテストスイートのメンテナンスの削減

テストスイートのメンテナンスは、新しいテストの作成、基礎となるロジックに合わせたテストの変更、依存関係のモック、テストの実行、検証など、テスト作成に必要な作業の多くと重なっています。テストのメンテナンス時にユニットテストアシスタントを活用すると、テスト実行中に収集された解析結果に基づく最新のフィードバックを受けとれるので、テスト作成時と同様に便利です。たとえば、テスト対象オブジェクトの新しい依存関係が実行時に検出され、対処方法が開発者に提示されます。

またこの段階で重要なのは、アサーションが依然として有効であると保証することです。ユニットテストアシスタントは、コードの変更を検出し、アサーションを更新して新しいビジネスロジックを反映させるための推奨事項を提供します。

既存のツールの利点を最大限に活用する

すでにユニットテストを行っているJava開発者は、おそらくJUnitを使用しており、MockitoやPowerMockなどのプロジェクトのアサーションフレームワークを使用しているでしょう。テスト自動化ツールは、これら既存のツールを有効に活用する必要があります。これは、ユニットテストに対する既存の投資を置き換えてしまうと、コストと時間の利益がなくなる可能性があるためです。重要なポイントとして、Jtestのユニットテストアシスタントは既存のツールとシームレスに統合されています。

まとめ

ユニットテストには明らかなメリットがあり、ほとんどの開発チームがそれを認識していますが、多くの場合、テストの作成とメンテナンスの負担によってユニットテストを実行できないでいます。Jtestが提供するガイド付きユニットテスト作成テクノロジーは、このような障害を排除し、ユニットテストの作成、分離、モック化、メンテナンスなど、面倒な作業を自動化します。Jtestでは、開発チームが行ったテストおよびモックフレームワークへの既存の投資を活用できるので、採用のハードルが低く、開発者には時間的余裕、製品には品質というリターンをもたらします。

参考

ユニットテストの利点・問題・解決方法について、またJtestのユニットテストアシスタントについては、以下の過去のブログ記事でも詳しく取り上げています。

 

Parasoft Jtestについて

Java対応静的解析・単体テストツール Parasoft Jtest

Jtestは、テスト工数の大幅削減とセキュアで高品質なJavaシステムの開発を強力にサポートするJava対応テストツールです。1,000個以上のコーディング規約をもとにソースコードを静的に解析し、プログラムの問題点や処理フローに潜む検出困難なエラーを検出します。さらに、JUnitを用いた単体テストについて、作成、実行、テストカバレッジ分析、テスト資産の管理といった単体テストに係る作業をサポートし、単体テストの効率化を促進します。

Top