12

JOGL を使用して GUI の大部分を提供する Java アプリケーションがあります。

OpenGL アプリケーション (より具体的には JOGL を使用するアプリケーション) のテストを自動化できる、知っている、または使用したことがあるツールはありますか?

更新するだけです: このツールは、Linux または Windows で実行できます。

4

3 に答える 3

10

以前に C++ (Linux 上の Qt) と OpenGL の単体テストを作成したことがあります。Javaでも機能しない理由はわかりません。

私のために働いたものは次のとおりです。

  • OpenGL コンテキスト プロバイダーを抽象化して、コードの残りの部分が OpenGL コンテキスト プロバイダーから独立するようにします。私の場合、メイン アプリは Qt の QGLWidget を使用しましたが、単体テストでは pbuffer ベースのものを使用しました。これは、ウィンドウ インフラストラクチャをまったく使用せずに作成できました (指定された X11 DISPLAY 以外)。後で、「オフスクリーン Mesa」(純粋なソフトウェア OpenGL 実装) を追加して、GPU がまったくないヘッドレス ビルド マシンでも動作するようにしました。

  • OpenGL コードを GUI コードから独立させてください。私の場合、OpenGL の「レンダリング エンジン」は Qt クラス (マウス イベントなど) について何も知りませんでした。特定の GUI の概念に縛られていない独自のテスト可能な API を定義し、そのためのテストを作成します。

  • 単体テストでは、glReadPixels を使用してフレームバッファからコンテンツを読み戻し、どのピクセルが特定の値であるべきかについていくつかのアサーションでそれらをヒットするか、回帰テスト ルートをたどって、フレームバッファ キャプチャを、保存されている適切な画像と比較します (手動検証によるか、他の参照モデルから生成されたものです)。

  • 画像回帰テストでは、多少のあいまいさを許容してください。ほとんどの OpenGL 実装では、わずかに異なる出力が生成されます。

  • (私はこれをしませんでしたが...) 理想的には、GUI アクティビティに応答して、レンダリング エンジンへの期待される呼び出しシーケンスを行うことをアサートすることによって、GUI レイヤーをテストできるようにしたいと考えています。それが行われ、上記のテストによりレンダー レイヤーに自信がある場合は、実際にレンダリングを行う必要はありません。そのため、GUI テスト時に使用するレンダリング レイヤーの適切なモック オブジェクトを作成します (「マウスをここからそこにドラッグすると、レンダリング レイヤーが呼び出されて特定の変換行列が設定される」などのテストを想像します...そのようなもの)。

于 2009-10-21T21:52:27.653 に答える
3

スクリーンショットで画像認識技術を介して UI 自動化を実行するSikuliを使用して、JOGL ベースのアプリケーションをテストできます。

現在、Sikuli を使用して、主にNASA Worldwind Java SDK (JOGL に基づく)に基づく Java アプリの機能テストを行っています。Sikuli Java APIを使用して、私のテスト スイートは OpenGL キャンバス内のアイコンを認識し、それらをクリックしてドラッグすることもできます。Sikuli は、OCR を介してキャンバスからテキストを認識して抽出することもできますが、このパフォーマンスは、(テキストの言語、フォント、サイズ、および背景色によって) 少し行き当たりばったりのようです。

ウィンドウ ツールキット (Swing、SWT、ネイティブ Windows など) をイントロスペクトすることで機能する他のツールを使用して多くの自動化された UI テストを行ったところ、Sikuli はそれらよりもはるかに遅く実行されることがわかりましたが、画像処理の量を考えると理解できます。舞台裏で行う必要があります。また、Sikuli では現在、アプリケーションをウィンドウで実行する必要があることに注意してください (全画面モードではありません)。

Sikuli は Windows と Linux の両方で動作します。試してみることをお勧めします。OpenGL ベースのアプリケーションのこのレベルの機能テストを実行できるツールは他に見つかりませんでした。

于 2013-03-21T02:38:26.507 に答える
2

PDiffなどの画像差分ツールを使用して OpenGL コードをテストし、スナップショットを作成してディスクに保存し、以前の回帰出力と比較することを考えていました。そうすれば、本当に悪いもの (欠落しているテクスチャ) がポップアップしますが、人間には気付かないもの (上記の実装間の小さな違いなど) は問題なく処理されます。

また、ユーザーの操作を自動化するには、イベントを送信したり、ボタンの「クリック」を呼び出したりできるように GUI クラスを十分に開いておくか、アプリに OS イベントを手動で挿入する必要があります。これは可能ですが、はるかに面倒です。オープン ソースの場合、GUI レイヤーを開く方が簡単かもしれません。

于 2009-10-25T10:14:56.637 に答える