Le projet accumule les tests XCTest, tandis que les nouveaux tests pourraient profiter d’une syntaxe Swift plus moderne et de tests paramétrés.
Solution la plus sûre : ne réécrivez pas toute la suite. Pour un nouveau test unitaire ou un test d’intégration appelant directement le code métier, choisissez Swift Testing ; migrez progressivement les tests XCTest que vous modifiez ; conservez XCTest pour l’interface utilisateur, la performance et certains scénarios Objective-C. En CI distant, faites d’abord fonctionner les deux frameworks ensemble avant de renforcer les contrôles d’interopérabilité.
Cette analyse s’appuie sur les documents Apple disponibles au 2 septembre 2026, notamment la documentation de migration, les ressources WWDC26 et les notes de version de Xcode 27, encore présentées dans le cadre d’une version bêta. Consultez les conditions et ressources de NUKCLOUD si les essais nécessitent une machine Mac accessible à distance.
00Première étape : classer les tests avant de toucher au code
Le risque principal ne vient pas du changement de syntaxe, mais de la confusion entre plusieurs types de vérification. Un test qui appelle un service Swift, un test qui lance l’application et un test qui mesure une durée ne demandent pas les mêmes capacités.
| Type de test | Décision recommandée | Condition de conservation ou de migration | Preuve à recueillir |
|---|---|---|---|
| Unitaire sur le code métier | Migrer en priorité vers Swift Testing | Assertions directes, dépendances maîtrisées, absence de pilotage d’interface | Même règle métier vérifiée et mêmes défauts détectés |
| Intégration sans interface | Migrer progressivement | Le scénario peut être exécuté par des appels Swift explicites | Même résultat fonctionnel et même gestion des erreurs |
| Interface utilisateur | Conserver XCTest | Pilotage de l’application, des éléments visibles ou des interactions système | Parcours identique et artefacts d’exécution disponibles |
| Performance | Conserver XCTest | Mesure nécessitant les outils de performance de Xcode | Mesures comparables dans le même contexte |
| Cas Objective-C particulier | Maintenir en double voie | Dépendance à une exception ou à une API qui n’a pas d’équivalent vérifié | Échec correctement attribué au scénario concerné |
Cette séparation évite une erreur fréquente : convertir un test d’interface en test unitaire uniquement parce que le second framework paraît plus récent. Le test devient alors plus simple à compiler, mais il ne vérifie plus le même comportement.
Apple documente une migration progressive plutôt qu’une suppression immédiate de XCTest. La documentation officielle sur la migration depuis XCTest doit donc servir de référence pour les transformations réellement supportées, tandis que la présentation WWDC26 consacrée à la migration aide à comprendre l’interopérabilité annoncée.
01Swift Testing vs XCTest : choisir selon le profil du projet
Le choix ne doit pas être identique pour un nouveau projet, une application ancienne et une suite pilotée par un serveur d’intégration continue. Les contraintes de maintenance, de découverte des tests et de diagnostic sont différentes.
| Profil du mainteneur | Priorité | Ce qui reste en XCTest | Critère d’arrêt |
|---|---|---|---|
| Nouveau projet iOS ou macOS | Construire la base unitaire avec Swift Testing | Target dédié aux tests d’interface | Ne pas supprimer XCTest si un parcours nécessite l’application réelle |
| Application existante très maintenue | Migrer les tests fréquemment modifiés | Tests stables et capacités spécialisées | Suspendre si la sémantique, les résultats ou le diagnostic changent |
| Petite équipe avec nombreux assistants partagés | Adapter les assistants réutilisés en premier | Assistants liés à l’interface ou à la mesure | Revenir en arrière si plusieurs suites deviennent ambiguës |
| Projet Swift Package | Vérifier séparément l’entrée swift test |
Intégration Apple exécutée dans Xcode | Ne pas généraliser un résultat obtenu avec une seule entrée |
| CI sur Mac distant | Stabiliser l’outil avant de renforcer les contrôles | UI Tests et tests spécialisés | Valider les relances et les artefacts après incident |
Les nouveaux projets peuvent créer leurs tests unitaires avec @Test, vérifier les résultats au moyen de #expect et interrompre proprement une condition indispensable avec #require. Les traits et les tests paramétrés répondent notamment à deux difficultés de maintenance : organiser les conditions d’exécution et éviter de recopier une même structure pour plusieurs jeux de données. Les exemples et la portée du framework sont détaillés dans le dépôt officiel de Swift Testing.
À l’inverse, XCTest reste pertinent lorsque la suite doit utiliser des API d’interface ou de performance déjà intégrées à Xcode. La documentation Apple sur les tests dans Xcode présente ces familles comme des capacités distinctes ; elle ne permet pas de conclure que tous les scénarios possèdent désormais un remplacement équivalent.
02Deuxième étape : appliquer une migration qui suit le travail réel
Pour une application existante, compter les fichiers à réécrire donne une estimation trompeuse. Un fichier rarement modifié peut rester stable pendant longtemps, alors qu’un petit assistant partagé peut affecter une grande partie de la suite.
Procédez dans cet ordre :
- Inventoriez les capacités, pas seulement les fichiers. Marquez chaque test comme unitaire, intégration, interface, performance ou scénario dépendant d’Objective-C. Notez aussi le Scheme, le Test Plan et l’entrée d’exécution réellement utilisée.
- Sélectionnez les tests en cours de modification. Un test déjà ouvert pour corriger un défaut constitue le meilleur candidat, car la sémantique attendue est encore connue par le mainteneur.
- Isolez les assistants communs. Vérifiez si une fonction de préparation, une fixture ou une logique de nettoyage est appelée par les deux frameworks. L’adaptation doit préserver les données, les préconditions et le cycle de vie.
- Convertissez une capacité à la fois. Remplacez les annotations et assertions seulement lorsque le nouveau test vérifie exactement la même règle. N’ajoutez pas de refonte métier au même changement.
- Exécutez les deux familles dans le même environnement. Contrôlez la découverte, les tests ignorés, les erreurs d’initialisation et la localisation des échecs, au lieu de regarder uniquement le statut final.
- Comparez les défauts volontairement introduits. Une assertion rendue fausse temporairement doit provoquer un échec au même endroit logique avant et après migration ; cette vérification fournit une preuve plus solide qu’une compilation verte.
- Décidez ensuite du sort des tests stables. S’ils ne présentent aucun coût de maintenance et n’utilisent pas une capacité nouvelle, les laisser sous XCTest est une décision rationnelle, non un retard à corriger d’urgence.
Dans le même Target, la coexistence est utile, mais elle introduit des points de contrôle supplémentaires. Un nom de test découvert différemment, un helper exécuté dans un autre cycle de vie ou une condition d’ignorance mal transposée peut donner une suite verte qui ne couvre plus le même périmètre.
03Troisième étape : préserver la double voie pour l’interface et la performance
Un projet d’application ne doit pas confondre vérification logique et interaction avec le système. Swift Testing convient lorsqu’un test appelle une fonction, un acteur, un service ou une couche métier et vérifie explicitement son résultat. XCTest conserve une place spécifique lorsque le test doit lancer l’application, rechercher un élément visible, effectuer une interaction ou mesurer un comportement dans l’environnement prévu.
| Besoin de validation | Swift Testing | XCTest | Choix opérationnel |
|---|---|---|---|
| Règle de calcul ou de validation | Adapté | Possible dans l’existant | Utiliser Swift Testing pour les nouveaux cas |
| Intégration de services Swift | Adapté si les dépendances sont contrôlées | Maintenable dans l’existant | Migrer au fil des changements |
| Navigation et interaction dans l’application | Ne pas supposer une équivalence | Adapté | Conserver les UI Tests |
| Mesure de performance | Ne pas remplacer sans preuve | Adapté aux outils concernés | Conserver et comparer séparément |
| Test exposant une exception Objective-C spécifique | À vérifier au cas par cas | Peut rester indispensable | Maintenir la capacité qui prouve le comportement |
Le terme « double voie » décrit donc une architecture de tests adaptée aux besoins. Il ne signifie pas que l’équipe accumule automatiquement une dette technique. La dette apparaît plutôt lorsque deux tests prétendent vérifier la même chose sans que leur périmètre soit documenté, ou lorsque personne ne sait quel framework doit recevoir le prochain scénario.
La documentation Apple sur l’organisation des tests est utile pour séparer les suites selon leur feedback attendu. Pour un projet audio, vidéo ou de design, cette distinction est particulièrement importante : une règle de traitement de média peut être testée au niveau métier, tandis que l’import d’un fichier, l’affichage d’une timeline ou le comportement d’une vue exige une validation dans l’application.
04Quatrième étape : traiter séparément Swift Package Manager et l’application Apple
Un package Swift et une application iOS ou macOS ne partagent pas nécessairement le même parcours de test. Un package peut être vérifié avec swift test dans un environnement compatible, alors qu’une intégration Apple doit aussi valider la signature, les ressources, les frameworks système, l’interface et parfois le simulateur.
Cette différence crée trois limites concrètes :
- un test qui passe avec Swift Package Manager ne prouve pas que le Scheme Xcode et le Test Plan de l’application sont corrects ;
- un résultat obtenu dans Xcode ne doit pas être présenté comme une garantie pour Windows ou Linux ;
- un test d’intégration dépendant d’Apple peut rester impossible à conclure sans macOS, même si une partie du code partagé est portable.
La documentation Apple consacrée à l’ajout de tests dans un projet Xcode doit être rapprochée du processus réel du package. Le mainteneur gagnera à séparer les contrôles portables, les tests exécutables par swift test et les validations Apple lancées par le Scheme ou le Test Plan.
Pour un projet multiplateforme, la bonne question n’est donc pas « quel framework remplace l’autre ? », mais « quelle partie du contrat logiciel peut être prouvée sur chaque plateforme ? ». Cette approche permet d’exécuter plus tôt les tests métier sur un environnement disponible, tout en réservant le Mac aux intégrations qui en dépendent réellement.
05Cinquième étape : sécuriser l’acceptation dans un CI distant
Un Mac distant ne corrige pas une migration mal définie. Il rend simplement l’exécution persistante et accessible à une équipe qui ne souhaite pas laisser une machine locale allumée en permanence. Avant de modifier la suite, fixez les éléments suivants dans le dépôt ou dans la configuration du pipeline :
- la version de Xcode, en traitant Xcode 27 comme une version bêta tant que les notes officielles ne déclarent pas le contraire ;
- la version de Swift et les réglages du projet ;
- le Scheme et le Test Plan ;
- le point d’entrée utilisé par le pipeline ;
- la destination de test et les conditions d’exécution ;
- le nom et l’emplacement des fichiers de résultat ;
- la règle de conservation des logs après un échec.
Les notes de version bêta de Xcode 27 doivent être relues avant de figer un comportement d’interopérabilité. Une bêta peut modifier une découverte de tests, un réglage par défaut ou un résultat de compilation ; il serait imprudent de transformer un comportement observé en promesse valable pour la version finale.
L’acceptation doit ensuite suivre une séquence reproductible :
- lancer la suite actuelle et conserver les résultats ;
- activer la coexistence Swift Testing–XCTest sans déplacer les UI Tests ;
- comparer le nombre de tests découverts, les ignorances et les catégories d’échec ;
- introduire la migration d’un petit groupe de tests métier ;
- vérifier les helpers partagés et la localisation des erreurs ;
- relancer le même Test Plan après une déconnexion ;
- redémarrer la machine distante, puis confirmer que la suite et les fichiers de résultat restent accessibles ;
- augmenter seulement après cela la sévérité des contrôles d’interopérabilité.
La documentation Apple sur l’exécution des tests et l’interprétation des résultats fournit le cadre pour examiner ces résultats plutôt que de se limiter au message « échec » ou « réussite ».
Décision conditionnelle pour chaque équipe
- Si le test vérifie directement du code Swift et doit être créé ou modifié maintenant, choisissez Swift Testing.
- Si le test pilote l’application, mesure une performance ou dépend d’un comportement Objective-C particulier, conservez XCTest.
- Si le projet contient déjà une large suite stable, migrez seulement les zones fréquemment entretenues et gardez le reste sous XCTest.
- Si le pipeline distant ne conserve pas encore les résultats, stabilisez d’abord le Test Plan, les Scheme et les artefacts avant toute migration importante.
- Si la coexistence produit des découvertes ou des échecs différents, revenez à la dernière étape validée, corrigez les helpers, puis reprenez avec un périmètre plus petit.
- Si l’environnement local ne permet pas de répéter la suite, envisagez un environnement Mac distant pour les tests et la validation, mais acceptez d’abord les mêmes critères d’acceptation qu’avec une machine locale.
06Questions fréquentes sur la migration
Les réponses suivantes couvrent les décisions qui provoquent le plus souvent des réécritures inutiles : remplacement complet, ordre de migration, coexistence, tests spécialisés et validation distante.
07Dernière vérification : publier une décision traçable
Avant de fusionner une migration, chaque équipe devrait inscrire les tests dans trois listes :
- Migrer : tests unitaires et intégrations appelant directement le code métier, en priorité lorsqu’ils sont régulièrement modifiés ;
- Conserver : tests d’interface, mesures de performance et scénarios Objective-C dont la capacité n’est pas équivalente ;
- À vérifier : tests dépendant d’un helper partagé, d’un Test Plan particulier, de la découverte automatique ou d’un comportement encore lié à la bêta de Xcode 27.
Cette classification est plus défendable qu’un objectif de conversion exprimé en proportion de fichiers. Elle relie chaque changement à une preuve : même défaut détecté, même logique d’ignorance, échec correctement attribué et résultat conservé.
Une suite locale peut masquer les problèmes de disponibilité, de reprise et d’archivage. À l’inverse, un CI distant utilisé sans Scheme, Test Plan et chaîne Swift figés rend les résultats difficiles à comparer. Si l’environnement actuel impose une machine personnelle constamment disponible, avec des interruptions lors des tests d’interface et aucun espace de reprise après redémarrage, une location NUKCLOUD peut offrir un cadre Mac permanent plus cohérent pour les validations temporaires ou les petites équipes. Le choix d’un accès Mac NUKCLOUD doit toutefois être évalué selon la durée d’utilisation, la dépendance à des interfaces physiques et le volume de charge : pour une charge lourde, stable et permanente, l’achat d’une machine dédiée peut rester plus rationnel.
Le bon objectif, en 2026, n’est donc pas de faire disparaître XCTest. Il consiste à adopter Swift Testing là où il améliore réellement la maintenance, à protéger les tests qui ont encore besoin des capacités de XCTest et à démontrer, dans le CI choisi, que la migration conserve le comportement vérifié.