Zum Inhalt springen

~/CodeBlog.at

BBC Wraith: Visuelle Regressionstests nach einem TYPO3-Upgrade

·4 Min. Lesezeit

Veröffentlicht
Überarbeitet

Was ist neu: Hinweis zum Projektstatus, Erklärung des Ablaufs und Ausblick auf aktuelle Alternativen ergänzt.

Kurz & knapp

BBC Wraith crawlt zwei Versionen einer Website (z. B. Live und lokal nach dem TYPO3-Upgrade), macht Screenshots aller Seiten und zeigt die Unterschiede in einer Galerie. Ablauf: wraith spider configs/spider.yaml erstellt die Seitenliste, wraith capture configs/spider.yaml vergleicht. Das Projekt ist inzwischen archiviert; aktuelle Alternativen sind Playwright und BackstopJS.

Getestet mit: Wraith 4 (bis 2021, Intel-Mac)

Inhalt
  1. So funktioniert Wraith
  2. Konfiguration
  3. Befehle
  4. Wichtig: die Spider-Datei
  5. Ausblick: Aktuelle Alternativen

Nach einem TYPO3-Upgrade stellt sich immer dieselbe Frage: Sieht noch alles so aus wie vorher? Auf jeder Seite, in jeder Bildschirmbreite? Genau dafür habe ich jahrelang BBC Wraith verwendet – ein Tool der BBC, das zwei Versionen einer Website automatisch fotografiert und die Unterschiede sichtbar macht. Dieser Artikel ist meine Erinnerung daran, wie das eingerichtet war.

So funktioniert Wraith

  1. Spider: Wraith crawlt die Website und schreibt alle gefundenen Pfade in eine Datei – oder du gibst die Pfade selbst vor.
  2. Capture: Für jeden Pfad werden Screenshots auf beiden Domains gemacht, z. B. old (Live-Seite) und new (lokale Version nach dem Upgrade), in allen konfigurierten Bildschirmbreiten.
  3. Vergleich: ImageMagick vergleicht die Bilder pixelgenau und markiert Abweichungen.
  4. Galerie: Das Ergebnis landet als HTML-Galerie im Ordner shots – mit diffs_first stehen die größten Unterschiede ganz oben.

Installiert wurde Wraith als Ruby-Gem, zusammen mit ImageMagick und einer Headless-Browser-Engine (laut Doku per Homebrew):

brew install imagemagick
brew install phantomjs   # heute nicht mehr verfügbar
gem install wraith

Konfiguration

Datei configs/spider.yaml:

imports: spider.txt

##############################################################
##############################################################
# This is an example configuration provided by Wraith.
# Feel free to amend for your own requirements.
# ---
# This particular config is intended to demonstrate how
# to use Wraith in 'spider' mode.
##############################################################
##############################################################

# Add as many domains as necessary. Key will act as a label
domains:
  old: "https://www.websailor.at"
  new: "https://localhost"

# Notice the absence of a `paths` property. When no paths are provided, Wraith defaults to
# spidering mode to check your entire website.

#paths:
#  home: /

# A list of URLs to skip when spidering.
# Ruby regular expressions can be used, if prefixed with `!ruby/regexp` as defined in the YAML Cookbook​.
# See http://www.yaml.org/YAML_for_ruby.html#regexps
spider_skips:
#  - /foo/bar.html           # Matches /foo/bar.html explicitly
#  - !ruby/regexp /^\/baz\// # Matches any URLs that start with /baz

# the filename of the spider file to use. Default: spider.txt
spider_file: spider.txt

# the number of days to keep the site spider file
spider_days: 10

# amount of fuzz ImageMagick will use when comparing images. A higher fuzz makes the comparison less strict.
fuzz: '20%'

# the maximum acceptable level of difference (in %) between two images.
# Wraith considers it a failure if an image diff goes above this threshold.
threshold: 5

screen_widths:
  - 1920x1140

# screen widths (and optional height) to resize the browser to before taking the screenshot
#screen_widths:
#  - 320
#  - 600x768
#  - 768
#  - 1024
#  - 1280
#  - 1280x5120

# the engine to run Wraith with.
browser: "phantomjs"

# the directory that your latest screenshots will be stored in
directory: 'shots'

# choose how results are displayed in the gallery (default is `alphanumeric` if omitted)
# Different screen widths are always grouped together.
# Options:
#   alphanumeric - all paths (with or without a difference) are shown, sorted by path
#   diffs_first - all paths (with or without a difference) are shown, sorted by difference size (largest first)
#   diffs_only - only paths with a difference are shown, sorted by difference size (largest first)
mode: diffs_first

Befehle

Spider – Seitenliste erstellen:

wraith spider configs/spider.yaml

Capture – Screenshots machen und vergleichen:

wraith capture configs/spider.yaml

Wichtig: die Spider-Datei

Entscheidend ist der imports-Eintrag in der ersten Zeile der Konfiguration. Die dort angegebene Datei (spider.txt) muss beim Crawlen existieren und darf nicht leer sein – sonst bricht Wraith ab (Issue #496 (öffnet in neuem Tab)). Eine neue Datei einfach mit diesem Inhalt anlegen:

---
foo: bar

Ausblick: Aktuelle Alternativen

Ein Tool, das so unkompliziert läuft wie Wraith damals, habe ich bisher nicht gefunden. Diese beiden Kandidaten sind aktuell die naheliegendsten – ein ausführlicher Vergleich folgt, sobald ich sie im Projektalltag getestet habe:

  • Playwright (öffnet in neuem Tab) – das Test-Framework von Microsoft bringt mit expect(page).toHaveScreenshot() visuelle Vergleiche direkt mit: Beim ersten Lauf entstehen Referenz-Screenshots, jeder weitere Lauf vergleicht dagegen. Die Seitenliste und Bildschirmbreiten muss man allerdings selbst als Test schreiben.
  • BackstopJS (öffnet in neuem Tab) – kommt dem Wraith-Prinzip am nächsten: Konfiguration per JSON mit Szenarien und Viewports, Referenz- und Test-Screenshots und eine fertige Report-Galerie.

Häufige Fragen

Was macht BBC Wraith?

Wraith macht Screenshots derselben Seiten auf zwei Domains (z. B. Live und Entwicklung) in mehreren Bildschirmbreiten, vergleicht sie pixelgenau mit ImageMagick und zeigt die Unterschiede in einer HTML-Galerie.

Wird BBC Wraith noch weiterentwickelt?

Nein. Das GitHub-Repository ist archiviert, das letzte Release (v4.2.4) stammt aus dem Juni 2019.

Warum meldet Wraith beim Spidern einen Fehler?

Die in imports angegebene Datei (z. B. spider.txt) muss existieren und darf nicht leer sein. Als Inhalt reicht --- und darunter foo: bar.

Welche Alternativen gibt es zu Wraith?

Playwright bringt Screenshot-Vergleiche mit toHaveScreenshot() direkt mit, BackstopJS ist ein fertiges Tool speziell für visuelle Regressionstests.

Quellen & weiterführende Links

  1. Wraith Documentation (öffnet in neuem Tab) – BBC
  2. bbc/wraith (archiviert) (öffnet in neuem Tab) – GitHub
  3. Issue #496: Spider-Datei darf nicht leer sein (öffnet in neuem Tab) – GitHub
  4. Visual comparisons (toHaveScreenshot) (öffnet in neuem Tab) – Playwright Dokumentation
  5. BackstopJS (öffnet in neuem Tab) – GitHub

Geschrieben von

Christoph Schwob (öffnet in neuem Tab)

Ich bin Christoph Schwob, halbkreativer Entwickler aus Österreich und arbeite seit über 10 Jahren an und mit TYPO3. Hier sammle ich Lösungen, Code-Snippets und Notizen rund um TYPO3, macOS, Server, Homelab und alles andere.

Suche

Tippe einen Suchbegriff ein.