20100925xutp

19
Configurable Test Double 2010925日土曜日

Transcript of 20100925xutp

Page 1: 20100925xutp

Configurable Test Double

2010年9月25日土曜日

Page 2: 20100925xutp

間接的な入力、間接的な出力としてユニークな値を必要とする場合、Test Doubleを必要とする

Configuration Test DoubleはTest Doubleを再使用することにより、Test Code Dupicationを減少する方法です。

2010年9月25日土曜日

Page 3: 20100925xutp

How It works

Test DoubleはSUTから返されるか、引数として渡すことが期待される値を保持するインスタンス変数といっしょにビルドされる。

テストのsetupのフェーズで、Test Doubleのインターフェースの適切なメソッドを通じて、これらの変数を初期化する。

2010年9月25日土曜日

Page 4: 20100925xutp

When to Use it似ているが少し違う振舞いが(Test Doubleに)必要で、その際にTest Code DuplicationやObscure Testを避けたい場合。

後者(Obscure Test)の場合、Test Double のどのような値が使われているのか注視する必要がある。それが難しいなら、Hard-Coded Test Doubleを使うのもよいでしょう。

2010年9月25日土曜日

Page 5: 20100925xutp

Implemention Notes

Test Double とは、Configuration test Double でもある。

設定可能なTest StubsとTest Spliesの設定は、それらのメソッドが呼ばれたときの応答を設定するのみで済む。Mock Objects の場合は、期待値を設定する方法を用意する必要もある。

2010年9月25日土曜日

Page 6: 20100925xutp

どの方法でConfigurable Test Doubleを構築するか

関係のある2つの独立した決定を含んでいます。

(1)Configurable Test Doubleをどのように構築するか

(2)Configurable Test Doubleをどのようにコーディングするか

2010年9月25日土曜日

Page 7: 20100925xutp

一つ目の方法は、設定のためのインターフェースを用意する方法。

もう一つの方法は、Configuration Test Doubleに二つのモードをもたせて構築する方法です。

2010年9月25日土曜日

Page 8: 20100925xutp

手動で組み立てる。

ついている時は、Configurable Test Doubleを構築する方法が用意されています。(1)コードジェネレーター(2)オブジェクトを実行時に「でっちあげる」ツール。

! http://xprogramming.com をチェックしましょう。

2010年9月25日土曜日

Page 9: 20100925xutp

Configurable Test Doubleに値を設定するメソッドから構成され、Four-Phase Testのfixture をsetupをセットアップするphaseにおいて、これらのメソッドを呼び出すだけで済みます。

SUTは Test Doubleとは違うメソッドを使用します。

Varidation:Configration Interface

2010年9月25日土曜日

Page 10: 20100925xutp

Configuration Interface には二つの流儀がある。

一つは MockMakerのような必要な値それぞれメソッドを用意する方法。

もう一つはJMockのような、期待されるふるまいを作り出すための、汎用的なインターフェースをもっているものです。よくデザインされた、流れるインターフェースが、読解と理解をより容易にする。

2010年9月25日土曜日

Page 11: 20100925xutp

テストメソッドがSUTとエクササイズする前に、どうやってメソッドを呼び出すのか?

record and playbackという形式にたどり着いたときに、この方法はもう少し理にかなったものになる。

Configration Mode

2010年9月25日土曜日

Page 12: 20100925xutp

SUTのそれぞれのメソッドがConfiguration Modeと”usage mode”の二つのパスを持つことを期待される。

2010年9月25日土曜日

Page 13: 20100925xutp

Hand-build Test Double

Hard-Coded Test Double はHand-Build Test Doubleから派生するものであり、hand-builtによるか、生成されたかによる。

この本では、Hand-Build Test Double を例として多用している。

2010年9月25日土曜日

Page 14: 20100925xutp

third party のツールが用意されていない場合や、ツールを使用することに障壁がある場合にも、Hand-Built Test Doublesは使用することができる。

2010年9月25日土曜日

Page 15: 20100925xutp

早期のツールには、静的に生成されたTest Doubleを生成するものがあった。

対象となるクラスのインターフェースに変更が入るたびに、コードを再生成する必要がある。

これは、インターフェースに変更がはいるたびに、自動化されたビルドスクリプトが走ることが保証されている場合に、都合がよい。

Staticaly Generated Test Double

2010年9月25日土曜日

Page 16: 20100925xutp

インターフェースに変更を加えるとき、生成されたコードにどのようにリファクタリングを加えればいいか?

モダンなリファクタリングツールを使えば、生成されたコードもリファクタリングすることは可能。

2010年9月25日土曜日

Page 17: 20100925xutp

だが、引数のチェックロジックや、新しいパラメータへの変数はそのままになってしまう。それゆえに、リファクタリングが完了したあとに、再生成する必要があります。

2010年9月25日土曜日

Page 18: 20100925xutp

最近のツールには、リフレクション機能などを使って、実行時にConfigurable test doubleを生成するものがある。

これらのConfigurable Test Doubleは、振る舞いを実行時に解釈するか、実行可能なコードを動的に生成します。

Dinamically Generaterd Test

2010年9月25日土曜日

Page 19: 20100925xutp

それゆえに、生成され、メンテナンスや再生されるソースコードは存在しない。気を配るべきソースコードが存在しないという利点があるが、疑いの目でみるなら、それは欠点。

今日の大半のツールは、引数がどのように渡されたかに興味がないなら、大半のツールは「気にしないで済む」引数を渡します。Mock Objectsを使うなら、大半の場合Retrieval Interfaceは不要となる。

2010年9月25日土曜日