(この記事は、開発元Parasoft社 Blog 「The Simple Way to Increase Java Unit Testing ROI」2018年5月31日の翻訳記事です。)
Capers Jonesの業績は、あらゆる業界のソフトウェア開発者にとって大きな資産です。彼はソフトウェアプロジェクトの成功と失敗について研究し、その成果の頂点と言えるのが、2011年の The Economics of Software Quality (邦題『ソフトウェア品質の経済的側面』)です。エンタープライズJava開発者は、この情報の集成にそれほど魅力を感じないかもしれませんが、それでは価値ある洞察を見逃すことになると思います。
ここに、Scrumや最新のソフトウェアツールを使用している開発者も、思わず真顔にならざるを得ない統計値があります。ソフトウェア業界が開発に費やす1ドルあたり、50セントはメンテナンスやバグの発見と修正に費やされるということです。さらに、ほとんどのテストでは、バグの約35%しか取り除くことができず、チームが最善の努力を尽くしても、ソフトウェアのバグの大半が残っています。
Jonesは「テストのシフト・レフト」という言葉そのものを使ったことはないかもしれませんが、この概念をきわめて早い時期に提案しました。ソフトウェアライフサイクルの可能な限り早期に欠陥(特に要件、分析、および設計上の欠陥)を見つけて修正することが、ソフトウェア品質の向上にとって重要ということです。興味深いことに、Jonesは、多くのベンダーがツールのROIを計算するために使用していた1欠陥あたりのコストというメトリクスに対して優れた反証を挙げたという点で傑出していました。1欠陥あたりのコストは、むしろ自動化ツールとテストのシフトレフトのROIを実際より低く見積もるものです。
現在のテスト成功率
ソフトウェア開発者はバグの発見と修正に開発予算の半分を費やしており、現行のテスト方法ではソフトウェアのバグの3分の2が残っているということはすでに書きました。さらに次のような興味深い統計もあります。
- 最新のソフトウェア開発手法を用いても、欠陥の除去率は、最良でも約85%です。これは、欠陥の15%が未発見のまま、最終製品に入っていることを意味します。
- テストケースの約6%は、テストケース自体にバグがあります。
- 大規模なプロジェクトでは回帰テストの20%が重複しています。重複分はテストのコストを増加させるにもかかわらず、製品の品質をまったく向上させません。
- バグ修正の約7%に新しいバグが含まれています。したがって、バグが解決されても、新しいバグが入り込んでいます。
テスト自動化とParasoft Jtestのユニットテストアシスタントはどのように役立つか
過去に何度も述べてきたように、ユニットテストは、ソフトウェア開発にとって不可欠ですが面倒な要件です。テストの自動化は、多くの面倒なプロセスから開発者を解放するのに役立ちますが、依然としてテストの作成とメンテナンスは Java開発者がコードのユニットテストに取り組む際に直面する重要な問題の1つです。以前の記事では、Parasoft Jtestのユニットテストアシスタント(UTA)とそのガイド付きユニットテスト作成機能のメリット、モックの複雑さとテストケースのメンテナンスの負荷を減らすことで、ユニットテストの効率と成果を向上させる方法について説明しました。このトピックでは、ユニットテストアシスタントが実現する経済的利点と、それがテストに及ぼす影響について検討します。
Parasoftが行った最近の調査では、大部分の開発者が作業時間の約40%をユニットテストに費やしていることがわかりました。10日間の実稼働日からなる2週間の開発スプリントのサイクルで考えると、4日間はテストに専念していることになります。なぜテストが反復的かつ機敏なソフトウェア開発を遅らせる要因になるのかは、これで容易におわかりでしょう。また、現在のテストの成功率は、これだけ時間をかけてもまだ不十分であること、あるいはより重要な点としては、結果を改善しながらこの時間を短縮する方法が必要であることを意味しています。
またParasoftでは、Jtestのユニットテストアシスタントを使用している顧客から積極的にデータを集めていますが、その数値はとても希望が持てるものです。Java開発チームは、ユニットテストの労力を最低でも50%は削減しています。つまり、Jtestとユニットテストアシスタントを使用すると、4日間のユニットテストを2日間で完了することができるのです。このようなスプリント単位での節約だけでも印象的ですが、一般的なプロジェクトではスプリントが何回も繰り返されるため、節約分も集積され、さらにインパクトは大きくなります。例えば、典型的なプロジェクトの例として、6つのスプリントで3ヵ月ごとにリリースすると仮定すると、Jtestは1.2スプリントすなわち12日間の開発工数を節約します。 このような節約により、ソフトウェアチームは品質を犠牲にすることなく生産性を高め、納期を大幅に短縮することができます。より良い品質を予定通りに(または予定より早く)デリバリーする――それは大きな経済的利益です。
品質改善の真のROI
品質向上に投資することには、欠陥を修正するコストよりも大きなリターンがあります。ライフサイクルの早い段階でバグを修正する方がコストが低く、したがってお金を節約できます。これは単に1つのメトリクスであり、それだけでも品質改善への投資を正当化するのに十分ですが、実際には品質改善のROIを過小評価しています。
プロジェクトの遅延の主な原因の1つは、見逃された欠陥やセキュリティの脆弱性が製品開発サイクルの後半に持ち越されることです。当然ながら、問題を早期に見つけて修正する方が、コードに関する記憶が新鮮で、まだ次のイテレーション(さらにはプロジェクト)に移っていないため、コストも低くなります。
ROIの計算に欠陥あたりのコストというメトリクスとアプローチのみを使用し、上記の例を基に考え、20人のチームが1時間あたり100ドルの賃金率のプロジェクトに取り組んでいるとします。このチームは、新しいテスト自動化ツールのメリットをフル活用し(欠陥の検出をシフトレフトし)、以前のスプリントより20個も多く欠陥を発見しました。これらのバグを早期に見つけて修復すると、1つの欠陥につき3時間ほどかかり、合計6,000ドルになります。後で統合テストやシステムテストでこれらのバグを見つけて修正すると、作業量は3倍になり、18,000ドルのコストがかかるでしょう。簡単に言うと、このスプリントでのROIは12,000ドルです。すばらしいではありませんか。しかし、これはまだ、スプリントで2日間の開発期間が節約されることを計算に入れていません。これはさらに3万2,000ドルの節約と生産性向上に相当します。
全体を見ると、欠陥あたりのコストではなく、リリース全体の開発時間を短縮することが、大きな節約につながることがわかります。シフトレフトの真の見返りは、プロジェクトのスケジュールと目標を達成、または前倒しできることです。上記の例をもう一度考えてみてください。今度は、開発チーム全体が12日早くリリースを完了した場合のROIを見てみましょう。このチームの場合、20人で12日間、つまり192,000ドルになります。この単純な例は当たり前すぎるようですが、ツールのROIはチームレベルで実現されること、品質を犠牲にせずに製品をより早く市場に提供することによって実現されるということを示しています。
まとめ
従来のユニットテスト方法では、ソフトウェアの開発時間を大きく消費するうえ、その成果も改善が必要です。Parasoft Jtestおよびユニットテストアシスタントでは、ユニットテストの作業量を50%削減できます。これは、品質の向上とスプリントスケジュールの短縮という点で投資に十分見合います。
ツールのROIは、ユニットテストがチームやプロジェクト全体にどれだけの影響を与えているかを考えると、非常に大きなものになります。単純な欠陥あたりのコスト分析とは異なり、予定通りにプロジェクトを完成させ、目標に関する要件を満たすことは大きなメリットであり、同時にお金と時間を節約できるのはさらにメリットを大きくします。
Parasoft Jtestについて
Java対応静的解析・単体テストツール Parasoft Jtest
Jtestは、テスト工数の大幅削減とセキュアで高品質なJavaシステムの開発を強力にサポートするJava対応テストツールです。1,000個以上のコーディング規約をもとにソースコードを静的に解析し、プログラムの問題点や処理フローに潜む検出困難なエラーを検出します。さらに、JUnitを用いた単体テストについて、作成、実行、テストカバレッジ分析、テスト資産の管理といった単体テストに係る作業をサポートし、単体テストの効率化を促進します。