Grafikgenerierung mit JUnit testen

8

Ich verwende Graphics2D von Java, um eine grafische Darstellung eines Graphen zu erzeugen. Ich verwende auch ImageIO, um eine PNG-Datei zu schreiben. ( ImageIO.write(image, "png", out); )

Ich frage mich, wie ich JUnit-Tests schreiben soll, um zu testen, ob die generierten Grafiken das sind, was erwartet wird. Ich könnte die PNG-Dateien vorgenerieren, aber was, wenn die Schriftart auf einer anderen Maschine ein wenig anders ist?

    
PeWu 03.08.2010, 20:48
quelle

4 Antworten

1

Sie könnten versuchen, nach bestimmten bekannten Funktionen des Ausgangs zu suchen, z. B .:

  • Gibt es dort ein weißes Pixel bei (100,100)?
  • Ist die Grenze komplett schwarz?
  • Ist das Bild die erwartete Größe?

Und / oder Sie könnten Tests für einige "Aggregateigenschaften" schreiben, die eine gewisse Unschärfe in den Ergebnissen ermöglichen:

  • Passt das Bild mindestens zu 90% zum Referenzbild? (um verschiedene Schriftarten, Antialiasing - Unterschiede usw.) zu ermöglichen.
  • Ist die am häufigsten verwendete Farbe im Bild gleich der Hintergrundfarbe?
mikera 03.08.2010, 21:08
quelle
2

Für mich scheint diese konkrete Umsetzung zu funktionieren:

%Vor%

Ich lade BufferedImage von meinem PNG (als Byte []) mit ImageIO:

%Vor%     
RobertG 23.06.2014 10:58
quelle
1

Sie könnten alle RGB-Werte der generierten Bilder in ein Array einlesen und dieses 2D-Array mit einem, das ein vorgeneriertes Bild darstellt, vergleichen, wenn Sie das gesamte Bild wirklich genau kennen.

Wenn Sie die Schriftarten ignorieren möchten, können Sie dasselbe für Regionen des Bildes tun, die keine variablen Daten enthalten, abhängig von der Umgebung, in der die Bilder generiert werden. Die Erstellung von Korrektur- und Normalisierungsroutinen für Komponententests wäre Zeitverschwendung, es sei denn, die Anwendung würde Bilder mit einer so hohen Genauigkeit erzeugen, wie dies gerechtfertigt ist.

    
Vineet Reynolds 03.08.2010 21:21
quelle
1

Ich habe festgestellt, dass es effektiv ist, um gerenderte Schriften für plattformübergreifende Tests von einfachen Dingen wie Text auf einem statischen Bild plattformübergreifend identisch zu machen.

  1. Geben Sie Font und FontRenderContext in die Klasse ein, die die Schriften rendert, damit sie im Test kontrolliert werden können.
  2. Liefern Sie eine .ttf-Datei zum Komponententest und verwenden Sie Font.createFont() , um eine Schriftart aus der Datei zu generieren.
  3. Deaktivieren Sie im Unit-Test das Anti-Aliasing im verwendeten FontRenderContext . Wenn Sie diesen Schritt überspringen, variieren die Ergebnisse scheinbar plattformübergreifend.

Ich bin neugierig, ob andere denken, dass dies aus irgendeinem Grund spröde oder fehleranfällig ist, aber ich habe bisher gute Ergebnisse damit erzielt.

    
The111 19.11.2016 20:41
quelle

Tags und Links