狠狠撸

狠狠撸Share a Scribd company logo
攻略 UnitTest
with Win32 API
2006.1.13
あまのりょー
自己紹介
like.no.other
? こんにちは、あまのりょーです。おかげ様で、順調
に復活しています。cf.) XP祭り2005
? とあるメーカー系ソフトハウスでメディア系のア
プリケーションを作っています。
? ホントは Mac OS が得意&やりたいんですけど、
仕事ではやっぱり Windows の仕事が多いです。
orz
? 永和の天野さんとの区別の方法を日夜研究中です。
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 だ。(たぶん BCB でもイケル)
? CppUnit を使ってユニットテストしている。
(たぶん boost::unit_test_framework でもイケ
ル)
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の高い設計が、よいオブジェクト指向設計である。
そうはいっても
? 最後には 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()
ですが、これを Hook すればOK。(もちろん
Open/Close 用の API も Hook します)
実行例2 - Hook有り
HKLM を書き込み権限で Open できて
しまうユーザでテストしているので
Open失敗の場合のテストが出来ない
実行例2 - Hook有り
Hookして、Openが失敗するようにし
てみるとテストパス
and so on
? この他にも、Win32 API の挙動を制御してユニット
テストしたいケースはあると思います。(例:ウィ
ンドウ位置調整など)
? こういった場合に今回紹介した手法は使えるかも
しれません。
まとめ
Win32 API
Hook で
ユニットテスト
してウハウハ
でもダークサイド
に堕ちちゃいやん
PCアプリ屋さん
はもっとコミュニ
ティに参加しよう
以上。
ヨンキュー!
ご清聴ありがとう
mixi コミュ: ヨンキュー普及委員会 もよろしく
おまけ
まだ終わってなかった時の
先日、私が関わっているプロジェクトの
最初のイテレーションが終わりましたが、
その時のバーンダウンチャートです。
4つのモジュールがあります。
トレンドはいいけど、最初に沢山設定しす
ぎましたね。
平坦部分が気になるけど、最後は収束。
タスク粒度の問題か。
そ、その日にいったい何が???
どこから始まってんねん!
ホントに
おしまい

More Related Content

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