20101114

11
Test Hook 20101114日日曜日

Transcript of 20101114

Page 1: 20101114

Test Hook

2010年11月14日日曜日

Page 2: 20101114

Test Hookとは?

if (TEST){ ....} else { ....}

2010年11月14日日曜日

Page 3: 20101114

• コードは他のクラス等に依存する。

• ユニットテストを部品として保つためには、その依存性を分離している必要がある。クラス名の形式がコード中にハードコードされていると、そのような分離は困難になる。

• Test Hookはテスト自動化における、テストのための振る舞いを導入するための最終手段。

2010年11月14日日曜日

Page 4: 20101114

 How it Works

• SUTがテストのための振る舞いをサポートするために、SUTやDOCに直接のフックを導入する。

• これはある種のtesting flagを使用し、必要な箇所でチェックすることによって実装される。

2010年11月14日日曜日

Page 5: 20101114

When to Use It

• 時として、このような最終手段を取ることができる。それは、Dependency

LookupやDependency Injectionのような方法が取れない場合。

• 依存性のハードコードに端を発する、「テストされないコードに対応するために、Test Hookを使用する。

2010年11月14日日曜日

Page 6: 20101114

• Test Hookはオブジェクトや、関数ポインタなどの動的バインディングをサポートしない言語でTest Doubleの動きを導入するためだけの方法ではない。

2010年11月14日日曜日

Page 7: 20101114

• Test Hookはレガシコードをテストの傘に置くときにも使うことができる。

• リファクタリング中にTest Hookを使うことによってテスタビリティを確保し、テストをセーフティーネットとすると、さらにtestabilityを向上できる

• ある段階に達したら、私たちを保護するモダンなテストが十分用意できたら、それまで必要だったTest Hookを取り除くことができます。

2010年11月14日日曜日

Page 8: 20101114

• Test Hookのエッセンスは、テストしたいSUTにコードを挿入すること

• 本体のオブジェクトの代わりにTest Doubleをコントロールする処理に回すか

• リアルのオブジェクトにTest Doubleを配置する

• プロダクションでは、本体オブジェクトに以上するtest-

specific Decoratorを配置する。

Implementation Notes

2010年11月14日日曜日

Page 9: 20101114

• テスト中であることを指すフラグは、コンパイル時の定数が使われ、コンパイラによって、テスト用のロジックは最適化されることになる。

• プリプロセッサやコンパイラのマクロをサポートする言語では、コードがproducion phaseに入った時に、Test Hookを取り除くことができる。フラグは設定用のデータやグローバル変数から参照することができる。

2010年11月14日日曜日

Page 10: 20101114

• SUTが返す現在日時に依存するため、midnightの時だけ通る

• SUTが時間を受け取るクラスをハードコードしているため、DOCをTest

Double によって置き換えることができない。

Motivating Example

2010年11月14日日曜日

Page 11: 20101114

• 可能であるなら、testing flagをグローバル変数として導入することにする。

• このやり方はテストであることを示すために、ビルドのステップで分離することが必要になる。

• この方法は設定のパラメータや、メンバー変数を使う場合に比べて、コンパイラによる最適化を効かすことができるため、より安全です。

2010年11月14日日曜日