テスト駆動開発の導入と並行して、ビルド以降の一連の作業を自働化し、その結果を関係者で即座に共有できるようなシステムを導入します。これは、一般的には「継続的インテグレーション(CI:Continuous Integration)」と呼ばれます。「継続的インテグレーション」を実現するシステムを導入することで、自働化・システム化し、ムダを排除して、更に品質安定化のベースを作り上げます。
継続的インテグレーション(CI)では、下図の左側のプロセス(青のプロセス)を自働化します。
開発者は、開発対象のプログラムとテストプログラムを作成してビルドを実行します。ビルドを実行すると、自動的に静的解析・単体テスト・回帰テストを実行し、テストカバレッジを採取します。
静的解析では、最新のメトリクスとトレンドを見ることで、保守性を中心とした品質のデグレードが起こっていないことを確認します。
単体テスト・回帰テストは、要求通りにプログラムが作られていることを確認するとともに、テストカバレッジを採取することで、機能実現の進捗状況を把握することができます。
テスト駆動開発の導入と「継続的インテグレーション(CI)」による自働化により、品質向上と生産性向上を組織文化として定着させるための土台ができました。
![レガシー救済プロジェクト~悪しき習慣を断ち切れ~品質のデグレードを常にキャッチできるCI(継続的インテグレーション)導入することで、安全なリファクタリングが可能【自働化する一連の作業】ビルド実行⇒【得られる成果物】最新の実行可能なソフト|静的解析実行⇒【得られる成果物】最新のメトリクス値、メトリクス値のトレンド|単体テスト実行⇒【得られる成果物】最新の単体テスト結果・テスト結果のトレンド|回帰テスト実行⇒【得られる成果物】最新の回帰テスト結果・テスト結果のトレンド|テストカバレッジ採取⇒【得られる成果物】機能実現の進捗状況・進捗状況のトレンド⇒品質・進捗レポートの作成【品質・進捗レポートにインプット】](img/legacy/automation.png)
ビルドにより得られる情報は、システムを通じてプロジェクト関係者全員が即座に共有することができます。それを実現するのが、下図のようなシステムです。
今回の例では、CI(継続的インテグレーション)のフレームワークであるJenkinsに、単体テスト・回帰テスト・静的解析・カバレッジツールを組込み、ビルドからの一連の作業を実行させます。
![レガシー救済プロジェクト~悪しき習慣を断ち切れ~品質のデグレードを常にキャッチできるCI(継続的インテグレーション)導入することで、安全なリファクタリングが可能【CI(継続的インテグレーション) System】単体テスト(google test、xUnit、C++Test、WinAMS)回帰テスト(ユーザによる開発)静的解析(QAC、Adlint、ccfinder)プロジェクト管理(statsvn、redmine)Build(コンパイラ)CI(継続的インテグレーション)フレームワーク(Jenkins)linux simulator(cygwin)](img/legacy/CIsystem.png)
下図は、Jenkinsのダッシュボードの画面例です。この例では、ビルド履歴、単体テスト・静的解析のトレンドを見ることができます。これらの情報は、ビルドをする度に自動的に更新され、常に最新の情報を得ることができます。
このようにすることで、品質のデグレードや開発の遅れを素早くキャッチし、早い段階で適切な対応を実施することができます。
ここまでくれば、救済が必要だったレガシー開発は、品質と進捗が制御可能な状態となり、これ以上悪い状態に陥ることはありません。誰もが安心してプロジェクトを進めることができます。
最後の「③コード再生」については、「レガシーリファクタリング」をご参照ください。
![レガシー救済プロジェクト~悪しき習慣を断ち切れ~品質のデグレードを常にキャッチできるCI(継続的インテグレーション)導入することで、安全なリファクタリングが可能|CI(継続的インテグレーション)フレームワーク(Jenkins)ビルド結果の履歴、静的解析結果の履歴](img/legacy/history.png)