2009-03-03 12 views
31

notorious Stack Overflow #38 podcastJoel Spolskyでは、JPEG圧縮のようなものでTDDを行うのがどれほど難しいか話しました。ボブ・マーティンwanted to coverポッドキャスト#41のようなインスタンスのTDDを行う方法はありますが、私は彼らがこれまでに得たとは思いません。したがって、TDDとJPEGの圧縮

TDDを使用してJPEG圧縮を開発しテストするにはどうすればよいですか?

+1

としてください、今から私たちは*必ず*「ノトーリアスStackOverflowの#38」としてそれを参照することができますかTNS#38 ;-) –

答えて

70

ジョエルの質問は、このようなものでした。高解像度の画像ではなく、低解像度の画像を表示させるようなビットをどこかに設定したいとします。 TDDを使ってそれを動作させるにはどうすればいいですか?あなたは、画像が低解像度であることを示すために画面を擦ったテストを書くでしょうか?

もちろんです。あなたはすでにJPEGライブラリが動作することを知っています。正しい引数で呼び出すと、低解像度で表示されることはすでに知っています。テストする必要があるのは、設定したビットがJPEGライブラリへの適切な呼び出しに変換されるということです。したがって、テストによって制御される非常に単純なモジュールを使用してJPEGライブラリをモックアウトします。次に、ビットを設定し、表示を要求します。 Mocked JPEGライブラリは、それがどのように呼び出されたかを覚えておき、テストが正しく呼び出されたことを確認することができます。

OK、どうやってJPEGライブラリの内部をテストしますか?私はJPEGレンダリングについてよく分かりませんが、私はそれが圧縮、解凍、およびビットマップに関するものと推測しています。圧縮と解凍は単なるアルゴリズムです。アルゴリズムは、与えられた入力から予測可能な出力を有する。したがって、一連の非常に単純な入力を設定し、予測可能な出力を確実に得ることができます。 JPEGアルゴリズムの内部がカバーされるように入力を設定します。同じロジックがビットマップに適用されます。あなたはそれらをスクリーン上にレンダリングする必要はありません。シンプルなビットマップは、テストで調べることができるメモリバッファにレンダリングすることができます。簡単に言うと、私はSIMPLEを意味します。 3×3、5×5、8×8。シンプル。繰り返しますが、大量のコードをカバーするように入力データを構造化します。

これはロケット科学ではありません。それが完璧な場合はありません。しかし、論理の90%が正しいことを示す50のテストのスイートは、変更を加えたいときに大きな違いを生み出すことができます。

マニュアルテストを完全に排除できますか?もちろん違います。しかし、あなたはで大幅に緩和できます。手作業によるテストを、何千もの厄介なテストプランではなく、非常に戦略的なテストに減らすことができます。

+16

恐ろしく、私はBobおじさんがstackoverflowに加わることになった。これにバッジがあるはずです。 – stimms

+1

ハハ...あなたはそれのバッジを手に入れていないので、少なくともあなたの質問に+1を付けます。 –

+0

より複雑な画像をレンダリングし、既知の結果と比較するためのMD5チェックサムを計算することができます。 –

4

TDDとは、コードやデザインの前にテストがあると考えると、ほとんど不可能です。複雑なアルゴリズムでは、いくつかの結果が必要です。圧縮の場合、結果は手作業で生成するのが難しいです。不可能ではないが、難しい。

また、圧縮には非常に高性能のアルゴリズムが必要です。テストに合格するだけでは十分ではありません。多くの低性能アルゴリズムは、基本的な「正確さ」テストに合格することができます。

正確性を超えて移動するには、アルゴリズムが最適であるという証拠が必要です。これは、テストの世界観以外でのみ開発することができます。テストの結果ではないO何か)を使用する複雑さの分析が必要です。また、テストの結果として明確に定義することもできません。

一方、「テスト容易性」がほとんどのコードの前にあるとすれば、それは簡単です。

  • アルゴリズムを設計します。それが最適であるという証拠を書いてください。

  • アルゴリズムの重要な要素をテスト可能なモジュールとして公開するコードを記述してください。

  • 場合によっては、アルゴリズム全体のテスト結果を生成するコードを記述します。これは、非常に明白であるがゆっくりとしたアルゴリズムで適切な答えを生成する準最適で無差別なコードにすることができます。

  • unittestをアセンブルして、実装が期待されるテスト結果を生成していることを示します。

  • それも最適であることを示すテクニカルペーパーを組み立てます。

これはテストファーストではありません。しかし、それはテスト駆動です。

0

テスト駆動開発が唯一のプログラミングではない、あなたが最初のテストを使用して行うことができます他の多くのものがあり、例が受け入れTDDである、など

が、これはものです、あなたはそれが動作するようにする方法を最初に考えてみてください。このアルゴリズムでは、例のようなものが考えられます。

  • 「これは、10秒で5つの呼び出しを完了しなければならない」

    • その他「は10%と、画像のサイズを小さくしなければなりません」。

    私はそれはあなたが達成したいものを明確に考える人生の唯一の方法であると信じて:D

  • 関連する問題