ObjectSquare [2012 年 9 月号]

[技術書籍紹介]



Test Driven Development for Embedded C

Test Driven Development for Embedded C

James W. Grenning(著)
Pragmatic Bookshelf (2011/5/2)
352ページ
ISBN: 978-1-93435-662-3

書籍の概要 書籍の概要
章構成 章構成
オススメの読み方 オススメの読み方
読者の声 読書の声
おわりに おわりに


書籍の概要

本書はC言語による組み込みソフトウェア開発におけるTDD(Test Driven Development)[1]を解説した書籍です。著者の James Grenning 氏 は、世界中でアジャイル開発やTDDに関するトレーニング、コーチング、コンサルティングを行っています。James氏はアジャイルな見積り技術であるプランニングポーカーの考案者であり、アジャイルソフトウェア開発宣言のオリジナル著者の1人でもあります。

これまでTDDに縁遠かった組み込みソフトウェア開発者必読の1冊

近年、和田卓人氏(@t_wada)を中心にTDDに精通している技術者がTDD Boot Campというイベントを日本各地で開催し、TDDを書籍の知識としてではなく、実体験として経験できる機会が増えています。TDDを実際に体験した開発者が増えてきたことにより、ブログやソーシャルメディアを通じて議論されるTDDに関する話題もより実践的な内容にシフトしてきており、以前に比べてTDDが実際に使う手法として浸透していることを実感できます。

一方で、TDD Boot Campのブームに取り残されてしまった感覚を覚えているのが(私を含めた)組み込みソフトウェア開発者ではないでしょうか?これまでTDDを紹介する書籍・記事と言えば、業務系やWebのシステムを題材にしたものや、組み込みソフトウェア開発者には馴染みがないフレームワークを扱ったものが多く、組み込みソフトウェア開発者には縁遠い世界でした。また、TDD Boot Campに参加している人の利用言語がJavaやLLが中心なのを見て尻込みしている組み込みソフトウェア開発者もいたことでしょう。

本書は、そんな迷える組み込みソフトウェア開発者のあなたにとって必読の1冊です。本書は、典型的なC言語による組み込みソフトウェア開発の事例を題材にして、C/C++に対応したテスティングフレームワークを使い、TDDを実践していく過程を非常に丁寧に解説している貴重な書籍です。また、C言語によるモジュール設計についての良い教材にもなっています。仮にTDDを実践しない場合でも、本書で解説されているCコードの設計テクニックは参考になると思います。

組み込みソフトウェア開発者がTDDを実践する意義は?

組み込みソフトウェア開発者がTDDについて聞いた時によく疑問に思うことが「組み込みソフトウェア開発でTDDをやる意義はあるのか?」でしょう。その疑問に対して、著者は第5章「Embedded TDD Strategy」において、組み込みソフトウェア開発でありがちな「The Target Hardware Bottleneck」をTDDで解消できることを解説しています。

「The Target Hardware Bottleneck」とは、文字通り、ターゲット・ハードウェア(開発対象のソフトウェアが動作するハードウェアのこと)がソフトウェアのテストを阻害するボトルネックになってしまうことを指します。一般的な組み込みソフトウェア開発では、開発を行うPCと実際にソフトウェアが動作するハードウェアが異なる場合が多く、次のような状況が発生しがちです。

このような「The Target Hardware Bottleneck」の問題に対して、著者は次のことを推奨しています。

このような目的を達成するために著者が推奨している組み込みソフトウェア開発向けのTDDサイクルが次の通りです。このようなサイクルを通じて、前述の「The Target Hardware Bottleneck」の問題を克服します。

組み込みソフトウェア開発向けのTDDサイクル

組み込みソフトウェア開発向けのTDDサイクル

以上が著者の解説する組み込みソフトウェア開発においてTDDを実践する意義です。

なお、本書は、上記Stage1の実践方法について詳しく紹介されており、Stage2以降については詳しく紹介されていません。本書を読んで、Stage1を実践する知識とスキルを身に着けた上で、Stage2〜4までは独力で試行錯誤する必要があります。また、Stage5の受け入れテストについては著者の書いた「Scenario Testing with Executable Use Cases」(PDF)という論文を参照してください。

top ページのトップへ戻る


章構成

本書は3部構成になっています。

第1部「Test Driven Development」では、典型的な組み込みソフトウェアの題材としてLEDのデバイスドライバをTDDで開発していく流れを説明した後、組み込みソフトウェア開発でTDDを実践する意義、TDDを含めた一覧のテストのサイクルが紹介されています。また、テスティングフレームワークとしてはC言語用のUnity、C/C++向けのCppUTestが紹介されています。

第2部の「Get Started」では、C言語による単体テストを行うために、依存先モジュールをテスト用モジュールに置換するテクニックが紹介されています。C言語はオブジェクト指向言語と異なり、モジュールの置換がやりにくい言語仕様のため、第2部で紹介されているリンク置換・プリプロセッサ置換・関数ポインタ置換の知識は非常に重要になります。また、依存先モジュールとの複雑な相互作用をテストするためのC++モッキングライブラリCppUMockが紹介されています。

第3部の「Design and Continuous Improvement」では、SOLID原則[2] 、リファクタリング[3] 、レガシーコードに対するテスト[4]、テストパターンなどTDDを通じて継続的に設計改善するための知識やテクニックが紹介されています。紹介されている内容は元々オブジェクト指向を前提に考えられているものであり、これらをC言語で実装する方法が詳細に紹介されています。第3部は、オブジェクト指向での設計やテストに馴染みがない場合、一度に理解することは難しいかもしれせん。その際は、先に引用元の書籍の内容を理解した上で読み進めると良いでしょう。また、C言語で実装する方法が非常に難解であるため、根気よくサンプルコードを読む必要があります。

以下、本書の詳細な目次です。

Part 1. Getting Started
1. Test Driven Development
2. Test Driving Tools and Conventions
3. Starting a C Module
4. Testing Your Way to Done
5. Embedded TDD Strategy
6. Yeah but…

Part 2. Testing Modules with Collaborators
7. Introducing Test Doubles
8. Spying on the Production Code
9. Runtime-Bound Test Doubles
10. The Mock Object

Part3. Design and Continuous Improvement
11. SOLID, Flexible, and Testable Designs
12. Refactoring
13. Adding Tests to Legacy Code
14. Test Patterns and Antipatterns
15. Closing Thoughts

Appendixes
A1. Development System Test Environment
A2. Unity Quick Reference
A3. CppUTest Quick Reference
A4. LedDriver After Getting Started
A5. Example OS Isolation Layer

top ページのトップへ戻る


オススメの読み方

ここでは、目的別に筆者の考えるオススメの読み方を紹介します。

組み込みソフトウェア向けTDDの特徴を知りたい方へ

筆者が本書について同僚に紹介したところ、よく「他の業界と比較して、組み込みソフトウェア向けのTDDは何か違いはあるのですか?」と聞かれます。著者は基本的なTDDのやり方や、モジュールやハードウェアへの依存関係を排除することが重要な点は他の分野と共通していると解説しています。

もっとも大きな違いは、C言語の言語仕様でテストをやらなければいけない点だと思います。他のオブジェクト指向言語と比較して、C言語でTest Double(テストのために置換する依存先モジュール)を作成する上ではちょっとしたテクニックが必要になります。この辺のテクニックは第7章「Introducing Test Doubles」、第8章「Spying on the Production Code」、第9章「Runtime-Bound Test Doubles」を参照してください。

一方で、組み込みソフトウェアならではのメリットとして、「組み込みソフトウェア開発者がTDDを実践する意義は?」で紹介した「The Hardware Bottleneck」のリスクを解消できることが紹介されています。詳しくは、第1.6節「Benefit for Embedded」と第5章「Embedded TDD Strategy」を参照してください。

実際に例題を使ってTDDを試してみたい方へ

TDDを実践する上では、知識として理解するだけでなく、実際に自分でコードを書いてテクニックとして習得することが大事です。本書ではLEDのデバイスドライバというシンプルな例が第3章「Starting a C Module」と第4章「Testing Your Way to Done」で紹介されています。実際にテストをして、リファクタリングするまでの一連の過程が解説されています。実際に自分でコードを書いて試してみてください。

第3章と第4章はTest Doubleが出てこないシンプルな例ですが、実際の開発現場ではTest Doubleを使う例に出くわすと思います。Test Doubleについては第7章「Introducing Test Doubles」、第8章「Spying on the Production Code」、第9章「Runtime-Bound Test Doubles」を参照してください。

C言語による良いモジュール設計について知りたい方へ

TDDは単純に設計と実装をテストで駆動するだけでなく、継続的なリファクタリングを通じてより良い設計に改善していく活動をカバーしています。より良い設計に改善するためには、何が良い設計なのか知る必要があります。そのため、本書の第11章「SOLID, Flexible, and Testable Designs」にて、良い設計の原則とC言語による実装方法について紹介しています。

第11章では、SOLID原則について学んだ後、まずは著者の定義する「Single-instance Module」というモジュール設計方法を通じてデータのカプセル化などについて学んでください。これは変数をファイルスコープにし、関数を通じてやり取りをすることで、結合度を低くする設計方法です。

また、オブジェクト指向のポリモルフィズムをC言語で実装することで、条件分岐の山を排除し、保守性を向上する方法も紹介されています。この手法では、インスタンスのデータを構造体として持たせたり、実行時に呼び出す関数を変えるために関数ポインタを使ったりするという方法を取ります。コードだけ見るとかなりトリッキーなやり方のため、前提となるオブジェクト指向言語の知識がない場合は、理解が困難になります。その場合、引用元である「アジャイルソフトウェア開発の奥義」などを一度参照してから本書を読み進めることをお勧めします。

top ページのトップへ戻る

読者の声

最後に、筆者が主催している本書の読書会参加メンバーより本書を読んでの感想を紹介します。読書会にわざわざ参加しているだけあって、ひいき目もありますが、非常に好評でした。


おわりに

本書はTDDだけでなくより良い設計について解説されており、C言語で開発している組み込みソフトウェア開発者にとって必読と言っていい良書だと思います。ただし、いろいろな問題を抱えている開発現場では、著者が紹介しているやり方をいきなり実践するのはかなり困難だと思います。まずは本書でヒントを得て、目の前の小さな問題から始め、少しずつ開発を改善していきましょう。

(株式会社 オージス総研 組み込みソリューション第二部 大西洋平)


参考文献

top ページのトップへ戻る

© 2012 OGIS-RI Co., Ltd.
HOME HOME TOP オブジェクトの広場 TOP