Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013

Yohei Onishi
Yohei OnishiData Engineer at Fast Retailing
Test-Driven Development
for Embedded C
by
James W Grenning
Twitterのアカウントはこちら
@jwgrenning
linkedinのアカウントはこちら
www.linkedin.com/in/jwgrenning
(メッセージに今日の研修で知り合ったことを
書いてください)
1
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
付箋を2枚書いて下さい
あなたの開発時間に
占めるテストとデ
バッグの割合は?
プログラマが考えた通
りにコードが動くこと
を確かめるのは誰の仕
事か?
コーディング %
テスティング %
+ デバッギング %
100%
顧客
2
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
付箋を2枚書いて下さい
開発の何が
好き?
... が好き
... が苦手
開発で一番苦
手な活動は?
3
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
TDDには色々な要素がある
4
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
TDDのいくつかの部分について
見ていこう
実際はもっとたくさんある
5
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
私が答える質問
• TDDとは何か?
• どのように依存関係のあるコードをテストする
か?
• どのようにTDDを組み込み開発に適用するか?
6
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-20132013 James W. Grenning
All Rights Reserved. For use by training attendees.
知識
理解
スキル
熟練
• 質問する
• 経験を得る
• スキルを築く
間違いたくなければ質問するな。
決して正しくなりたくなければ質問するな
ガブリエル・ベネフィールド
7
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
• テストを書く
• ビルドされないことを確認する
• ビルドするが失敗する
• ビルドを通す
• リファクタリングする (汚いコード
を綺麗にする)
• 完了まで繰り返す
T
D
D
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
開発とテストを連続させ、バグを防ぐ
開発
テスト
9
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
グループ演習
10
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
Circular Buffer(循環バッファ)
モジュールを作る
41 59 14 33 7 31
In-Index Out-Index
Out-Index In-Index
23 7 66 12 99 16 90
Out-Index In-Index
42 -6 23 7 66 12 99 16 90
Out-Index In-Index
99
11
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
ニーズ
• Circular Buffer は整数の配列を持つ
• Circular Buffer の使用と完全性を管理するモ
ジュールを作成する
12
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
テスト駆動開発を始める前に
• API はどうあるべきか?
– 関数に名前をつける
• 初期データ構造はどうあるべきか?
‒ あなたが使う分野を特定する
• どうテストするか?
– 数行で表現する
• どんなテストケースが必要か?
‒ リストを作る
13
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
分析しすぎに注意
アイディアが
たくさん湧く
分析しすぎ
Ideas
Time
推測の上に推測を重ねている
考えすぎ
行動に移る
タイミング
14
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
グループ演習に対する
私の解答
演習が終わるまでこの先の資料を見ないこと
15
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
インタフェースに対する
アイディアを考える
+ Put
+ Get
+ IsEmpty
+ IsFull
//etc
CircularBuffer
16
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
どのように実装するか?
(ただし、分析し過ぎに注意)
23 7 66 12 99 16 90 99
in-index
out-index
length
buffer pointer
...
Text
17
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
テストリストを作る
(分析し過ぎに注意)
Circular Buffer Tests
Initially Empty
Transition to empty
Transition to Full
Transition from Full
Put-Get FIFO
Put to full
Get from empty
Filled but not wrapped around
Wrap around
Circular Bufferのテスト
最初は空
空に遷移する
満杯に遷移する
満杯から遷移する
FIFOの入出力
空の時に取得する
満杯だが一周しない
一周する
18
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
C/C++でのTDDステートマシン
(一度に1つの問題を解決する)
必要になればテストリストに新しいテストを追加する
19
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
デモ
20
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
TEST(CircularBuffer, empty_after_creation)
{
CHECK_TRUE(CircularBuffer_IsEmpty(buffer));
}
21
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
bool CircularBuffer_IsEmpty(CircularBuffer * self)
{
return true;
}
すべてのテストをパスする
最もシンプルな実装
22
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
TEST(CircularBuffer, empty_after_creation)
{
CHECK_TRUE(CircularBuffer_IsEmpty(buffer));
}
TEST(CircularBuffer, not_empty_after_put)
{
CircularBuffer_Put(buffer, 42);
CHECK_FALSE(CircularBuffer_IsEmpty(buffer));
}
23
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
bool CircularBuffer_IsEmpty(CircularBuffer * self)
{
return self->index == 0;
}
bool CircularBuffer_Put(CircularBuffer * self, int value)
{
self->index++
return true;
}
すべてのテストをパスする
最もシンプルな実装
24
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
TEST(CircularBuffer, empty_after_creation)
{
CHECK_TRUE(CircularBuffer_IsEmpty(buffer));
}
TEST(CircularBuffer, not_empty_after_put)
{
CircularBuffer_Put(buffer, 42);
CHECK_FALSE(CircularBuffer_IsEmpty(buffer));
}
TEST(CircularBuffer, empty_after_removing_the_last_item)
{
CircularBuffer_Put(buffer, 42);
CHECK_FALSE(CircularBuffer_IsEmpty(buffer));
CircularBuffer_Get(buffer);
CHECK_TRUE(CircularBuffer_IsEmpty(buffer));
}
25
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
bool CircularBuffer_IsEmpty(CircularBuffer * self)
{
return self->index == self->outputIndex;
}
bool CircularBuffer_Put(CircularBuffer * self, int value)
{
self->index++
return true;
}
int CircularBuffer_Get(CircularBuffer * self)
{
self->outputIndex++
return -1;
}
すべてのテストをパスする
最もシンプルな実装
26
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
コーディングは危険
だから注意深くやろう
• TDDは一度に一つの問題を解
決する
• 最初にテストにフォーカスし
不完全なコードを実装する
• テストが完了したら、 コード
はインテグレーションの準備
が完了している
Photo by Andrew Bossi (Own work) [CC-BY-SA-2.5
(www.creativecommons.org/licenses/by-sa/2.5)], via
Wikimedia Commons
27
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
動作する複雑なシステ
ムは動作するシンプル
なシステムから常に進
化することが分かった
28
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
あなたのプログラムにはバ
グが埋め込まれる。そして
それらが見つかった時、あ
なたは驚くだろう。
29
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
30
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
持続可能性
Speculate Code Test Debug伝統的な開発
開発者が気づいてい
ない、あるいは計画
していない時間
テスト駆動開発 Spec
ulate
Test and Code Debug
遅く感
じる
検討
検討
31
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
あとでデバッグ型プログラミング
はジャグリングのようだ
32
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
ナイフを何本ジャグリ
ングするのが好き?
• TDDは一度に一つの問
題を解決する
Photo by Andrew Bossi (Own work) [CC-BY-SA-2.5
(www.creativecommons.org/licenses/by-sa/2.5)], via
Wikimedia Commons
33
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
• 注意深いやり方が上手くなれば速く進める
注意深いやり方が
近道だ!
34
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
組み込みソフトウェア
への適用
35
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
組み込みの何が特別なのか?
• ハードウェアとの並行開発
• ハードウェア・ボトルネック
• クロスコンパイル
• 制約のあるメモリとIO
• ターゲット上でのデバッグ
• アーキテクチャ
36
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
ハードウェアが
足りない!
• まだ存在しない
• 他の誰かが使っている
• ハードウェアにハグがある
37
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
38
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
39
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
40
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
を最小化しよう
Debug
on
Hardware
DoH!
Copyright Fox Broadcasting. Used under fair use.
41
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
TDDを組み込み開発に適用する
42
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
TDDを組み込み開発に適用する
参照: http://renaissancesoftware.net/files/articles/ProgressBeforeHardware.pdf
43
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
35
組み込みでの継続的インテグレーション
3. CISはリポジトリの変更を検出する
と、ローカルコピーを更新して、ビルド
とホストベースのテストを実行する。
2. 開発者が定期的
に成果物をチェッ
クインする。
1. 開発者が全てのユ
ニットテストを通
し、成果物をチェッ
クインする。
4.ホスト上のビルド
とテストが成功する
と、CISはビルドし
たバイナリをTMS
に渡す。TMSはそ
れをシミュレータ、
評価ボード/リファ
レンスボード、ター
ゲットシステムなど
にデプロイする。
SCR, CIS と TMS は必ずしも別のマシン
である必要はない
Developer
Workstation
Source Code
Repository
Continuous Integration
Server
Target System
Eval/Reference
System
Simulator
Test Management
System
44
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
適切なステージで問題を見つける
ステージ ステージで見つかりそうな問題
1 ロジック、設計、モジュール性、インタフェース、境界条件
2 コンパイラの互換性(言語の機能)
ライブラリの互換性(ヘッダーファイル、宣言)
3 プロセッサ実行の問題(コンパイラとライブラリのバグ)
移植の問題(ワードサイズ、アライメント、エンディアン)
4 ステージ 3 と同じ
ハードウェアインテグレーション問題
ハードウェア仕様の誤解
5 ステージ 4 と同じ
機能仕様の誤解
45
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
どのように依存関係のある
コードをテストするか?
46
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
コラボレータのあるモジュール
• LightSchedulerは
RTOSによって1分
毎に起こされる
• ライトの1つがコ
ントロールされる
時間になれば、
LightControllerは
そのライトをオン/
オフするよう指示
される
Time Service
+ GetTime()
+ SetPeriodicAlarm()
Light
Scheduler
+ScheduleTurnOn()
+RemoveSchedule()
+WakeUp()
Light Controller
+ On(id)
+ Off(id)
Hardware RTOS
<<anonymous callback>>
Admin
Console
47
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
インターフェイスに対してプログラムする
• インターフェイスと
実装を別々の構成
要素に分離する
• この設計はうまく
責務を分離している
<<interface>>
Time Service
+ GetTime()
+ SetPeriodicAlarm()
Light
Scheduler
+ ScheduleTurnOn()
+ RemoveSchedule()
+WakeUp()
<<interface>>
Light Controller
+ On(id)
+ Off(id)
Model 42 Hardware RTOS
<<anonymous callback>>
Model 42
Light Controller
RTOS
Time Service
<<implements>> <<implements>>
Admin
Console
48
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
コラボレータのあるモジュールを
テストする
• 可能ならば本物
のコラボレータ
を使う
• フェイクは必要
なときだけ使う
<<interface>>
Time Service
+ GetTime()
+ SetPeriodicAlarm()
Light
Scheduler
Test
Light
Scheduler
+ ScheduleTurnOn()
+ RemoveSchedule()
+wakeUp()
<<interface>>
Light Controller
+ On(id)
+ Off(id)
Light Controller
Spy
Fake
Time Service
<<implements>> <<implements>>
49
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
スケジューラをテストする
TEST(LightScheduler, ScheduleOnTodayNotTimeYet)
{
LightScheduler_ScheduleTurnOn(3, EVERYDAY, 1000);
FakeTimeSource_SetMinute(999);
LightScheduler_Wakeup();
LONGS_EQUAL(LIGHT_NA, LightControllerSpy_GetState(3));
}
TEST(LightScheduler, ScheduleOnTodayItsTime)
{
LightScheduler_ScheduleTurnOn(3, EVERYDAY, 1000);
FakeTimeSource_SetMinute(1000);
LightScheduler_Wakeup();
LONGS_EQUAL(LIGHT_ON, LightControllerSpy_GetState(3));
}
50
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
部分的なスケルトンで早く設計や
テストのアイデアを試す
51
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
テストダブル
52
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
テストダブル
• テストダブルはテストの間、プロダクトコードの
ある部分の代わりになる
• テストダブルはモジュールをユニットテスト可能
にするテストフィクスチャの一部
53
タコのようなテスト依存関係
Test
Code
Under Test
Depended
On
Component
DOC DOC
Transitively
DOC
TDOC TDOCTDOCTDOC
54
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
タコを管理する
Test
Code
Under Test
Test Double Test Double Test Double
55
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
可能ならばプロダクションコードを使う
必要な時だけテストダブルを使う
Test
Code
Under Test
Depended
On
Component
Test Double Test Double
Transitively
DOC
TDOC
56
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
テストダブルの種類
[XUNIT]
• 他の名前
‒ フェイク
‒ モックオブジェクト
‒ スパイ
‒ ヌルオブジェクト
‒ フェイク爆弾
‒ 他にもある
57
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
Cによるテストダブルの選択肢
• リンク時置換
‒ オブジェクトファイルやライブラリを置換する
• 実行時置換
‒ 関数ポインタ
‒ 関数ポインタテーブル
• プリプロセッサ置換
‒ 私は好きではないが、時々必要になる
• 動く一番シンプルな選択肢を使う
58
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
C++によるテストダブルの選択肢
• リンク時置換
‒ オブジェクトファイルやライブラリを置換する
• 実行時置換
‒ 1つのクラスを別のものに置き換える
‒仮想関数
‒インタフェースクラス
‒ 1つの関数を別のものに置き換える
‒C関数ポインタ
• プリプロセッサ置換
‒ 私は好きではないが時々必要になる
59
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
ターゲットへの依存関係を
管理する
60
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
Spaghetti Slide
Fair use for education: Thanks http://catalinpetrescu.webs.com/apps/photos/photo?photoid=5490225561
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
関心を分離する
• ハードウェアやOS
の詳細から製品ロ
ジックを分離する
• もしできないならオ
フターゲットでテス
トできない
• あなたのコードの寿
命が短くなる
<<interface>>
Time Service
+ GetTime()
+ SetPeriodicAlarm()
Light
Scheduler
+ ScheduleTurnOn()
+ RemoveSchedule()
+WakeUp()
<<interface>>
Light Controller
+ On(id)
+ Off(id)
Model 42 Hardware RTOS
<<anonymous callback>>
Model 42
Light Controller
RTOS
Time Service
<<implements>> <<implements>>
Admin
Console
62
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
問題例
• コンパイラベンダーが C を拡張する
• 開発者が ‘asm’ を埋め込む
• ヘッダファイルがベンダーロックインになる
63
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
コンパイラベンダーが
C を拡張する
//snip...
/* Address Mode Register */
extern cregister volatile unsigned int AMR;
//snip...
//snip...
interrupt void one_ms_tic(void)
{
...
}
//snip...
64
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
プリプロセッサでベンダー拡張を隠
すため強制的にインクルードする
//hide_stuff.h
#define interrupt
#define cregister
無効化するために hidestuff.h を強制的にインク
ルードする
参照: http://www.renaissancesoftware.net/blog/archives/249
65
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
開発者が ‘asm’ を埋め込む
void foo(void)
{
	 do
	 {
	 asm("NOP");
	 asm("PLOP");
	 asm("READ 0");
	 status = IORead(0);
	 } while ((status &amp; ReadyBit) == 0);
}
66
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
プリプロセッサテストダブル
//nullasm.h
#define asm
asm を無効化するために nullasm.h を強制的に
インクルードする
参照: http://www.renaissancesoftware.net/blog/archives/136
67
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
AsmSpy テストダブル
#define asm AsmSpy
void AsmSpy_Create(int size);
void AsmSpy_Destroy(void);
void AsmSpy(const char *);
const char * AsmSpy_Debrief(void);
AsmSpy.h を強制的にインクルードすること
で、すべての asm() 指令は AsmSpy() 呼び出
しに置き換えられ、補足可能になる。
参照: http://www.renaissancesoftware.net/blog/archives/136
68
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
asmのモニタ方法を示す
AsmSpyのテスト
TEST(AsmSpy, CaptureAsmInstructions)
{
	 AsmSpy("NOP");
	 AsmSpy("FLOP");
	 AsmSpy("POP");
	 STRCMP_EQUAL("NOP;FLOP;POP;", AsmSpy_Debrief());
}
asmへの指示を補足するため、AsmSpy.hを強制
的にインクルードする
参照: http://www.renaissancesoftware.net/blog/archives/136
69
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
ベンダーのコンパイラに
ロックインするヘッダファイル
#if defined(_ACME_X42)
typedef unsigned int Uint_32;
typedef unsigned short Uint_16;
typedef unsigned char Uint_8;
typedef int Int_32;
typedef short Int_16;
typedef char Int_8;
#elif defined(_ACME_A12)
typedef unsigned long Uint_32;
typedef unsigned int Uint_16;
typedef unsigned char Uint_8;
typedef long Int_32;
typedef int Int_16;
typedef char Int_8;
#else
#error <acmetypes.h> is not supported for this environment
#endif
70
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
#includeテストダブルを
作成する
#include <stdint.h>
typedef uint32_t	 	 Uint_32;
typedef uint16_t	 	 Uint_16;
typedef uint8_t		 	 Uint_8;
typedef int32_t		 	 Int_32;
typedef int16_t		 	 Int_16;
typedef int8_t	 	 	 Int_8;
#endif /* ACMETYPES_H_ */
ベンダー固有インクルードへの依存を制限する
71
Agile Japan - Tokyo 2013
www.renaissancesoftware.net
james@renaissancesoftware.net
Copyright © 2008-2013 James W. Grenning
All Rights Reserved. For use by training attendees.
質問があればTwitterでどうぞ
http://twitter.com/jwgrenning
私の本の翻訳はこちら
http://www.oreilly.co.jp/books/
9784873116143/
linkedinアカウントはこちら
http://www.linkedin.com/in/jwgrenning
(メッセージに今日の研修で知り合った
ことを書いてください)
http://www.renaissancesoftware.net
http:// www.jamesgrenning.com
質問
72
1 of 18

Recommended

課外授業7日目"GIGSI" CASE OF CLASSMETHOD by
課外授業7日目"GIGSI" CASE OF CLASSMETHOD課外授業7日目"GIGSI" CASE OF CLASSMETHOD
課外授業7日目"GIGSI" CASE OF CLASSMETHODクラスメソッド株式会社
1.6K views59 slides
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」 by
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」Hiroyuki Ohnaka
6.2K views83 slides
「TDDはじめて物語」 #tddbc by
「TDDはじめて物語」 #tddbc「TDDはじめて物語」 #tddbc
「TDDはじめて物語」 #tddbcHiroyuki Ohnaka
12.5K views81 slides
テストファースト、自動テストを導入するという事について(@社内勉強会) by
テストファースト、自動テストを導入するという事について(@社内勉強会)テストファースト、自動テストを導入するという事について(@社内勉強会)
テストファースト、自動テストを導入するという事について(@社内勉強会)kyon mm
11.8K views40 slides
TDDはじめる前に by
TDDはじめる前にTDDはじめる前に
TDDはじめる前にYasui Tsutomu
4.2K views69 slides
JJUG CCC 2014 fall 「私がTDD出来ないのはどう考えてもお前らが悪い!」~エンタープライズJava開発でのTDD適用の勘所~ by
JJUG CCC 2014 fall  「私がTDD出来ないのはどう考えてもお前らが悪い!」~エンタープライズJava開発でのTDD適用の勘所~JJUG CCC 2014 fall  「私がTDD出来ないのはどう考えてもお前らが悪い!」~エンタープライズJava開発でのTDD適用の勘所~
JJUG CCC 2014 fall 「私がTDD出来ないのはどう考えてもお前らが悪い!」~エンタープライズJava開発でのTDD適用の勘所~Hiroyuki Ohnaka
21.4K views83 slides

More Related Content

What's hot

TDDのこれまで、そしてこれから by
TDDのこれまで、そしてこれからTDDのこれまで、そしてこれから
TDDのこれまで、そしてこれからHiroyuki Ohnaka
3.5K views50 slides
Hey It's Not My TDD! by
Hey It's Not My TDD!Hey It's Not My TDD!
Hey It's Not My TDD!Yasui Tsutomu
2.4K views71 slides
TDDはじめて物語 Second Season #tddbc by
TDDはじめて物語 Second Season #tddbcTDDはじめて物語 Second Season #tddbc
TDDはじめて物語 Second Season #tddbcHiroyuki Ohnaka
4.3K views87 slides
「最強」のチームを「造る」技術基盤 ディレクターズ・カット by
「最強」のチームを「造る」技術基盤 ディレクターズ・カット「最強」のチームを「造る」技術基盤 ディレクターズ・カット
「最強」のチームを「造る」技術基盤 ディレクターズ・カットRakuten Group, Inc.
10.3K views33 slides
Visual Studio 2019 / Visual Studio Code + Live Shareではじめるモブ・プログラミング #vs2019 by
Visual Studio 2019 / Visual Studio Code + Live Shareではじめるモブ・プログラミング #vs2019Visual Studio 2019 / Visual Studio Code + Live Shareではじめるモブ・プログラミング #vs2019
Visual Studio 2019 / Visual Studio Code + Live Shareではじめるモブ・プログラミング #vs2019満徳 関
2K views37 slides
Scrum,Test,Metrics #sgt2016 by
Scrum,Test,Metrics #sgt2016Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016kyon mm
20.2K views71 slides

What's hot(20)

TDDのこれまで、そしてこれから by Hiroyuki Ohnaka
TDDのこれまで、そしてこれからTDDのこれまで、そしてこれから
TDDのこれまで、そしてこれから
Hiroyuki Ohnaka3.5K views
TDDはじめて物語 Second Season #tddbc by Hiroyuki Ohnaka
TDDはじめて物語 Second Season #tddbcTDDはじめて物語 Second Season #tddbc
TDDはじめて物語 Second Season #tddbc
Hiroyuki Ohnaka4.3K views
「最強」のチームを「造る」技術基盤 ディレクターズ・カット by Rakuten Group, Inc.
「最強」のチームを「造る」技術基盤 ディレクターズ・カット「最強」のチームを「造る」技術基盤 ディレクターズ・カット
「最強」のチームを「造る」技術基盤 ディレクターズ・カット
Rakuten Group, Inc.10.3K views
Visual Studio 2019 / Visual Studio Code + Live Shareではじめるモブ・プログラミング #vs2019 by 満徳 関
Visual Studio 2019 / Visual Studio Code + Live Shareではじめるモブ・プログラミング #vs2019Visual Studio 2019 / Visual Studio Code + Live Shareではじめるモブ・プログラミング #vs2019
Visual Studio 2019 / Visual Studio Code + Live Shareではじめるモブ・プログラミング #vs2019
満徳 関2K views
Scrum,Test,Metrics #sgt2016 by kyon mm
Scrum,Test,Metrics #sgt2016Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016
kyon mm20.2K views
アジャイルソフトウェア開発の道具箱 by Koichi ITO
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
Koichi ITO5.8K views
自動テストの誤解とアンチパターン in 楽天 Tech Talk by kyon mm
自動テストの誤解とアンチパターン in 楽天 Tech Talk自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk
kyon mm31.7K views
Tddのすゝめ by 将 高野
TddのすゝめTddのすゝめ
Tddのすゝめ
将 高野2.3K views
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ by Kei Sawada
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめTDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
Kei Sawada16.7K views
テストスキルを測ってみよう by Akira Ikeda
テストスキルを測ってみようテストスキルを測ってみよう
テストスキルを測ってみよう
Akira Ikeda2.2K views
テスト駆動開発の進化 by Yukei Wachi
テスト駆動開発の進化テスト駆動開発の進化
テスト駆動開発の進化
Yukei Wachi20.2K views
Pull Request & TDD 入門 by ESM SEC
Pull Request & TDD 入門Pull Request & TDD 入門
Pull Request & TDD 入門
ESM SEC3.2K views
テストの未来、品質の未来 ~自動化はテスター撲滅の夢を見るか?~ by Dai FUJIHARA
テストの未来、品質の未来 ~自動化はテスター撲滅の夢を見るか?~テストの未来、品質の未来 ~自動化はテスター撲滅の夢を見るか?~
テストの未来、品質の未来 ~自動化はテスター撲滅の夢を見るか?~
Dai FUJIHARA713 views
テスト分析・設計を体感しよう ~マインドマップを活用してテスト観点を発想しよう by Akira Ikeda
テスト分析・設計を体感しよう ~マインドマップを活用してテスト観点を発想しようテスト分析・設計を体感しよう ~マインドマップを活用してテスト観点を発想しよう
テスト分析・設計を体感しよう ~マインドマップを活用してテスト観点を発想しよう
Akira Ikeda9.1K views
LINE Developer Meetup in Tokyo #39 Presentation by Yasuharu Nishi
LINE Developer Meetup in Tokyo #39 PresentationLINE Developer Meetup in Tokyo #39 Presentation
LINE Developer Meetup in Tokyo #39 Presentation
Yasuharu Nishi36.6K views
【eLV】ITコンサルタントへの第一歩シリーズ ~課題の仮説立案②~ 課題候補を課題にするために by 満徳 関
【eLV】ITコンサルタントへの第一歩シリーズ ~課題の仮説立案②~ 課題候補を課題にするために【eLV】ITコンサルタントへの第一歩シリーズ ~課題の仮説立案②~ 課題候補を課題にするために
【eLV】ITコンサルタントへの第一歩シリーズ ~課題の仮説立案②~ 課題候補を課題にするために
満徳 関708 views
メトリクスによる「見える化」のススメ: エッセンシャル・リーン by Hiroyuki Ito
メトリクスによる「見える化」のススメ: エッセンシャル・リーンメトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーン
Hiroyuki Ito47.1K views
テストマネジメントツールSquash TMを利用した継続的テスト改善 by Mizuho Wakai
テストマネジメントツールSquash TMを利用した継続的テスト改善テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善
Mizuho Wakai4.5K views
アジャイルの一歩 by volment
アジャイルの一歩アジャイルの一歩
アジャイルの一歩
volment 463 views

Similar to Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013

GCSアジャイル開発を使ったゲームの作り方 by
 GCSアジャイル開発を使ったゲームの作り方 GCSアジャイル開発を使ったゲームの作り方
GCSアジャイル開発を使ったゲームの作り方Hiroyuki Tanaka
3.3K views79 slides
このスライドには間違いが含まれています。修正版をご覧ください by
このスライドには間違いが含まれています。修正版をご覧くださいこのスライドには間違いが含まれています。修正版をご覧ください
このスライドには間違いが含まれています。修正版をご覧くださいssuser4a5291
11.1K views44 slides
C# から java へのプログラム移植で体験したtddの効果は? by
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?Shinichi Hirauchi
4.9K views89 slides
Fearless Change RSG Japan English.pdf by
Fearless Change RSG Japan English.pdfFearless Change RSG Japan English.pdf
Fearless Change RSG Japan English.pdfDaniel Teng
4.3K views50 slides
java-ja TDD 2nd by
java-ja TDD 2ndjava-ja TDD 2nd
java-ja TDD 2ndTakuto Wada
2.9K views112 slides
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都 Flex & Google App Engine for Java & ... by
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都  Flex & Google App Engine for Java & ...2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都  Flex & Google App Engine for Java & ...
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都 Flex & Google App Engine for Java & ...Sadao Tokuyama
1.1K views26 slides

Similar to Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013(20)

GCSアジャイル開発を使ったゲームの作り方 by Hiroyuki Tanaka
 GCSアジャイル開発を使ったゲームの作り方 GCSアジャイル開発を使ったゲームの作り方
GCSアジャイル開発を使ったゲームの作り方
Hiroyuki Tanaka3.3K views
このスライドには間違いが含まれています。修正版をご覧ください by ssuser4a5291
このスライドには間違いが含まれています。修正版をご覧くださいこのスライドには間違いが含まれています。修正版をご覧ください
このスライドには間違いが含まれています。修正版をご覧ください
ssuser4a529111.1K views
C# から java へのプログラム移植で体験したtddの効果は? by Shinichi Hirauchi
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
Shinichi Hirauchi4.9K views
Fearless Change RSG Japan English.pdf by Daniel Teng
Fearless Change RSG Japan English.pdfFearless Change RSG Japan English.pdf
Fearless Change RSG Japan English.pdf
Daniel Teng4.3K views
java-ja TDD 2nd by Takuto Wada
java-ja TDD 2ndjava-ja TDD 2nd
java-ja TDD 2nd
Takuto Wada2.9K views
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都 Flex & Google App Engine for Java & ... by Sadao Tokuyama
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都  Flex & Google App Engine for Java & ...2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都  Flex & Google App Engine for Java & ...
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都 Flex & Google App Engine for Java & ...
Sadao Tokuyama1.1K views
Quora Insincere Questions 10th Place Solution & 昔話 by ssuser4a5291
Quora Insincere Questions 10th Place Solution & 昔話Quora Insincere Questions 10th Place Solution & 昔話
Quora Insincere Questions 10th Place Solution & 昔話
ssuser4a52913.5K views
20120421中国gtug by Yusuke Sato
20120421中国gtug20120421中国gtug
20120421中国gtug
Yusuke Sato577 views
【DevLOVE現場甲子園2013】Software Engineer in Test @ 楽天の検索基盤の現場 by Kotaro Ogino
【DevLOVE現場甲子園2013】Software Engineer in Test @ 楽天の検索基盤の現場【DevLOVE現場甲子園2013】Software Engineer in Test @ 楽天の検索基盤の現場
【DevLOVE現場甲子園2013】Software Engineer in Test @ 楽天の検索基盤の現場
Kotaro Ogino1.6K views
とりあえず30分でひととおり分かった気にはなれるアジャイル入門 by 陽一 滝川
とりあえず30分でひととおり分かった気にはなれるアジャイル入門とりあえず30分でひととおり分かった気にはなれるアジャイル入門
とりあえず30分でひととおり分かった気にはなれるアジャイル入門
陽一 滝川14.1K views
ふつうの受託開発チームのつくりかた by Yoshitaka Kawashima
ふつうの受託開発チームのつくりかたふつうの受託開発チームのつくりかた
ふつうの受託開発チームのつくりかた
Yoshitaka Kawashima16.5K views
Springのプログラムモデルと動く仕様~テスト編~ by terahide
Springのプログラムモデルと動く仕様~テスト編~Springのプログラムモデルと動く仕様~テスト編~
Springのプログラムモデルと動く仕様~テスト編~
terahide2.6K views
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~ by InnovationSprint2011
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト by makopi 23
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
makopi 231.7K views
SeasarCon 2009 White TDD by Takuto Wada
SeasarCon 2009 White TDDSeasarCon 2009 White TDD
SeasarCon 2009 White TDD
Takuto Wada2.3K views
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring) by NTT DATA Technology & Innovation
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
Getting Started with Testing using PHPUnit by Atsuhiro Kubo
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
Atsuhiro Kubo1.2K views
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2 by GREE/Art
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2GCM#4 アーティストのためのプログラマブルシェーダー講座Part2
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2
GREE/Art9.5K views

More from Yohei Onishi

Building a Data Pipeline using Apache Airflow (on AWS / GCP) by
Building a Data Pipeline using Apache Airflow (on AWS / GCP)Building a Data Pipeline using Apache Airflow (on AWS / GCP)
Building a Data Pipeline using Apache Airflow (on AWS / GCP)Yohei Onishi
5.6K views28 slides
Building an analytics workflow using Apache Airflow by
Building an analytics workflow using Apache AirflowBuilding an analytics workflow using Apache Airflow
Building an analytics workflow using Apache AirflowYohei Onishi
2.3K views22 slides
Better parking experience with Automatic - Api Days San Francisco by
Better parking experience with Automatic - Api Days San FranciscoBetter parking experience with Automatic - Api Days San Francisco
Better parking experience with Automatic - Api Days San FranciscoYohei Onishi
1.2K views6 slides
(日本人一人で)米国企業で働くために必要な3つのこと〜渡米後1ヶ月編〜 by
(日本人一人で)米国企業で働くために必要な3つのこと〜渡米後1ヶ月編〜(日本人一人で)米国企業で働くために必要な3つのこと〜渡米後1ヶ月編〜
(日本人一人で)米国企業で働くために必要な3つのこと〜渡米後1ヶ月編〜Yohei Onishi
1.4K views8 slides
誰かが言ってたけど人生はRPGのようだ by
誰かが言ってたけど人生はRPGのようだ誰かが言ってたけど人生はRPGのようだ
誰かが言ってたけど人生はRPGのようだYohei Onishi
2.5K views49 slides
ど根性駆動型コミュニティ開発 by
ど根性駆動型コミュニティ開発ど根性駆動型コミュニティ開発
ど根性駆動型コミュニティ開発Yohei Onishi
943 views17 slides

More from Yohei Onishi(9)

Building a Data Pipeline using Apache Airflow (on AWS / GCP) by Yohei Onishi
Building a Data Pipeline using Apache Airflow (on AWS / GCP)Building a Data Pipeline using Apache Airflow (on AWS / GCP)
Building a Data Pipeline using Apache Airflow (on AWS / GCP)
Yohei Onishi5.6K views
Building an analytics workflow using Apache Airflow by Yohei Onishi
Building an analytics workflow using Apache AirflowBuilding an analytics workflow using Apache Airflow
Building an analytics workflow using Apache Airflow
Yohei Onishi2.3K views
Better parking experience with Automatic - Api Days San Francisco by Yohei Onishi
Better parking experience with Automatic - Api Days San FranciscoBetter parking experience with Automatic - Api Days San Francisco
Better parking experience with Automatic - Api Days San Francisco
Yohei Onishi1.2K views
(日本人一人で)米国企業で働くために必要な3つのこと〜渡米後1ヶ月編〜 by Yohei Onishi
(日本人一人で)米国企業で働くために必要な3つのこと〜渡米後1ヶ月編〜(日本人一人で)米国企業で働くために必要な3つのこと〜渡米後1ヶ月編〜
(日本人一人で)米国企業で働くために必要な3つのこと〜渡米後1ヶ月編〜
Yohei Onishi1.4K views
誰かが言ってたけど人生はRPGのようだ by Yohei Onishi
誰かが言ってたけど人生はRPGのようだ誰かが言ってたけど人生はRPGのようだ
誰かが言ってたけど人生はRPGのようだ
Yohei Onishi2.5K views
ど根性駆動型コミュニティ開発 by Yohei Onishi
ど根性駆動型コミュニティ開発ど根性駆動型コミュニティ開発
ど根性駆動型コミュニティ開発
Yohei Onishi943 views
#tdd4ec is back!!〜テスト駆動開発による 組み込みプログラミングの集い〜 by Yohei Onishi
#tdd4ec is back!!〜テスト駆動開発による 組み込みプログラミングの集い〜#tdd4ec is back!!〜テスト駆動開発による 組み込みプログラミングの集い〜
#tdd4ec is back!!〜テスト駆動開発による 組み込みプログラミングの集い〜
Yohei Onishi2.2K views
自分のコミュニティを始めてみませんか? by Yohei Onishi
自分のコミュニティを始めてみませんか?自分のコミュニティを始めてみませんか?
自分のコミュニティを始めてみませんか?
Yohei Onishi1.8K views
外乱光対策にまいまい式を使おう(ETロボコン2011東京連合第1回) by Yohei Onishi
外乱光対策にまいまい式を使おう(ETロボコン2011東京連合第1回)外乱光対策にまいまい式を使おう(ETロボコン2011東京連合第1回)
外乱光対策にまいまい式を使おう(ETロボコン2011東京連合第1回)
Yohei Onishi7.7K views

Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013

  • 1. Test-Driven Development for Embedded C by James W Grenning Twitterのアカウントはこちら @jwgrenning linkedinのアカウントはこちら www.linkedin.com/in/jwgrenning (メッセージに今日の研修で知り合ったことを 書いてください) 1 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 付箋を2枚書いて下さい あなたの開発時間に 占めるテストとデ バッグの割合は? プログラマが考えた通 りにコードが動くこと を確かめるのは誰の仕 事か? コーディング % テスティング % + デバッギング % 100% 顧客 2 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 付箋を2枚書いて下さい 開発の何が 好き? ... が好き ... が苦手 開発で一番苦 手な活動は? 3 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. TDDには色々な要素がある 4
  • 2. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. TDDのいくつかの部分について 見ていこう 実際はもっとたくさんある 5 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 私が答える質問 • TDDとは何か? • どのように依存関係のあるコードをテストする か? • どのようにTDDを組み込み開発に適用するか? 6 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-20132013 James W. Grenning All Rights Reserved. For use by training attendees. 知識 理解 スキル 熟練 • 質問する • 経験を得る • スキルを築く 間違いたくなければ質問するな。 決して正しくなりたくなければ質問するな ガブリエル・ベネフィールド 7 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. • テストを書く • ビルドされないことを確認する • ビルドするが失敗する • ビルドを通す • リファクタリングする (汚いコード を綺麗にする) • 完了まで繰り返す T D D
  • 3. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 開発とテストを連続させ、バグを防ぐ 開発 テスト 9 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. グループ演習 10 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. Circular Buffer(循環バッファ) モジュールを作る 41 59 14 33 7 31 In-Index Out-Index Out-Index In-Index 23 7 66 12 99 16 90 Out-Index In-Index 42 -6 23 7 66 12 99 16 90 Out-Index In-Index 99 11 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. ニーズ • Circular Buffer は整数の配列を持つ • Circular Buffer の使用と完全性を管理するモ ジュールを作成する 12
  • 4. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. テスト駆動開発を始める前に • API はどうあるべきか? – 関数に名前をつける • 初期データ構造はどうあるべきか? ‒ あなたが使う分野を特定する • どうテストするか? – 数行で表現する • どんなテストケースが必要か? ‒ リストを作る 13 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 分析しすぎに注意 アイディアが たくさん湧く 分析しすぎ Ideas Time 推測の上に推測を重ねている 考えすぎ 行動に移る タイミング 14 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. グループ演習に対する 私の解答 演習が終わるまでこの先の資料を見ないこと 15 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. インタフェースに対する アイディアを考える + Put + Get + IsEmpty + IsFull //etc CircularBuffer 16
  • 5. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. どのように実装するか? (ただし、分析し過ぎに注意) 23 7 66 12 99 16 90 99 in-index out-index length buffer pointer ... Text 17 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. テストリストを作る (分析し過ぎに注意) Circular Buffer Tests Initially Empty Transition to empty Transition to Full Transition from Full Put-Get FIFO Put to full Get from empty Filled but not wrapped around Wrap around Circular Bufferのテスト 最初は空 空に遷移する 満杯に遷移する 満杯から遷移する FIFOの入出力 空の時に取得する 満杯だが一周しない 一周する 18 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. C/C++でのTDDステートマシン (一度に1つの問題を解決する) 必要になればテストリストに新しいテストを追加する 19 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. デモ 20
  • 6. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. TEST(CircularBuffer, empty_after_creation) { CHECK_TRUE(CircularBuffer_IsEmpty(buffer)); } 21 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. bool CircularBuffer_IsEmpty(CircularBuffer * self) { return true; } すべてのテストをパスする 最もシンプルな実装 22 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. TEST(CircularBuffer, empty_after_creation) { CHECK_TRUE(CircularBuffer_IsEmpty(buffer)); } TEST(CircularBuffer, not_empty_after_put) { CircularBuffer_Put(buffer, 42); CHECK_FALSE(CircularBuffer_IsEmpty(buffer)); } 23 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. bool CircularBuffer_IsEmpty(CircularBuffer * self) { return self->index == 0; } bool CircularBuffer_Put(CircularBuffer * self, int value) { self->index++ return true; } すべてのテストをパスする 最もシンプルな実装 24
  • 7. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. TEST(CircularBuffer, empty_after_creation) { CHECK_TRUE(CircularBuffer_IsEmpty(buffer)); } TEST(CircularBuffer, not_empty_after_put) { CircularBuffer_Put(buffer, 42); CHECK_FALSE(CircularBuffer_IsEmpty(buffer)); } TEST(CircularBuffer, empty_after_removing_the_last_item) { CircularBuffer_Put(buffer, 42); CHECK_FALSE(CircularBuffer_IsEmpty(buffer)); CircularBuffer_Get(buffer); CHECK_TRUE(CircularBuffer_IsEmpty(buffer)); } 25 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. bool CircularBuffer_IsEmpty(CircularBuffer * self) { return self->index == self->outputIndex; } bool CircularBuffer_Put(CircularBuffer * self, int value) { self->index++ return true; } int CircularBuffer_Get(CircularBuffer * self) { self->outputIndex++ return -1; } すべてのテストをパスする 最もシンプルな実装 26 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. コーディングは危険 だから注意深くやろう • TDDは一度に一つの問題を解 決する • 最初にテストにフォーカスし 不完全なコードを実装する • テストが完了したら、 コード はインテグレーションの準備 が完了している Photo by Andrew Bossi (Own work) [CC-BY-SA-2.5 (www.creativecommons.org/licenses/by-sa/2.5)], via Wikimedia Commons 27 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 動作する複雑なシステ ムは動作するシンプル なシステムから常に進 化することが分かった 28
  • 8. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. あなたのプログラムにはバ グが埋め込まれる。そして それらが見つかった時、あ なたは驚くだろう。 29 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 30 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 持続可能性 Speculate Code Test Debug伝統的な開発 開発者が気づいてい ない、あるいは計画 していない時間 テスト駆動開発 Spec ulate Test and Code Debug 遅く感 じる 検討 検討 31 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. あとでデバッグ型プログラミング はジャグリングのようだ 32
  • 9. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. ナイフを何本ジャグリ ングするのが好き? • TDDは一度に一つの問 題を解決する Photo by Andrew Bossi (Own work) [CC-BY-SA-2.5 (www.creativecommons.org/licenses/by-sa/2.5)], via Wikimedia Commons 33 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. • 注意深いやり方が上手くなれば速く進める 注意深いやり方が 近道だ! 34 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 組み込みソフトウェア への適用 35 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 組み込みの何が特別なのか? • ハードウェアとの並行開発 • ハードウェア・ボトルネック • クロスコンパイル • 制約のあるメモリとIO • ターゲット上でのデバッグ • アーキテクチャ 36
  • 10. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. ハードウェアが 足りない! • まだ存在しない • 他の誰かが使っている • ハードウェアにハグがある 37 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 38 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 39 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 40
  • 11. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. を最小化しよう Debug on Hardware DoH! Copyright Fox Broadcasting. Used under fair use. 41 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. TDDを組み込み開発に適用する 42 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. TDDを組み込み開発に適用する 参照: http://renaissancesoftware.net/files/articles/ProgressBeforeHardware.pdf 43 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 35 組み込みでの継続的インテグレーション 3. CISはリポジトリの変更を検出する と、ローカルコピーを更新して、ビルド とホストベースのテストを実行する。 2. 開発者が定期的 に成果物をチェッ クインする。 1. 開発者が全てのユ ニットテストを通 し、成果物をチェッ クインする。 4.ホスト上のビルド とテストが成功する と、CISはビルドし たバイナリをTMS に渡す。TMSはそ れをシミュレータ、 評価ボード/リファ レンスボード、ター ゲットシステムなど にデプロイする。 SCR, CIS と TMS は必ずしも別のマシン である必要はない Developer Workstation Source Code Repository Continuous Integration Server Target System Eval/Reference System Simulator Test Management System 44
  • 12. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 適切なステージで問題を見つける ステージ ステージで見つかりそうな問題 1 ロジック、設計、モジュール性、インタフェース、境界条件 2 コンパイラの互換性(言語の機能) ライブラリの互換性(ヘッダーファイル、宣言) 3 プロセッサ実行の問題(コンパイラとライブラリのバグ) 移植の問題(ワードサイズ、アライメント、エンディアン) 4 ステージ 3 と同じ ハードウェアインテグレーション問題 ハードウェア仕様の誤解 5 ステージ 4 と同じ 機能仕様の誤解 45 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. どのように依存関係のある コードをテストするか? 46 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. コラボレータのあるモジュール • LightSchedulerは RTOSによって1分 毎に起こされる • ライトの1つがコ ントロールされる 時間になれば、 LightControllerは そのライトをオン/ オフするよう指示 される Time Service + GetTime() + SetPeriodicAlarm() Light Scheduler +ScheduleTurnOn() +RemoveSchedule() +WakeUp() Light Controller + On(id) + Off(id) Hardware RTOS <<anonymous callback>> Admin Console 47 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. インターフェイスに対してプログラムする • インターフェイスと 実装を別々の構成 要素に分離する • この設計はうまく 責務を分離している <<interface>> Time Service + GetTime() + SetPeriodicAlarm() Light Scheduler + ScheduleTurnOn() + RemoveSchedule() +WakeUp() <<interface>> Light Controller + On(id) + Off(id) Model 42 Hardware RTOS <<anonymous callback>> Model 42 Light Controller RTOS Time Service <<implements>> <<implements>> Admin Console 48
  • 13. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. コラボレータのあるモジュールを テストする • 可能ならば本物 のコラボレータ を使う • フェイクは必要 なときだけ使う <<interface>> Time Service + GetTime() + SetPeriodicAlarm() Light Scheduler Test Light Scheduler + ScheduleTurnOn() + RemoveSchedule() +wakeUp() <<interface>> Light Controller + On(id) + Off(id) Light Controller Spy Fake Time Service <<implements>> <<implements>> 49 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. スケジューラをテストする TEST(LightScheduler, ScheduleOnTodayNotTimeYet) { LightScheduler_ScheduleTurnOn(3, EVERYDAY, 1000); FakeTimeSource_SetMinute(999); LightScheduler_Wakeup(); LONGS_EQUAL(LIGHT_NA, LightControllerSpy_GetState(3)); } TEST(LightScheduler, ScheduleOnTodayItsTime) { LightScheduler_ScheduleTurnOn(3, EVERYDAY, 1000); FakeTimeSource_SetMinute(1000); LightScheduler_Wakeup(); LONGS_EQUAL(LIGHT_ON, LightControllerSpy_GetState(3)); } 50 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 部分的なスケルトンで早く設計や テストのアイデアを試す 51 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. テストダブル 52
  • 14. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. テストダブル • テストダブルはテストの間、プロダクトコードの ある部分の代わりになる • テストダブルはモジュールをユニットテスト可能 にするテストフィクスチャの一部 53 タコのようなテスト依存関係 Test Code Under Test Depended On Component DOC DOC Transitively DOC TDOC TDOCTDOCTDOC 54 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. タコを管理する Test Code Under Test Test Double Test Double Test Double 55 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 可能ならばプロダクションコードを使う 必要な時だけテストダブルを使う Test Code Under Test Depended On Component Test Double Test Double Transitively DOC TDOC 56
  • 15. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. テストダブルの種類 [XUNIT] • 他の名前 ‒ フェイク ‒ モックオブジェクト ‒ スパイ ‒ ヌルオブジェクト ‒ フェイク爆弾 ‒ 他にもある 57 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. Cによるテストダブルの選択肢 • リンク時置換 ‒ オブジェクトファイルやライブラリを置換する • 実行時置換 ‒ 関数ポインタ ‒ 関数ポインタテーブル • プリプロセッサ置換 ‒ 私は好きではないが、時々必要になる • 動く一番シンプルな選択肢を使う 58 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. C++によるテストダブルの選択肢 • リンク時置換 ‒ オブジェクトファイルやライブラリを置換する • 実行時置換 ‒ 1つのクラスを別のものに置き換える ‒仮想関数 ‒インタフェースクラス ‒ 1つの関数を別のものに置き換える ‒C関数ポインタ • プリプロセッサ置換 ‒ 私は好きではないが時々必要になる 59 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. ターゲットへの依存関係を 管理する 60
  • 16. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. Spaghetti Slide Fair use for education: Thanks http://catalinpetrescu.webs.com/apps/photos/photo?photoid=5490225561 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 関心を分離する • ハードウェアやOS の詳細から製品ロ ジックを分離する • もしできないならオ フターゲットでテス トできない • あなたのコードの寿 命が短くなる <<interface>> Time Service + GetTime() + SetPeriodicAlarm() Light Scheduler + ScheduleTurnOn() + RemoveSchedule() +WakeUp() <<interface>> Light Controller + On(id) + Off(id) Model 42 Hardware RTOS <<anonymous callback>> Model 42 Light Controller RTOS Time Service <<implements>> <<implements>> Admin Console 62 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 問題例 • コンパイラベンダーが C を拡張する • 開発者が ‘asm’ を埋め込む • ヘッダファイルがベンダーロックインになる 63 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. コンパイラベンダーが C を拡張する //snip... /* Address Mode Register */ extern cregister volatile unsigned int AMR; //snip... //snip... interrupt void one_ms_tic(void) { ... } //snip... 64
  • 17. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. プリプロセッサでベンダー拡張を隠 すため強制的にインクルードする //hide_stuff.h #define interrupt #define cregister 無効化するために hidestuff.h を強制的にインク ルードする 参照: http://www.renaissancesoftware.net/blog/archives/249 65 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 開発者が ‘asm’ を埋め込む void foo(void) { do { asm("NOP"); asm("PLOP"); asm("READ 0"); status = IORead(0); } while ((status &amp; ReadyBit) == 0); } 66 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. プリプロセッサテストダブル //nullasm.h #define asm asm を無効化するために nullasm.h を強制的に インクルードする 参照: http://www.renaissancesoftware.net/blog/archives/136 67 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. AsmSpy テストダブル #define asm AsmSpy void AsmSpy_Create(int size); void AsmSpy_Destroy(void); void AsmSpy(const char *); const char * AsmSpy_Debrief(void); AsmSpy.h を強制的にインクルードすること で、すべての asm() 指令は AsmSpy() 呼び出 しに置き換えられ、補足可能になる。 参照: http://www.renaissancesoftware.net/blog/archives/136 68
  • 18. Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. asmのモニタ方法を示す AsmSpyのテスト TEST(AsmSpy, CaptureAsmInstructions) { AsmSpy("NOP"); AsmSpy("FLOP"); AsmSpy("POP"); STRCMP_EQUAL("NOP;FLOP;POP;", AsmSpy_Debrief()); } asmへの指示を補足するため、AsmSpy.hを強制 的にインクルードする 参照: http://www.renaissancesoftware.net/blog/archives/136 69 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. ベンダーのコンパイラに ロックインするヘッダファイル #if defined(_ACME_X42) typedef unsigned int Uint_32; typedef unsigned short Uint_16; typedef unsigned char Uint_8; typedef int Int_32; typedef short Int_16; typedef char Int_8; #elif defined(_ACME_A12) typedef unsigned long Uint_32; typedef unsigned int Uint_16; typedef unsigned char Uint_8; typedef long Int_32; typedef int Int_16; typedef char Int_8; #else #error <acmetypes.h> is not supported for this environment #endif 70 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. #includeテストダブルを 作成する #include <stdint.h> typedef uint32_t Uint_32; typedef uint16_t Uint_16; typedef uint8_t Uint_8; typedef int32_t Int_32; typedef int16_t Int_16; typedef int8_t Int_8; #endif /* ACMETYPES_H_ */ ベンダー固有インクルードへの依存を制限する 71 Agile Japan - Tokyo 2013 www.renaissancesoftware.net james@renaissancesoftware.net Copyright © 2008-2013 James W. Grenning All Rights Reserved. For use by training attendees. 質問があればTwitterでどうぞ http://twitter.com/jwgrenning 私の本の翻訳はこちら http://www.oreilly.co.jp/books/ 9784873116143/ linkedinアカウントはこちら http://www.linkedin.com/in/jwgrenning (メッセージに今日の研修で知り合った ことを書いてください) http://www.renaissancesoftware.net http:// www.jamesgrenning.com 質問 72