3.19. Layout - gerenderte Seitenausschnitte

Überblick

Vergleiche kompletter Seiten als gerenderte Bilder bereiten dann Schwierigkeiten, wenn sich auf einer Seite wechselnde Inhalte befinden. Der typische Vertreter für wechselnde Inhalte ist ein Tagesdatum.

Die Syntax für den Vergleich eines gerenderten Seitenausschnitts mit einer Bildvorlage ähnelt der Syntax für den Vergleich einer vollständigen Seite. Sie ist lediglich um eine Positionsangabe für die linke obere Ecke erweitert, mit der das Bild auf der Seite positioniert wird. Der Vergleich selber findet nur auf der Fläche statt, die der Größe des Bildes entspricht.

// Compare rendered page(s) with a given image. 
// The left-upper corner is defined by the given x/y values.
.asRenderedPage(..).isEqualToImage(upperLeftX, upperLeftY, FormatUnit, BufferedImage)
.asRenderedPage(..).isEqualToImage(upperLeftX, upperLeftY, FormatUnit, File)
.asRenderedPage(..).isEqualToImage(upperLeftX, upperLeftY, FormatUnit, imageFileName)
.asRenderedPage(..).isEqualToImages(upperLeftX, upperLeftY, FormatUnit, BufferedImage)
.asRenderedPage(..).isEqualToImages(upperLeftX, upperLeftY, FormatUnit, File)
.asRenderedPage(..).isEqualToImages(upperLeftX, upperLeftY, FormatUnit, imageFileName)

Beispiel - Linker Rand auf jeder Seite

Wenn Sie prüfen wollen, ob der linke Rand jeder Seite mindestens 2 cm breit unbedruckt ist, können Sie das folgendermaßen testen:

@Test
public void compareAsRenderedPage_LeftMargin() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  String fullImage2cmWidthFromLeft = "images/marginFullHeight2cmWidth.png";
  int leftX  = 0;
  int upperY = 0;
  
  AssertThat.document(filename)
            .restrictedTo(EVERY_PAGE)
            .asRenderedPage()
            .isEqualToImage(leftX, upperY, MILLIMETERS, fullImage2cmWidthFromLeft)
  ;
}

Die Bilddatei, 2 cm breit und genauso hoch, wie eine ganze Seite, ist leer. Genauer gesagt, enhält sie die Hintergrundfarbe einer Seite. Das Beispiel prüft also, ob der Rand jeder Seite des Dokumentes ebenfalls leer ist.

Jeder Ausschnitt benötigt eine x/y-Position auf der Seite des PDF-Dokumentes. Die Werte 0/0 entsprechen der linken oberen Ecke einer Seite.

Es wird davon ausgegangen, dass jede Seite das gleiche Format hat. Wenn Sie den Seitenrand eines Dokumentes mit unterschiedlichen Seitengrößen testen wollen, müssen Sie für jede Seitengröße einen eigenen Test schreiben.

Beispiel - Logo auf Seite 1 und 2

Sie wollen überprüfen, dass sich das Firmenlogo auf den ausgewählten Seiten an der erwarteten Position befindet:

@Test  
public void verifyLogoOnEachPage() throws Exception {
  String filename = "documentUnderTest.pdf";
  String logo = "images/logo.png";
  
  int leftX  = 135;                                          1
  int upperY =  35;
  PagesToUse pages12 = PagesToUse.getPages(1, 2);            2
  
  AssertThat.document(filename)
            .restrictedTo(pages12)
            .asRenderedPage()
            .isEqualToImage(leftX, upperY, MILLIMETERS, logo) 3
  ;
}

1

X/Y-Koordinaten der linken oberen Ecke des Seitenausschnitts definieren

2

Seiten auswählen, siehe Kapitel 13.2: „Seitenauswahl“

3

Vergleichsmethode aufrufen

Mehrfache Vergleiche

In einem Test können mehrere Bildvergleiche auf mehreren Seiten gleichzeitig durchgeführt werden:

@Test
public void compareAsRenderedPage_MultipleInvocation() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  String fullImage2cmWidthFromLeft = "images/marginFullHeight2cmWidth.png";
  int ulX_Image1 = 0;  // upper left X
  int ulY_Image1 = 0;  // upper left Y

  String subImagePage3And4 = "images/subImage_page3-page4.png";
  int ulX_Image2 = 480;
  int ulY_Image2 = 765;
  
  PagesToUse pages34 = PagesToUse.getPages(3, 4);

  AssertThat.document(filename)
            .asRenderedPage(pages34)
            .isEqualToImage(ulX_Image1, ulY_Image1, POINTS, fullImage2cmWidthFromLeft)
            .isEqualToImage(ulX_Image2, ulY_Image2, POINTS, subImagePage3And4)
  ;
}

Sie sollten sich aber überlegen, ob es nicht besser ist, hierfür zwei Tests zu schreiben. Das entscheidende Argument für getrennte Tests ist, dass Sie unterschiedliche Namen für die Tests wählen können. Der hier gewählte Name ist für den Projektalltag nicht gut genug.