Vérifier les codes QR exportés par une app iOS sur un Mac cloud

Automatisation IA ·~6 min de lecture

Vérifier les codes QR exportés par une app iOS sur un Mac cloud

Avant une mise en production, une app peut enregistrer un titre d’accès sous forme de code QR dans un PNG, avec un aperçu parfaitement normal dans l’interface. Pourtant, le scan peut échouer à cause d’une interpolation lors du redimensionnement, de bords rognés ou d’un contraste insuffisant entre le premier plan et l’arrière-plan. Plutôt que de vérifier seulement que le fichier existe, récupérez sur un Mac cloud l’image finale exportée par l’app, relisez-la avec Vision et comparez le contenu décodé à la valeur attendue. C’est un contrôle au niveau du fichier qui trouve sa place dans les tests de régression iOS.

Définir les critères de validation

Le contrôle porte sur le PNG réellement écrit par l’app, et non sur un code QR généré par le script de test. La donnée de test fixe est case-123 ; le point d’entrée de test de l’app doit écrire l’image correspondante dans Documents/qr-sample.png, au sein de son bac à sable. Si le produit affiche seulement le code QR à l’écran, utilisez sa fonction d’exportation existante pour obtenir un fichier. Ne créez pas un générateur de test distinct dont la sortie se substituerait à celle de l’app.

Trois conditions doivent être remplies : le fichier peut être récupéré depuis le conteneur de l’app ; Vision détecte exactement un code QR ; la chaîne décodée correspond caractère pour caractère à la valeur attendue. Une empreinte du fichier ne convient pas comme assertion principale : une modification des paramètres d’encodage ou des métadonnées PNG peut changer les octets sans modifier le contenu du code QR.

Ici, « lisible » ne concerne que l’image numérique exportée. La mise au point de la caméra, la luminosité de l’écran et la taille d’impression ajoutent d’autres variables : la validation du fichier ne remplace pas un vrai scan.

Récupérer le fichier final depuis le simulateur

Commencez par exécuter le point d’entrée de test dans un simulateur iOS démarré et vérifiez que l’app écrit bien au chemin convenu. Les commandes suivantes supposent que la variable d’environnement BUNDLE_ID contient le véritable identifiant de bundle de l’app testée. get_app_container renvoie le chemin de son conteneur de données.

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

Si cp échoue, vérifiez d’abord que l’app a tourné sur le simulateur actuellement démarré et que la logique d’exportation a bien écrit dans Documents. Ne remplacez pas le fichier par une image homonyme prise sur la machine de développement : le contrôle de régression contournerait alors l’app. Si l’app produit plusieurs fichiers à chaque exécution, le point d’entrée de test doit utiliser un nom de fichier stable et supprimer les anciens fichiers avant chaque passage, afin de ne pas relire un résultat précédent.

Décoder le code QR avec Vision et comparer le contenu

Enregistrez le script suivant sous qr-check.swift dans le répertoire de travail. Il reçoit le chemin du PNG et le texte attendu. Une entrée impossible à analyser, un échec de détection ou une différence de contenu entraîne un code de sortie non nul, directement exploitable par le pipeline.

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

Exécutez swift qr-check.swift artifacts/qr-sample.png case-123. Ne vérifiez pas uniquement le nombre de codes détectés : un code décodé peut encore contenir un ancien numéro de commande, un préfixe erroné ou un texte tronqué. Les données de test ne doivent pas non plus contenir de vrais identifiants d’accès. Si les données métier comportent des champs sensibles, utilisez des valeurs de test volontairement invalides qui permettent néanmoins de couvrir le format et la logique d’analyse.

Diagnostiquer les échecs par étapes

Examinez d’abord le fichier exporté, puis le résultat de la détection, et ne revenez au code de génération du QR qu’ensuite. Vous distinguerez ainsi « aucun fichier exporté » de « fichier exporté, mais illisible ».

Symptôme À vérifier en priorité
PNG introuvable Choix du simulateur, identifiant de bundle, chemin dans le bac à sable et suppression des anciens fichiers
Vision ne trouve aucun code Image rognée, réduite à une taille trop petite ou soumise à un traitement avec perte
Plusieurs codes détectés Présence d’un autre code QR dans l’image exportée
Contenu différent Texte avant encodage, encodage des caractères, cache et moment de l’exportation

Si l’app génère ses codes QR avec Core Image, conservez d’abord les limites complètes de l’outputImage du générateur, agrandissez l’image par un facteur entier, puis écrivez le PNG. Vérifiez si le parcours de partage ou de capture d’écran ne la réduit pas une seconde fois avec interpolation. Un aperçu qui semble lisse ne garantit pas que les bords des carrés restent nets. Pour un thème sombre, vérifiez aussi les couleurs du fichier final : l’arrière-plan de l’interface peut différer de celui de l’image exportée, et les zones transparentes peuvent perdre leur contraste sur un autre fond.

Éviter les résultats trompeurs

Fixez une image de test, un contenu explicite et un chemin de sortie, mais récupérez à chaque fois l’image produite lors de l’exécution en cours. Pour couvrir des contenus de longueurs différentes, des caractères non ASCII ou des séparateurs, créez des cas de test distincts et comparez chaque résultat séparément. N’acceptez pas simplement qu’une chaîne corresponde à l’une de plusieurs valeurs attendues. Le décodage réussi d’un code QR ne prouve pas non plus qu’un lien métier fonctionne : si la navigation doit être validée, testez l’analyse et le routage à un autre niveau.

Intégrer le résultat aux tests de régression

Après les tests existants sur simulateur, exécutez les commandes de récupération du fichier et le script Swift. Un code de sortie non nul à l’une ou l’autre étape doit faire échouer l’exécution. En cas d’échec, conservez le PNG de cette exécution et la sortie d’erreur du script pour déterminer si le chemin d’exportation a changé ou si le traitement de l’image a introduit une régression. En cas de réussite, il suffit de consigner le résultat de la validation ; inutile de conserver durablement des images contenant des données métier.

Le contrôle final porte sur quatre points : l’image provient de la sortie finale de l’app ; elle ne date pas de l’exécution précédente ; Vision lit exactement un code ; son contenu correspond parfaitement à la valeur de test fixe. Ces vérifications donnent aux tests de régression du fichier QR un périmètre clair et reproductible. Pour un affichage à l’écran ou une livraison imprimée, ajoutez une validation par scan sur un appareil réel.

Questions fréquentes

Vision remplace-t-il un test de lecture avec un appareil réel ?

Non. Il vérifie le décodage du fichier et son contenu ; la luminosité de l’écran, la mise au point et la taille imprimée restent à tester en situation.

Pourquoi ne pas créer le code QR dans le script de test ?

Cela ne testerait que le script. Vérifier le PNG final de l’app permet aussi de détecter les erreurs de redimensionnement, de couleur, de recadrage et d’export.

Louez selon vos besoins

Validez votre prochaine étape sur un Mac mini physique dédié

VMCommit propose des Mac mini M4 physiques dédiés, disponibles à la journée, à la semaine, au mois ou au trimestre. Choisissez un modèle et un emplacement, puis consultez les disponibilités en temps réel dans la console.

Louer un Mac mini