Vor dem Release hat die App die Eintrittskarte bereits als QR-Code-PNG gespeichert, und auch die Vorschau sieht korrekt aus. Beim tatsächlichen Scannen kann der Code trotzdem scheitern: etwa durch Interpolation beim Skalieren, abgeschnittene Ränder oder zu wenig Kontrast zwischen Vorder- und Hintergrund. Statt nur zu prüfen, ob die Datei existiert, lässt sich auf einem Cloud-Mac das fertige Exportbild der App mit Vision erneut auslesen und sein Inhalt abgleichen. Das ist eine sinnvolle Prüfung auf Dateiebene für die iOS-Regressionstests.
Den Prüfumfang festlegen
Geprüft wird hier das PNG, das die App tatsächlich schreibt – kein QR-Code, den das Testskript selbst erzeugt. Die feste Testnutzlast lautet case-123. Der Testeinstiegspunkt der App soll das zugehörige Bild unter Documents/qr-sample.png in ihrer Sandbox speichern. Zeigt das Produkt den QR-Code nur auf dem Bildschirm an, kann die Datei zunächst über eine vorhandene Exportfunktion gewonnen werden. Ein separater Testgenerator darf nicht an die Stelle der Produktionsausgabe treten.
Drei Bedingungen müssen erfüllt sein: Die Datei lässt sich aus dem App-Container holen; Vision erkennt genau einen QR-Code; die dekodierte Zeichenfolge stimmt Zeichen für Zeichen mit dem erwarteten Wert überein. Ein Datei-Hash eignet sich nicht als wichtigste Prüfung: Geänderte Kodierungsparameter oder PNG-Metadaten können die Bytes verändern, ohne den Inhalt des QR-Codes zu ändern.
„Erkennbar“ bezieht sich hier nur auf das exportierte digitale Bild. Kamerafokus, Bildschirmhelligkeit und Druckgröße bringen weitere Variablen ins Spiel. Die Prüfung auf Dateiebene ersetzt keinen echten Scan.
Die endgültige Datei aus dem Simulator holen
Führen Sie zunächst den Testeinstiegspunkt im gestarteten iOS-Simulator aus und vergewissern Sie sich, dass die App an den vereinbarten Pfad schreibt. Für die folgenden Befehle muss die Umgebungsvariable BUNDLE_ID auf den tatsächlichen Bundle-Identifier der getesteten App gesetzt sein. get_app_container gibt den Pfad ihres Datencontainers zurück.
test -n "$BUNDLE_ID" || exit 2
APP_DATA=$(xcrun simctl get_app_container booted "$BUNDLE_ID" data) || exit 1
mkdir -p artifacts
cp "$APP_DATA/Documents/qr-sample.png" artifacts/qr-sample.png
file artifacts/qr-sample.png
Schlägt cp fehl, prüfen Sie zuerst, ob die App im aktuell gestarteten Simulator läuft und ob die Exportlogik tatsächlich nach Documents geschrieben hat. Ersetzen Sie die Datei nicht durch ein gleichnamiges Bild vom Entwicklungsrechner – damit würde der Regressionstest die App umgehen. Gibt die App bei jedem Durchlauf mehrere Dateien aus, sollte der Testeinstiegspunkt einen festen Dateinamen verwenden und alte Dateien vor jedem Lauf entfernen. So wird nicht versehentlich das Ergebnis des vorherigen Laufs geprüft.
Mit Vision dekodieren und die Nutzlast abgleichen
Speichern Sie das folgende Skript im Arbeitsverzeichnis als qr-check.swift. Es nimmt einen PNG-Pfad und den erwarteten Text entgegen. Bei Fehlern beim Einlesen, Erkennen oder Abgleichen endet es mit einem Status ungleich null, sodass die Pipeline unmittelbar darüber entscheiden kann.
import Foundation
import Vision
guard CommandLine.arguments.count == 3 else {
fputs("usage: swift qr-check.swift IMAGE EXPECTED\n", stderr)
exit(2)
}
let url = URL(fileURLWithPath: CommandLine.arguments[1])
let expected = CommandLine.arguments[2]
let request = VNDetectBarcodesRequest()
request.symbologies = [.qr]
do {
try VNImageRequestHandler(url: url, options: [:]).perform([request])
let codes = (request.results ?? []).filter { $0.symbology == .qr }
guard codes.count == 1,
codes[0].payloadStringValue == expected else {
fputs("QR count or payload mismatch\n", stderr)
exit(1)
}
print("QR payload verified")
} catch {
fputs("QR image could not be analyzed\n", stderr)
exit(1)
}
Führen Sie swift qr-check.swift artifacts/qr-sample.png case-123 aus. Prüfen Sie nicht nur die Anzahl erkannter Codes: Auch ein erfolgreich gelesener Code kann eine alte Bestellnummer, ein falsches Präfix oder abgeschnittenen Text enthalten. Verwenden Sie für Testdaten keine echten Zugangsdaten. Enthält die geschäftliche Nutzlast sensible Felder, reichen eigens dafür vorgesehene, ungültige Testwerte aus, um Format und Parsing zu prüfen.
Fehler schrittweise eingrenzen
Sehen Sie sich zuerst die exportierte Datei an, dann das Erkennungsergebnis und erst danach den Code zur QR-Code-Erzeugung. So lässt sich „gar nicht exportiert“ von „exportiert, aber nicht lesbar“ trennen.
| Symptom | Zuerst prüfen |
|---|---|
| PNG nicht gefunden | Simulatorauswahl, Bundle-Identifier, Sandbox-Pfad und Bereinigung alter Dateien |
| Vision findet keinen Code | Ob das Bild beschnitten, stark verkleinert oder verlustbehaftet verarbeitet wurde |
| Mehrere Codes erkannt | Ob weitere QR-Codes ins Exportbild geraten sind |
| Nutzlast stimmt nicht überein | Text vor der Kodierung, Zeichenkodierung, Cache und Zeitpunkt des Exports |
Erzeugt die App den QR-Code mit Core Image, behalten Sie zunächst die vollständigen Ränder des outputImage bei, vergrößern Sie es anschließend um einen ganzzahligen Faktor und schreiben Sie erst dann das PNG. Prüfen Sie, ob der Freigabe- oder Screenshot-Pfad das Bild durch Interpolation erneut verkleinert. Eine glatt wirkende Vorschau bedeutet nicht, dass die Kanten der einzelnen Quadrate noch scharf sind. Prüfen Sie bei einem dunklen Erscheinungsbild außerdem die Farben der endgültigen Datei: Der Hintergrund der Oberfläche und der des Exportbilds müssen nicht übereinstimmen. Transparente Bereiche können auf einem anderen Untergrund ihren Kontrast verlieren.
Fehlalarme vermeiden
Verwenden Sie ein festes Testbild, eine eindeutig festgelegte Nutzlast und einen festen Ausgabepfad. Holen Sie das Bild aber bei jedem Durchlauf aus dem Ergebnis des aktuellen App-Starts. Wenn Sie Nutzlasten unterschiedlicher Länge, mit Nicht-ASCII-Zeichen oder mit Trennzeichen abdecken möchten, legen Sie dafür einzelne Testfälle an und gleichen Sie jeden Wert separat ab. Fassen Sie nicht mehrere erwartete Zeichenfolgen zu einer Prüfung nach dem Muster „eine davon genügt“ zusammen. Ein erfolgreich dekodierter QR-Code beweist zudem nicht, dass ein Geschäftslink funktioniert. Falls auch die Weiterleitung abgenommen werden muss, prüfen Sie Parsing und Routing in einer anderen Testschicht.
Das Ergebnis in die Regressionstests einbinden
Führen Sie nach den bestehenden Simulatortests die Befehle zum Kopieren des Bilds und das Swift-Skript aus. Jeder Exit-Status ungleich null soll den aktuellen Lauf scheitern lassen. Bewahren Sie im Fehlerfall das PNG dieses Laufs und die Fehlerausgabe des Skripts auf. So lässt sich feststellen, ob sich der Exportpfad geändert hat oder die Bildverarbeitung die Lesbarkeit verschlechtert. Bei Erfolg genügt es, den Prüfstatus zu protokollieren; Bilder mit Geschäftsdaten müssen nicht dauerhaft gespeichert werden.
Am Ende sind vier Punkte zu prüfen: Das Bild stammt aus der endgültigen Ausgabe der App; es wurde kein Überbleibsel des vorherigen Laufs gelesen; Vision erkennt genau einen Code; die Nutzlast stimmt vollständig mit dem festen Testwert überein. Damit hat der dateibasierte QR-Code-Regressionstest einen klaren, wiederholbaren Prüfumfang. Geht es auch um die Anzeige auf einem Bildschirm oder um gedruckte Ausgaben, ergänzen Sie einen echten Scan auf einem physischen Gerät.
Häufig gestellte Fragen
Ersetzt Vision einen Scan mit einem echten Gerät?
Nein. Vision prüft Lesbarkeit und Inhalt der Datei; Bildschirmhelligkeit, Kamerafokus und Druckgröße müssen unter realen Bedingungen getestet werden.
Warum sollte das Prüfsystem den QR-Code nicht selbst erzeugen?
Dann würde es nur sich selbst prüfen. Die endgültige PNG-Datei der App deckt zusätzlich Fehler beim Skalieren, Einfärben, Zuschneiden und Exportieren auf.
Den nächsten Schritt auf einem exklusiven Mac mini testen
VMCommit bietet exklusive Mac mini mit M4 zur Tages-, Wochen-, Monats- oder Quartalsmiete. Wählen Sie Modell und Standort und prüfen Sie die aktuelle Verfügbarkeit in der Konsole.