SlideShare a Scribd company logo
1 of 18
Download to read offline
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

More Related Content

What's hot

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

What's hot (20)

TDDのこれまで、そしてこれから
TDDのこれまで、そしてこれからTDDのこれまで、そしてこれから
TDDのこれまで、そしてこれから
 
Hey It's Not My TDD!
Hey It's Not My TDD!Hey It's Not My TDD!
Hey It's Not My TDD!
 
TDDはじめて物語 Second Season #tddbc
TDDはじめて物語 Second Season #tddbcTDDはじめて物語 Second Season #tddbc
TDDはじめて物語 Second Season #tddbc
 
「最強」のチームを「造る」技術基盤 ディレクターズ・カット
「最強」のチームを「造る」技術基盤 ディレクターズ・カット「最強」のチームを「造る」技術基盤 ディレクターズ・カット
「最強」のチームを「造る」技術基盤 ディレクターズ・カット
 
Visual Studio 2019 / Visual Studio Code + Live Shareではじめるモブ・プログラミング #vs2019
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
 
Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
 
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk
 
Tddのすゝめ
TddのすゝめTddのすゝめ
Tddのすゝめ
 
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめTDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
 
テストスキルを測ってみよう
テストスキルを測ってみようテストスキルを測ってみよう
テストスキルを測ってみよう
 
テスト駆動開発の進化
テスト駆動開発の進化テスト駆動開発の進化
テスト駆動開発の進化
 
Pull Request & TDD 入門
Pull Request & TDD 入門Pull Request & TDD 入門
Pull Request & TDD 入門
 
テストの未来、品質の未来 ~自動化はテスター撲滅の夢を見るか?~
テストの未来、品質の未来 ~自動化はテスター撲滅の夢を見るか?~テストの未来、品質の未来 ~自動化はテスター撲滅の夢を見るか?~
テストの未来、品質の未来 ~自動化はテスター撲滅の夢を見るか?~
 
テスト分析・設計を体感しよう ~マインドマップを活用してテスト観点を発想しよう
テスト分析・設計を体感しよう ~マインドマップを活用してテスト観点を発想しようテスト分析・設計を体感しよう ~マインドマップを活用してテスト観点を発想しよう
テスト分析・設計を体感しよう ~マインドマップを活用してテスト観点を発想しよう
 
LINE Developer Meetup in Tokyo #39 Presentation
LINE Developer Meetup in Tokyo #39 PresentationLINE Developer Meetup in Tokyo #39 Presentation
LINE Developer Meetup in Tokyo #39 Presentation
 
【eLV】ITコンサルタントへの第一歩シリーズ ~課題の仮説立案②~ 課題候補を課題にするために
【eLV】ITコンサルタントへの第一歩シリーズ ~課題の仮説立案②~ 課題候補を課題にするために【eLV】ITコンサルタントへの第一歩シリーズ ~課題の仮説立案②~ 課題候補を課題にするために
【eLV】ITコンサルタントへの第一歩シリーズ ~課題の仮説立案②~ 課題候補を課題にするために
 
メトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーンメトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーン
 
テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善
 
アジャイルの一歩
アジャイルの一歩アジャイルの一歩
アジャイルの一歩
 

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

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

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

GCSアジャイル開発を使ったゲームの作り方
 GCSアジャイル開発を使ったゲームの作り方 GCSアジャイル開発を使ったゲームの作り方
GCSアジャイル開発を使ったゲームの作り方
 
このスライドには間違いが含まれています。修正版をご覧ください
このスライドには間違いが含まれています。修正版をご覧くださいこのスライドには間違いが含まれています。修正版をご覧ください
このスライドには間違いが含まれています。修正版をご覧ください
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
 
Fearless Change RSG Japan English.pdf
Fearless Change RSG Japan English.pdfFearless Change RSG Japan English.pdf
Fearless Change RSG Japan English.pdf
 
java-ja TDD 2nd
java-ja TDD 2ndjava-ja TDD 2nd
java-ja TDD 2nd
 
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 & ...
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都 Flex & Google App Engine for Java & ...
 
Quora Insincere Questions 10th Place Solution & 昔話
Quora Insincere Questions 10th Place Solution & 昔話Quora Insincere Questions 10th Place Solution & 昔話
Quora Insincere Questions 10th Place Solution & 昔話
 
20120421中国gtug
20120421中国gtug20120421中国gtug
20120421中国gtug
 
Azure Functions あれこれ
Azure Functions あれこれAzure Functions あれこれ
Azure Functions あれこれ
 
【DevLOVE現場甲子園2013】Software Engineer in Test @ 楽天の検索基盤の現場
【DevLOVE現場甲子園2013】Software Engineer in Test @ 楽天の検索基盤の現場【DevLOVE現場甲子園2013】Software Engineer in Test @ 楽天の検索基盤の現場
【DevLOVE現場甲子園2013】Software Engineer in Test @ 楽天の検索基盤の現場
 
とりあえず30分でひととおり分かった気にはなれるアジャイル入門
とりあえず30分でひととおり分かった気にはなれるアジャイル入門とりあえず30分でひととおり分かった気にはなれるアジャイル入門
とりあえず30分でひととおり分かった気にはなれるアジャイル入門
 
ふつうの受託開発チームのつくりかた
ふつうの受託開発チームのつくりかたふつうの受託開発チームのつくりかた
ふつうの受託開発チームのつくりかた
 
Springのプログラムモデルと動く仕様~テスト編~
Springのプログラムモデルと動く仕様~テスト編~Springのプログラムモデルと動く仕様~テスト編~
Springのプログラムモデルと動く仕様~テスト編~
 
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~
 
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
『はじめてのClojure』勉強会#3 第7章:テスト、テスト、テスト
 
SeasarCon 2009 White TDD
SeasarCon 2009 White TDDSeasarCon 2009 White TDD
SeasarCon 2009 White TDD
 
テストコードの定型化
テストコードの定型化テストコードの定型化
テストコードの定型化
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
 
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2GCM#4 アーティストのためのプログラマブルシェーダー講座Part2
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2
 

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

More from Yohei Onishi (9)

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

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