視覚化(3Dグラフィックス)フレームワークの単体テスト


8

これはこの質問のフォローアップです。科学的アルゴリズムのライブラリがあるときに、ユニットテストを行う方法を尋ねていました。現在、同様の問題がありますが、プロジェクトが異なります。

私は、DirectX、OpenGl、WebGl、Silverlight、WPFの3Dグラフィックエンジンフレームワークの抽象化に取り組んでいます。シナリオは次のとおりです。このプロジェクトは、同じオフィスで作業している私の同僚の小さなチームによって開発されています。私たちは皆、コンピューターサイエンティストであり、ソフトウェアエンジニアリングコミュニティや実践にはあまり関与していません。SubversionからGitに切り替えて、プロジェクトをCodeplexに公開することを説得するのに苦労しました。プロジェクトは大きくなり(C#の約80K行)、現在はShader Model 5.0までのほとんどのDirectXとOpenGlをカバーしているため、リンクされた質問で説明されているような1人のプロジェクトではありません。また、オープンソースコミュニティとのコラボレーションを促進したいと考えています。

これまでのところ、すべてのデバイスとリソースの初期化、シーンの設定、描画を含む小さなアプリケーションを作成してテストしてきました。問題は、それを異なるものにする方法がわからない、つまり、リソースの割り当て、プリミティブテセレーション、シェーダーコンパイルなど、フレームワークの特定の機能をテストする小さなテストケースを設計する方法です。エンジン全体の初期化。これらのケースのいくつかでは、便利なモックを考えることができますが、一般的に、出力がビジュアル(イメージ、またはアニメーションシーン)の場合、レンダリングアルゴリズムの正確さをどのようにテストできますか?現在、私たちが考え出した最も賢いことは、同じシーンをソフトウェアレンダラーであるDirectXとOpenGlにレンダリングし、それらをピクセルごとに比較することです。

では、ここでの「正しい」テストアプローチとは何でしょうか。


ピクセルごとの比較で許容レベルを実装することもできますが、それは誤検出対誤検出のゲームであり、コードだけでなく、DirectX / OpenGL実装も部分的にテストします(したがって、実際には単体テストではありません)。ほとんどの「通常の」シナリオでは、ターゲットAPIをモックして、想定どおりに呼び出されるようにする必要があります。レンダリングコードがさまざまなAPIを直接呼び出す場合は、パフォーマンスのペナルティはあるものの、おそらく独自の中間層(モック可能)を導入できます。
Daniel B

また、Doc Brownの答えは本質的に正しいと私は信じています。(理想的には)独立してテストできる本当に独立した部分があるはずです。しかし実際には、単体テスト可能性のためにソリューションをゼロから構築していない場合、これを改造するのは難しいかもしれません。
Daniel B

@DanielB:80Kのコードが既に存在することを読んだときに私が思ったとおりです。これはレガシーコードです(Michael Feathersが定義しているように)-テストなしのコードです。そして、このような状況のための標準的な本は常にあるamazon.de/Working-Effectively-Legacy-Robert-Martin/dp/...
ドク・ブラウン

回答:


8

「正しい」テストアプローチは、DirectXまたはOpenGLの呼び出しから描画ロジックを分離することです。これにより、後者をモックアウトできます(別のユースケースとして、DirectXまたはOpenGLのどちらかに同じビジネスロジックを使用します)。

DirectXまたはOpenGLが正しく機能しているかどうかをテストする必要はありません。これはMicrosoftの仕事です。また、デバイスの初期化コードを1回だけ記述してテストした後、再利用する必要があるため、その部分の手動テストを手頃な価格で行う必要があります。そのパーツも自動的にテストしたい場合は、ピクセル単位のアプローチを使用しますが、非常に単純なテスト描画を使用します。したがって、分離された描画ロジック用の自動回帰テストの作成に焦点を当ててください。これにより、最大のメリットが得られます。

したがって、全体のアイデアは、コードを本当に独立したコンポーネントに分割することです。DirectXの初期化を描画ロジックに結合しないでください。描画ロジックはDirectXに依存しないようにする必要があります。これにより、プログラムがテスト可能になります。

編集:OpenGLコードのユニットテストに関するこの以前の投稿を見つけました、答えはほんの少しでしたが、おそらくいくつかの追加の洞察をもたらすでしょう。


このアプローチは、このライブラリの内容の大部分をカバーしていないようです。
Kris Van Bael 2013

@KrisVanBael:おそらく、そうでないかもしれませんが、あなたは推測しているだけです。しかし、あなたが正しい場合のために、テストのアプローチについてより良い提案をしてください。
Docブラウン

@DocBrownに感謝します。フレームワークは特定のAPI実装から多くのインターフェースを介して分離されており、依存関係注入を随所に使用してリソースマネージャー、レンダラー、コンパイラーなどを解決しているため、DirectXでメッシュを作成して視覚化することができます。 OpenGL。では、フレームワーク全体と単体テストをモックする一種の「ソフトウェア実装」を作成する必要があるとおっしゃっていますか いい感じ。DirectXもOpenGLもテストしないでください。中間層だけをテストすることに同意します。
アレハンドロピアド2013

@AlejandroPiad:象を食べる方法?一度に一口。開発ロードマップに沿ってテストを追加し、次に変更するプログラムの部分をテストします。プログラムは1週間でビルドされなかったため、テストフレームワークはその時間内にビルドされません。
Doc Brown

1
@DocBrownに感謝します。理解できたと思います。最初に重要な部分のモックを開始し、追加するすべてのものがテストを念頭に置いて設計されていることを試します。
アレハンドロピアド2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.