2010-08-03 22 views
8

Estoy usando Graphics2D de Java para generar una representación gráfica de un gráfico. También estoy usando ImageIO para escribir un archivo PNG. (ImageIO.write(image, "png", out);)Prueba de generación de gráficos con JUnit

Me pregunto cómo debería escribir pruebas JUnit para comprobar si los gráficos generados son los esperados. Podría pregenerar los archivos PNG, pero ¿qué pasa si la fuente es un poco diferente en una máquina diferente?

+2

Bueno, ¿de qué te gustaría estar seguro? –

+0

Buena pregunta :-) Ahora, cuando lo pienso, quizás no sea tan importante probar si la imagen es exactamente como se esperaba, pero si algunas características esperadas están presentes. – PeWu

Respuesta

1

Usted podría tratar de pruebas para funciones específicas, conocidas de la salida ej .:

  • Es allí un píxel blanco al (100,100)?
  • ¿Es el borde completamente negro?
  • ¿La imagen es del tamaño esperado?

y/o usted podría escribir pruebas para algunos "agregados" propiedades que permiten una cierta falta de claridad en los resultados:

  • qué la imagen que al menos el 90% encuentro la imagen de referencia? (para permitir diferentes fuentes, diferencias de antialiasing, etc.)
  • ¿Es el color más común en la imagen igual al color de fondo?
+0

Gracias. Parece una buena idea probar algunas características en lugar de píxeles de mapa de bits. Como se dio cuenta Vineet, también podría haber una diferencia en antialiasing. – PeWu

1

Puede leer todos los valores RGB de las imágenes generadas en una matriz y comparar esa matriz 2D con una que represente una imagen generada previamente, si es realmente específico acerca de la imagen completa.

Si desea ignorar las fuentes, podría hacer lo mismo para las regiones de la imagen que no contienen datos variables, según el entorno donde se generan las imágenes. Construir en las rutinas de corrección y normalización para las pruebas unitarias sería una pérdida de tiempo, a menos que se espere que la aplicación genere imágenes con la precisión requerida.

+0

Puede suministrar un archivo de fuente a la prueba de unidad y deshabilitar el suavizado de la prueba. En mi experiencia, esto produce resultados idénticos incluso en plataformas cruzadas. – The111

2

Para mí, esta aplicación concreta parece funcionar:

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)); 
     } 
    } 
} 

que recuperar el BufferedImage de mi PNG (como byte []) utilizando ImageIO:

BufferedImage expectedPngIo = ImageIO.read(new ByteArrayInputStream(expectedPng)); 
enter code here 
1

He encontrado que esto ser efectivo al hacer que las fuentes renderizadas sean idénticas multiplataforma para pruebas de unidad de gráficos perfectos de píxeles de elementos simples como texto superpuesto en una imagen estática.

  1. inyectar el FontFontRenderContext y en la clase prestar los tipos de letra, por lo que puede ser controlada bajo prueba.
  2. Proporcione un archivo .ttf a la prueba de unidad y use Font.createFont() para generar una fuente desde el archivo.
  3. En la prueba unitaria, deshabilite el suavizado en el FontRenderContext utilizado. Si omite este paso, los resultados varían según la plataforma cruzada que parece.

Tengo curiosidad por saber si esto es frágil o propenso a fallas por alguna razón, pero he tenido buenos resultados hasta el momento.

Cuestiones relacionadas