正しくレンダリングされたものをテストするにはどうすればよいでしょうか?
-
20-09-2019 - |
質問
アプリケーションが何かを正しくレンダリングしたかどうかをテストするにはどうすればよいでしょうか?
例 (2D の例):
Microsoft Word 2007 http://img32.imageshack.us/img32/6197/37841144.png
影が正しく配置されたこと、または正しい色や輪郭がレンダリングされたことはどのようにしてわかるのでしょうか?あるいは、ある方向に回転したときに 3D 効果が正しくレンダリングされるかどうか?他に考えられるのは、アートという言葉のサイズが変更された場合、その「正しさ」をどのように測定するかということです。
解決
いくつかの方法があります:
- 実際に何をレンダリングする必要があるのか、そして正確にどの方法でレンダリングするのかが非常に正確に指定されている場合は、ピクセルをリファレンス レンダリングと比較するだけで済みます。
- SVG などの場合は、それほど明確に指定されていません。ここでの通常のアプローチは、リファレンス レンダリングを使用し、手動で比較することです。両方を重ね合わせたり、一方を他方から差し引いたりして、明らかな違いを見つけることが簡単にできます。ただし、これは自動的なプロセスではありません。
- 画面上の画像を直接見るのではなく、描画された画像を表すデータを見ることができます。描画されるのは(あなたの例では)ベクターグラフィックです。つまり、明確に定義されたプロパティ、形状、色を持つ必要がある形状がいくつかあり、形状データを参照と簡単に比較できます。そういったことは自動的に行うことができます。Google も同様のアプローチを使用して、Chrome のレンダリングを Web ページのリファレンス レンダリングと比較していると思います。ピクセルデータを比較するのではなく、ブラウザが何をどのように比較するかというより高レベルのデータを比較します。 するだろう 与える。
他のヒント
2つの方法があります。イメージとレンダリング基づくものが
画像方法:あなたは(あなたがポップアップする実際のUIなしで、すなわち、あなたのテストの「ヘッドレス」を実行することができます)内部のピクセルバッファに画像を描画する方法を見つける必要があります。
。そして、いくつかのピクセルを選択して、その色が正しいことを確認してください。あなたの例では、レンダリングが漏れないことを確認するために、テキストの周りに白画素のカップルを選択します。 assertThatRectangleIs(area, color)
のようなヘルパーメソッドは、いくつかの地面をカバーするのに役立ちます。アイデアは、(Hの左側の縦棒のような)特定の領域を選択して、あまりにもうるさいではないとされています。
レンダリングベースの方法は、あなたのGFXライブラリ作品前提で動作します。それでは、あなたがやっていることは、あなたがこのようなもので、実際のレンダリングコードをモックです。
public class MockGC extends GC {
List<Op> ops = new ArrayList<Op> ();
void drawLine (int x1, int y1, int x2, int y2) {
ops.add(new Line(x1, y1, x2, y2, copyGC (gc)));
}
}
あなただけのコマンドと比較しやすいデータ構造内の関連するすべてのオプションを保存して。あるいはます:
public class MockGC extends GC {
StringBuilder buffer = new StringBuilder ();
void drawLine (int x1, int y1, int x2, int y2) {
buffer.append("line "+x1+","+y1+" - "+x2+","+y2+", color="+foreground()+"\n");
}
}
後で、そしてちょうど正しい描画命令が発行され、GC(色、フォント、ヒントをレンダリング)を用いたことをされていることを確認することができます。
後者の方法は、はるかに速く、コードの100%正確なずっと多くの作業である。