9

Java の Graphics2D を使用して、グラフのグラフィカル表現を生成しています。また、ImageIO を使用して PNG ファイルを書き込んでいます。( ImageIO.write(image, "png", out);)

生成されたグラフィックスが期待どおりかどうかをテストするために、JUnit テストをどのように記述すればよいか疑問に思っています。PNG ファイルを事前に生成することはできますが、別のマシンでフォントが少し異なる場合はどうなりますか?

4

4 に答える 4

2

私にとって、この具体的な実装はうまくいくようです:

private void compareRasterImages(BufferedImage expectedPngIo, BufferedImage actualPngIo) throws AssertionError {
    int minX = expectedPngIo.getMinX();
    int minY = expectedPngIo.getMinY();
    int maxX = expectedPngIo.getMinX() + expectedPngIo.getWidth();
    int maxY = expectedPngIo.getMinY()+ expectedPngIo.getHeight();

    assertEquals(minX, actualPngIo.getMinX()); 
    assertEquals(minY, actualPngIo.getMinY()); 
    assertEquals(expectedPngIo.getHeight(), actualPngIo.getHeight()); 
    assertEquals(expectedPngIo.getWidth(), actualPngIo.getWidth()); 
    for (int x_i = minX; x_i < maxX; x_i++){
        for (int y_i = minY; y_i < maxY; y_i++) {
            assertEquals(expectedPngIo.getRGB(x_i, y_i), actualPngIo.getRGB(x_i, y_i));
        }
    }
}

ImageIO を使用して、PNG から (byte[] として) BufferedImage を取得します。

BufferedImage expectedPngIo = ImageIO.read(new ByteArrayInputStream(expectedPng));
enter code here
于 2014-06-23T10:58:25.643 に答える
1

出力の特定の既知の機能をテストしてみることができます。

  • (100,100) に白いピクセルがありますか?
  • それは完全に黒の境界線ですか?
  • 画像は想定サイズですか?

または、結果のあいまいさを許容するいくつかの「集計プロパティ」のテストを作成することもできます。

  • 画像は参照画像と少なくとも 90% 一致していますか? (異なるフォント、アンチエイリアシングの違いなどを許容するため)
  • 画像で最も一般的な色は背景色と同じですか?
于 2010-08-03T21:08:19.770 に答える
1

完全な画像について本当に具体的な場合は、生成された画像のすべての RGB 値を配列に読み取り、その 2D 配列を事前に生成された画像を表すものと比較することができます。

フォントを無視したい場合は、画像が生成される環境に応じて、可変データを含まない画像の領域に対して同じことを行うことができます。アプリケーションが保証されているほどの高精度の画像を生成することが期待されていない限り、単体テスト用の修正および正規化ルーチンを組み込むことは時間の無駄です。

于 2010-08-03T21:21:41.767 に答える