1

これが私のコードだとしましょう:

public void render(){
    GL11.glClearColor(0, 0, 1, 1);
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    GL11.glColor3f(.5f, .5f, 1.0f);
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glVertex3f(0,0,0);
        GL11.glVertex3f(50,0,0);
        GL11.glVertex3f(50,50,0);
        GL11.glVertex3f(0,50,0);
    GL11.glEnd();
}

正方形が正しい場所に正しい色で描かれていることを確認する単体テストを作成するにはどうすればよいですか? フレームごとに画面がクリアされるなどのテストも行う必要がありますか? 私は正方形のコードから openGL コードを抽象化することを考えていました。言い換えれば、「ベクトル」を作成するクラスを作成し、そのレンダリング関数が画面に描画され、それをテストしませんでした。ただし、すべてのパブリック関数をテストする必要があります。すっごく戻ってくると思います:openGLで画面に何が描かれたかをどうやって知ることができますか?

また、考えてみると、テストを実行するたびにアプリを実行するべきではありません。これにより、別のレベルの複雑さが生じる可能性があります...

4

2 に答える 2

1

レンダリング動作のテストは非常に困難です。ユニット/統合テストは、画面を調べて何かが正しく見えるかどうかを確認するのが非常に苦手です。

あなたの最善の策は、Powermockのようなものを使用して静的なOpenGL呼び出しを傍受することだと思います(彼らのWebサイトにはその種の情報がたくさんあるので、ここでそれを行う方法については説明しません)。

ただし、呼び出しを調べて、正しいものが呼び出されたかどうかを判断できます。

于 2012-08-20T02:37:39.037 に答える
1

もちろん、GL11ライブラリを別のアダプタでラップしてから、そのアダプタをモックアウトする必要があります。次に、クラスが正しい座標と正しい色を通過することを示すことができます。(または、PowerMockを使用することもできますが、正直なところ、私はMockitoとモックインターフェイスの方が好きです)。

ベクトル抽象化を使用する場合は、同じことを実行してそれをテストすることもできます。GL11のラッパーは、実際に画面に描画しないと単体テストを実行できないため、検査するだけで正しいことを確認できるように、十分に小さくシンプルである必要があります。他の場所で使用する場合にのみ、その追加の抽象化を作成します。

クラスが「正しい」ことを示し、「正しい」場所に正方形を描く限り、レンダリング動作のテストは困難であり、美的IMOのテストは手動でのみ行う必要があります。そのことを念頭に置いて、ベクトル抽象化を作成しない場合は、座標間の距離が同じであることを確認して「正方形」にし、それを1日と呼びます。これにより、テストを柔軟に保つことができます。必要に応じて、正方形のサイズと色を簡単に変更できます。

これらは単なるオプションです。自動テストは、少なくとも1回は手動でテストすることに代わるものではありません。あなたが見ている振る舞いが、とにかくそれを変更するたびに常に手動でチェックするものであり、振る舞いに影響を与える可能性のあるものから抽象化されている場合(したがって、回帰バグを作成することはできません)、それほど心配する必要はありませんそのユニットテストを作成し、手動で確認するだけです。

于 2012-08-20T13:25:43.433 に答える