保守開発に静的解析を導入する

既存のJavaアプリケーションのバグ修正や機能追加の様な保守開発と言われるプロジェクトに携わったことはありませんか?保守開発では古くから使われているアプリケーションを扱う事も多く、ドキュメントがない、JUnitの様な自動化された単体テストもないという事も珍しくありません。さらに、多くの開発者が手を入れたことによって複雑になったソースコードに手を入れるという作業に神経をすり減らした経験もあるのではないでしょうか。

開発のリスクを低減するため、単体テストコードを作成するという方法もありますが、元々単体テストを考慮していないソースコードに単体テストを作成することは困難な作業です。そこで、まずは導入も簡単な静的解析からやってみようと考えるのですが、多くの開発者は静的解析は指摘が大量に出てくる、直さなくて良いような指摘も多い、といった、あまり良いイメージを持っていない事も多いです。

なぜ静的解析は好まれないのか?

静的解析はソースコードがあり、ビルドができれば簡単に導入することができます。テストパターンを用意する必要も無ければテストコードを実装する必要もありません。コマンドの実行やボタンを押すだけで結果が出てくるため、気軽に導入を試みることができます。

しかし、既存コードに導入すると、大量の指摘にうんざりして導入を諦めてしまいます。また、すでに稼働しているアプリケーションであり、ソースコードを修正した場合の回帰テストも単体テストコードが無いため、容易には実施できない、という事もあるでしょう。このような背景から、保守開発で静的解析は使えない、といった判断が下されます。

静的解析は保守開発に使えないのか?

いいえ、そんな事はありません。保守開発でも静的解析を導入し、運用している例はたくさんあります。ただ、導入にはちょっとしたコツが必要です。静的解析ルールを絞り込んだり、致命的な不具合を見つける解析方法を選ぶといった方法もありますが、ここではその中のひとつ、Parasoft DTPを使った差分結果表示による解析結果の絞り込みをご紹介します。Parasoft DTPとは、静的解析結果のレポーティングツールです。Parasoft JtestやdotTEST、C++testといったソースコードの静的解析ツールの結果を表示、分析することができます。

Parasoft DTPは静的解析結果だけではなく、単体テストの結果やカバレッジを履歴を追って参照できるため、開発者だけでなく、チームリーダーやマネージャーがプロジェクトの情報をリアルタイムに把握するために利用することもできます。

Parasoft DTPの差分結果表示

差分結果表示とは、ある時点での解析結果をベースラインとして設定し、次に静的解析を行ったときに、ベースラインと解析結果を比較して、新たに発見された指摘事項だけを表示する機能です。

保守開発の場合、すでに稼働しているアプリケーションがあるため、稼働しているソースコードは正常に動作するものとして、静的解析による指摘事項の修正は行いません。その代わり、ソースコードに手を入れたことによって新たに生じた指摘事項はすべて修正し、ベースライン以降に追加・修正されたソースコードの品質を一定レベルに維持します。

上記を例に差分結果表示を説明します。

  1. はじめに現時点のソースコードに解析を行いベースラインに設定します。ここでは76件の指摘がありました。
  2. 次に、仕様変更によりソースコードが追加・修正されました。このソースコードに複数のバグが埋め込まれたとします。
  3. 追加・修正後のソースコードに静的解析を実施すると、93件の指摘がありました。違反の内訳を見ると、18件の新規違反があります。この18件が、ソースコードを修正したことで埋め込まれた新たな指摘です。
  4. 開発者はソースコードの追加・修正の影響で発生した18件の指摘事項だけを確認・修正できます。

この様に、差分結果表示の機能を使うことで、大量に検出される指摘事項に悩まされること無く、必要な箇所だけ確認・修正を行うことができます。

まとめ

保守開発に静的解析を導入するにはちょっとしたコツが必要です。Parasoft DTPの差分結果表示機能もそのひとつで、見るべき違反だけを絞り込み、限られた工数の中で品質確保の手助けをします。静的解析の導入でお困りの方、ぜひParasoft DTPをお試しください。

Parasoft Jtestについて

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

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

Top