攻略 UnitTest
with Win32 API
2006.1.13
あまのりょー
自己紹介
like.no.other
• こんにちは、あまのりょーです。おかげ様で、順調
に復活しています。cf.) XP祭り2005
• とあるメーカー系ソフトハウスでメディア系のア
プリケーションを作っています。
• ホントは Mac OS...
2005.11.17
• Embeded Technology 2005 (ET2005) の公開セッ
ション「アジャイル手法は組込みシステム開発に使えるか」
• アジャイラーからは平鍋さん、永瀬さんなどの
錚々たるパネリスト
私が理解した所の
結論
• アジャイル手法は組み込み開発に使えるでしょ。
• いや、むしろ XP とか SCRUM とか名前を付けてな
いだけで、アジャイルっぽい何かはクミコマーの中
に存在するよね。
• クミコマーもアジャイルのコミュニティに...
ん?
• っていうか、オイラがアジャイル系コミュ
ニティの懇親会で名刺交換したことある
のって、かなり主観だけど、、、、、、
Webアプリ屋さん
&
Javaアプリ屋さん
Rails
W
ebO
bjects
.asp
M
ySQ
L
DI-Container
Swing
JUnit
やっぱり多い。
でも、
クミコミ屋さん
も割といるような
希ガス
μITRON
VxW
orks
bootstrap
Flash
M
em
ory
P操
作
V操
作
JTAGICE
data sheet
ひょっとし
て・・・
PCアプリ屋さん
が少なくね?
今日は敢えて
• あまり仲間がいない(断定していいのか!?) PC ア
プリ屋さんが、ターゲットです。
• Windoze の アプリを作っている。
• VisualStudio で C++、そしてもちろん
unmanaged だ。(たぶん B...
EoT (Ease of Testing)
• ITメディアの平鍋さんの Blog (An Agille Way http://
blogs.itmedia.co.jp/hiranabe/) 2005/8/18 のエントリ
より。
• そのため...
そうはいっても
• 最後には Win32 API を呼んでいるコードが残るよ
ね。
• Win32 API 用 Interface を用意して、テスト時には
その Mock Object を用意してすげ替える?
  → 現実的じゃないし
• む...
しかし今
• ここに来て追い風が・・・
時代は
Binary 2.0
カンファレンス行きたかった・・・
コンセプト
• テスト時には Win32 API をちょっぴり Hackして
乗っ取った ちょっぴり Hook してみた(えへ)
コードが呼ばれるようにしてみよう。
• つまり Win32 API 自体を Mock 化してみよう。
!!CAUTION!!
• この技を追求しすぎると、人は時として、暗黒面に
堕ちます。
• 通報されたり、タイーホ
されないように・・・
• 実際、この hack をした
mat 氏の mixi 名はある日「ダース・フモフモ」に
変わってました。
IAT書き換え
• さぁ、今回は IAT (Import Address Table) を書き換え
てみましょう。
• 参考文献:
• 今回は技術的な詳細には触れません。気になる方
は私に直接声かけてくださいませ。
ケース1
• ::GetDiskFreeSpaceEx() API を使って、ディスクの
空き容量をチェックし、閾値 _以上_ なら true を返
すメソッドをテストしたい。
• テストコード内で巨大なファイルを touch するなど
の方法...
実行例1 - Hook無し
Hookしていないと、容量が足りない
場合のテストコードが試せない
実行例1 - Hook有り
Hookして、少ない容量を返すように
するとテストパス
ケース2
• Web アプリ系でも問題になるテスト時の pseudo
DB。Windows では簡単な値の永続化はレジストリ
を使って行います。
• レジストリアクセスの API は ::RegQueryValueEx()
ですが、これを Ho...
実行例2 - Hook有り
HKLM を書き込み権限で Open できて
しまうユーザでテストしているので
Open失敗の場合のテストが出来ない
実行例2 - Hook有り
Hookして、Openが失敗するようにし
てみるとテストパス
and so on
• この他にも、Win32 API の挙動を制御してユニット
テストしたいケースはあると思います。(例:ウィ
ンドウ位置調整など)
• こういった場合に今回紹介した手法は使えるかも
しれません。
まとめ
Win32 API
Hook で
ユニットテスト
してウハウハ
でもダークサイド
に堕ちちゃいやん
PCアプリ屋さん
はもっとコミュニ
ティに参加しよう
以上。
ヨンキュー!
ご清聴ありがとう
mixi コミュ: ヨンキュー普及委員会 もよろしく
おまけ
まだ終わってなかった時の
先日、私が関わっているプロジェクトの
最初のイテレーションが終わりましたが、
その時のバーンダウンチャートです。
4つのモジュールがあります。
トレンドはいいけど、最初に沢山設定しす
ぎましたね。
平坦部分が気になるけど、最後は収束。
タスク粒度の問題か。
そ、その日にいったい何が・・・
どこから始まってんねん!
ホントに
おしまい
Upcoming SlideShare
Loading in …5
×

攻略ユニットテスト with Win32 API

2,541 views

Published on

2006.1.13 : 第14回 XPJUG ユーザー会

* 『攻略ユニットテスト with Win32 API』

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,541
On SlideShare
0
From Embeds
0
Number of Embeds
41
Actions
Shares
0
Downloads
39
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

攻略ユニットテスト with Win32 API

  1. 1. 攻略 UnitTest with Win32 API 2006.1.13 あまのりょー
  2. 2. 自己紹介 like.no.other • こんにちは、あまのりょーです。おかげ様で、順調 に復活しています。cf.) XP祭り2005 • とあるメーカー系ソフトハウスでメディア系のア プリケーションを作っています。 • ホントは Mac OS が得意&やりたいんですけど、 仕事ではやっぱり Windows の仕事が多いです。 orz • 永和の天野さんとの区別の方法を日夜研究中です。
  3. 3. 2005.11.17 • Embeded Technology 2005 (ET2005) の公開セッ ション「アジャイル手法は組込みシステム開発に使えるか」 • アジャイラーからは平鍋さん、永瀬さんなどの 錚々たるパネリスト
  4. 4. 私が理解した所の 結論 • アジャイル手法は組み込み開発に使えるでしょ。 • いや、むしろ XP とか SCRUM とか名前を付けてな いだけで、アジャイルっぽい何かはクミコマーの中 に存在するよね。 • クミコマーもアジャイルのコミュニティに参加しよ うよ。
  5. 5. ん? • っていうか、オイラがアジャイル系コミュ ニティの懇親会で名刺交換したことある のって、かなり主観だけど、、、、、、
  6. 6. Webアプリ屋さん & Javaアプリ屋さん Rails W ebO bjects .asp M ySQ L DI-Container Swing JUnit
  7. 7. やっぱり多い。 でも、
  8. 8. クミコミ屋さん も割といるような 希ガス μITRON VxW orks bootstrap Flash M em ory P操 作 V操 作 JTAGICE data sheet
  9. 9. ひょっとし て・・・
  10. 10. PCアプリ屋さん が少なくね?
  11. 11. 今日は敢えて • あまり仲間がいない(断定していいのか!?) PC ア プリ屋さんが、ターゲットです。 • Windoze の アプリを作っている。 • VisualStudio で C++、そしてもちろん unmanaged だ。(たぶん BCB でもイケル) • CppUnit を使ってユニットテストしている。 (たぶん boost::unit_test_framework でもイケ ル)
  12. 12. EoT (Ease of Testing) • ITメディアの平鍋さんの Blog (An Agille Way http:// blogs.itmedia.co.jp/hiranabe/) 2005/8/18 のエントリ より。 • そのためには・・・ • MVC の分離(MFCだと大変だけど) • Mock の利用(Mockpp を使えばある程度は) • et cetera... EoTの高い設計が、よいオブジェクト指向設計である。
  13. 13. そうはいっても • 最後には Win32 API を呼んでいるコードが残るよ ね。 • Win32 API 用 Interface を用意して、テスト時には その Mock Object を用意してすげ替える?   → 現実的じゃないし • むーん・・・
  14. 14. しかし今 • ここに来て追い風が・・・
  15. 15. 時代は Binary 2.0 カンファレンス行きたかった・・・
  16. 16. コンセプト • テスト時には Win32 API をちょっぴり Hackして 乗っ取った ちょっぴり Hook してみた(えへ) コードが呼ばれるようにしてみよう。 • つまり Win32 API 自体を Mock 化してみよう。
  17. 17. !!CAUTION!! • この技を追求しすぎると、人は時として、暗黒面に 堕ちます。 • 通報されたり、タイーホ されないように・・・ • 実際、この hack をした mat 氏の mixi 名はある日「ダース・フモフモ」に 変わってました。
  18. 18. IAT書き換え • さぁ、今回は IAT (Import Address Table) を書き換え てみましょう。 • 参考文献: • 今回は技術的な詳細には触れません。気になる方 は私に直接声かけてくださいませ。
  19. 19. ケース1 • ::GetDiskFreeSpaceEx() API を使って、ディスクの 空き容量をチェックし、閾値 _以上_ なら true を返 すメソッドをテストしたい。 • テストコード内で巨大なファイルを touch するなど の方法が考えられますが、閾値付近に制御するこ とは非常に難しい。
  20. 20. 実行例1 - Hook無し Hookしていないと、容量が足りない 場合のテストコードが試せない
  21. 21. 実行例1 - Hook有り Hookして、少ない容量を返すように するとテストパス
  22. 22. ケース2 • Web アプリ系でも問題になるテスト時の pseudo DB。Windows では簡単な値の永続化はレジストリ を使って行います。 • レジストリアクセスの API は ::RegQueryValueEx() ですが、これを Hook すればOK。(もちろん Open/Close 用の API も Hook します)
  23. 23. 実行例2 - Hook有り HKLM を書き込み権限で Open できて しまうユーザでテストしているので Open失敗の場合のテストが出来ない
  24. 24. 実行例2 - Hook有り Hookして、Openが失敗するようにし てみるとテストパス
  25. 25. and so on • この他にも、Win32 API の挙動を制御してユニット テストしたいケースはあると思います。(例:ウィ ンドウ位置調整など) • こういった場合に今回紹介した手法は使えるかも しれません。
  26. 26. まとめ
  27. 27. Win32 API Hook で ユニットテスト してウハウハ
  28. 28. でもダークサイド に堕ちちゃいやん
  29. 29. PCアプリ屋さん はもっとコミュニ ティに参加しよう
  30. 30. 以上。
  31. 31. ヨンキュー! ご清聴ありがとう mixi コミュ: ヨンキュー普及委員会 もよろしく
  32. 32. おまけ まだ終わってなかった時の
  33. 33. 先日、私が関わっているプロジェクトの 最初のイテレーションが終わりましたが、 その時のバーンダウンチャートです。 4つのモジュールがあります。
  34. 34. トレンドはいいけど、最初に沢山設定しす ぎましたね。
  35. 35. 平坦部分が気になるけど、最後は収束。 タスク粒度の問題か。
  36. 36. そ、その日にいったい何が・・・
  37. 37. どこから始まってんねん!
  38. 38. ホントに おしまい

×