PR

 前回は、組み込み(ET: Embedded Technology)分野とIT分野におけるモデル駆動開発の違いについて解説し、IT分野のモデル駆動開発の知見がET分野にも生かせると述べた。今回は、より具体的な開発の取り組みとして、実際に適用したテスト駆動による組み込みソフトウエア開発について解説する。

テスト駆動開発を選んだ理由

 筆者は標準化団体JASPAR(Japan Automotive Software Platform Architecture)の「自動車向け共通基盤ソフトウエア開発」に参画した。担当したのは、欧州の自動車用ソフトウエア規格AUTOSAR仕様に準拠したモジュール開発。具体的には、アプリケーションの実行基盤となるモジュールである。ユーザーが任意に実装したアプリケーションの動作を保証する必要があった。

 筆者が参画した時点で、開発対象のモジュール仕様は既に策定されていた。だが、仕様体系は初めて目にするものである。より良いモジュールに仕上げるために、どのような設計、実装を行うべきかは手探りの状態であった。また、筆者が担当するのはアプリケーションの実行基盤であるため、仕様で明確になっていないモジュールの振る舞いは、アプリケーションの視点で確認することが重要であった。モジュール規模も大きく、半年の開発期間を見込んでいた。試行しながら段階的に開発を進める必要があった。

 これらの背景に対応し、うまく開発を進める手段として考えたのが、IT業界でよく使われるテスト駆動開発だった。テスト駆動開発は、以下の(1)~(3)を1サイクルとし、短期間で繰り返し開発を進めていく手法である。


 (1)モジュールに期待する動作を検討し、動作確認用のテストコードを作成してテストを実行(テスト失敗)
 (2)(1)の期待する動作をモジュールに実装してテストを実行(テスト成功)
 (3)(2)で実装したモジュールの実装コードをリファクタリングして、コードを整理

 テスト駆動開発は短期間で実装と検証を繰り返すため、技術的な裏付けを取りやすい。また、見込み通りに開発が進まない場合に、開発リソースを集約するなどの対応が容易であり、知見の少ない分野の開発にも適すると考えたのである。

反復型開発との組み合わせる

 実際の開発は、反復型(イテレーティブ開発)で計画を策定し、図1のような流れで実施した。

図1●テスト駆動開発を採用した開発計画例
図1●テスト駆動開発を採用した開発計画例

 テスト駆動による開発においても、初めは開発対象のモジュールの仕様を分析し、概要設計を行うことから着手した。テスト駆動でテンポ良く開発を進めるには、あらかじめチーム内で開発モジュールの詳細仕様や振る舞いを共有し、大まかな設計方針の認識を合わせておく必要があるためである。

 開発期間中は、新規機能の実装やモジュールの最適化方針見直しなどの大きな作業単位ごとに開発期間(イテレーション)を設定し、プロジェクト計画に対するマイルストーンを明確にするとともに、他チームが平行して開発している関連モジュールとの結合試験や、モジュールを利用した評価アプリケーション開発向けに先行提供する場合に利用可能な機能を明らかにした。

 イテレーションごとの開発サイクルでは、テスト駆動により新規機能の開発を行うフェーズ(ラピッド開発フェーズ)と、予定機能の完成後にテスト内容を確認し、仕様の視点から不足しているテストケースを追加するフェーズ(資産化フェーズ)に分けて進めた。

 一般的なテスト駆動開発では、仕様の考慮漏れなどを避けるため、後でテストケースを追加するような進め方はしない。この開発では、新規機能の開発速度を上げるため、ラピッド開発フェーズ中は、仕様カバレッジは行わず論理的に確認できているプログラムコードのテストは省略した。

 ただし、開発モジュールは段階的にリリースすることになっていた。開発機能の品質を維持するためには、モジュールの仕様を網羅するテストを実施する必要があった。担当者以外の視点で確認して仕様漏れなどを防止する目的を含め、あえて資産化フェーズを設定し、仕様を網羅するテストセットを構築しながら開発を進めた。

 実際には、仕様やプログラム構造に対する理解度は属人性が高い。少しのテストを追加するだけで良い場合もあれば、異常系や他機能との組み合わせに考慮不足が見つかり実装したプログラムコードの見直しが必要な場合もあった。それでも、イテレーションごとに機能仕様を網羅していることが確認できるため、狙いとした効果はあったと考えている。