ユニットテストの直交性対ユニットテストの簡潔さ


14

ビデオゲームのステアリングシステムの単体テストを書いています。システムにはいくつかの動作があります(理由Aのためにこの領域を避け、理由Bのためにこの領域を避けてください。それぞれが領域のマップに少しのコンテキストを追加します。

動作の単体テストの書き方を決めるのに苦労しています。TDDが示唆しているように、私はその振る舞いが望ましい動きにどのように影響するかだけに興味があります。たとえば、avoid-because-of-reason-Aは、悪い位置を示唆する位置からの移動をもたらすはずです。実際には、ビヘイビアーがマップにコンテキストを追加する方法や理由は気にしません。目的の動きが位置から離れているだけです。

したがって、各動作のテストでは、動作を設定し、マップに書き込むようにし、マップ解析関数を実行して目的の動作を実現します。その動きが私の仕様を満たしているなら、私は幸せです。

ただし、現在のテストは、正しく動作する動作と、正しく機能するマップ解析機能の両方に依存しています。解析機能が失敗した場合、数回ではなく数百回のテストに失敗します。多くのテスト作成ガイドは、これが悪い考えであることを示唆しています。

ただし、マップをモックアウトすることで動作の出力に対して直接テストする場合、確実に実装に緊密に結合していますか?わずかに異なる動作を使用して、マップから同じ目的の動きを取得できる場合、テストは合格します。

だから今、私は認知的不協和音に苦しんでいます。これらのテストを構成する最良の方法は何ですか?


...魔法の答えがあるかどうかわからない。基本的に、破損する可能性のあるものをテストします。したがって、理想的には、低レベルのテストが独自の低レベルの単体テストを必要としない高レベルのテストで既に十分にカバーされていることを、何らかの形で魔法のように伝えることができます。別の見方をすると、テストが失敗してから開発者が問題を修正するまで、どれくらい時間がかかりますか?この時間を短くしたいです。ユニットを実行せず、完全な機能テスト(完全な高レベルのカバレッジ)のみを実行した場合、その時間は依然として高すぎます。ヒューリスティックガイドとして使用してみてください。
カルフール14年

回答:


10

理想的な世界では、まったく同じレベルの抽象化で、完全に直交する単体テストのセットが実際にあります。

現実の世界では、通常、アプリのさまざまなレベルでテストが行​​われるため、多くの場合、高レベルのテストは専用の低レベルのテストでもテスト済みの機能を実行します。(多くの人は、単体テストよりもこのような高レベルのテストサブシステム/統合テストを呼び出すことを好みますが、それでも同じ単体テストフレームワーク上で実行できるため、技術的な観点からは大きな違いはありません。)

これは悪いことではないと思います。ポイントは、「理想的な方法」に固執するのではなく、プロジェクトと状況に合った最良の方法でコードをテストすることです。


私は、著者の主なポイントは、あなたがこれらのより高いレベルのテストのためにスタブ/モックまたは実際の実装を使用する必要があるかどうかを推測した
SiberianGuy

2

この種のテストは、モックが発明された理由です。主なアイデア:オブジェクト(マップ、動作、キャラクターなど)のモックを作成し、実際のオブジェクトの代わりにそのモックを使用してテストを作成します。モックスタブと呼ばれることもありますが、両方に別の言葉があると思います。

あなたの場合、振る舞いをテストする必要があるときはいつでもマップのモックを書き、マップをテストするときはいつでも振る舞いの他のモックを書きます。モックは、モックしている実際の動作よりもはるかに単純で、そのテストに実際に必要なメソッドまたは変数のみを組み込むことが理想的です。テストごとに異なるモックを作成する必要がある場合や、一部のモックを再利用できる場合があります。とにかく、それらはテストに適しているべきであり、実際の動作にできるだけ似せようとすべきではありません。

マップまたはビヘイビアのいくつかの例を含めた場合、おそらく誰かが作成できるモックの例を提供できます。私ではなく、Pongよりも高度なビデオゲームをプログラミングしたことがないので、それでも本を追っていましたが、ユニットテストとゲーム開発の両方に精通している人がいるかもしれません。


0

ユニットよりもはるかに高いレベルのものをテストしようとすると思います。

ほとんどの動作テストでは、正常に動作するかどうかを判断するために、その背後にあるインテリジェンスが必要になります。これは、自動テストを使用して簡単に行うことはできません。


これが私が簡潔さについて言及した理由です。動作内のコードの個々の行をテストする小さなユニットテストを非常に簡単に記述できますが、それはマップ解析関数の出力の読み取りに依存します。私の行動テストはどれも大きくなく、それぞれが動作の機能の一部のみをテストします。
-tenpn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.