Apple beschreibt die gemeinsame Nutzung von Swift Testing und XCTest in einem Projekt ausdrücklich in seiner Migrationsdokumentation. Daraus folgt für die Migration zu Swift Testing eine klare Empfehlung: Verwenden Sie das neue Framework bevorzugt für neue Swift-Unit-Tests und migrieren Sie bestehende Tests schrittweise nach Risiko. Behalten Sie UI-Automatisierung und andere Tests, die XCTest-Funktionen benötigen, zunächst bei. Prüfen Sie die Interoperabilität, bevor Sie sie im Projekt einschränken.
Dieser Leitfaden richtet sich an unabhängige Entwickler, die größere XCTest-Suites pflegen und den Umstellungsaufwand einschätzen möchten.
Auch kleine Teams mit gemischten Tests oder Sorge um verändertes Fehlerverhalten finden hier konkrete Prüfungen.
Für Projekte, die Xcode-Tests lokal oder auf einem Remote Mac zuverlässig ausführen müssen, steht die Wiederholbarkeit im Mittelpunkt.
[ SECTION_01 ] Die Testabdeckung bestimmt, was zuerst migriert wird
Eine Migration sollte nach der Aufgabe eines Tests beginnen, nicht nach dem Dateinamen oder dem Wunsch, ein neues Framework möglichst schnell überall einzusetzen. Entscheidend ist, ob ein Test eine reine Swift-Funktion prüft oder von einer XCTest-spezifischen Funktion, einem UI-Element, einem Leistungsmessverfahren oder einer besonderen Fehlerbehandlung abhängt.
Für eine erste Bestandsaufnahme können Sie jeden Test einer dieser Gruppen zuordnen:
- Reine Swift-Unit-Tests: Sie prüfen Eingaben, Rückgabewerte und Zustandsänderungen ohne UI-Automatisierung oder XCTest-spezifische Hilfsmechanismen. Diese Tests eignen sich häufig als erste Migrationskandidaten.
- Unit-Tests mit gemeinsam genutzten Hilfsfunktionen: Sie verwenden eigene Assertions, Testdaten-Builder oder gemeinsam genutzte Setups. Hier müssen Sie zusätzlich prüfen, ob ein fehlgeschlagener Helper den Test im neuen Framework tatsächlich als fehlgeschlagen meldet.
- UI- und Integrationstests: Sie bedienen die Benutzeroberfläche oder benötigen Testabläufe, die an XCTest gekoppelt sind. Behalten Sie sie zunächst in XCTest, bis die benötigten Funktionen in der Zielumgebung nachweislich abgedeckt sind.
- Spezialtests: Dazu gehören etwa bestimmte Leistungstests oder Tests, die auf Objective-C-Ausnahmen angewiesen sind. Migrieren Sie diese nicht allein deshalb, weil andere Tests bereits umgestellt wurden.
Swift Testing bietet unter anderem eine moderne Testdeklaration und strukturierte Erwartungen. Die konkrete Eignung hängt jedoch von Testzweck und verwendeten APIs ab. Apples Dokumentation zu Swift Testing beschreibt die verfügbaren Grundfunktionen. XCTest bleibt parallel relevant; seine dokumentierten Möglichkeiten finden Sie in der XCTest-Referenz.
Können Swift Testing und XCTest im selben Projekt laufen? Ja. Apple dokumentiert die Koexistenz und beschreibt die Migration als schrittweisen Vorgang. Das erlaubt eine begrenzte Pilotgruppe: Ein abgegrenzter Satz einfacher Tests kann migriert werden, während UI- und Spezialtests vorerst unverändert bleiben. Die relevante Frage lautet nicht, ob beide Frameworks nebeneinander existieren können, sondern ob der gemischte Lauf in Ihrem konkreten Projekt alle Fehler zuverlässig sichtbar macht.
| Entscheidungsfall | Swift Testing | XCTest | Bewertungsurteil |
|---|---|---|---|
| Neue, reine Swift-Unit-Tests | Gut geeignet, sofern die benötigten Testabläufe abgedeckt sind | Weiterhin möglich | Swift Testing bevorzugen |
| Bestehende einfache Unit-Tests | Schrittweise migrieren und Fehlerverhalten prüfen | Bleibt zunächst nutzbar | Niedriges bis mittleres Migrationsrisiko |
| UI-Automatisierung | Nicht ohne Prüfung als Ersatz annehmen | XCUIAutomation ist dokumentiert verfügbar | XCTest vorerst beibehalten |
| Leistungstests oder besondere XCTest-Abhängigkeiten | Nur nach konkreter Funktionsprüfung | XCTest bietet hierfür dokumentierte Testmöglichkeiten | Nach Bedarf aufteilen |
| Gemeinsame Hilfsfunktionen und Assertions | Verhalten im Mischbetrieb gezielt testen | Bestehende Aufrufe können unverändert bleiben | Interoperabilität als Freigabekriterium |
| Swift-Package-Tests und CI | Toolchain und Ergebnisverarbeitung im Projekt verifizieren | Bestehende Ausführung als Vergleich nutzen | Gleiche Prüfbedingungen herstellen |
Diese Übersicht ist eine Entscheidungshilfe, keine Aussage, dass jedes Projekt dieselben Grenzen hat. Prüfen Sie jede Gruppe anhand des tatsächlichen Testcodes. Eine Suite mit vielen einfachen Modelltests hat ein anderes Risikoprofil als ein Projekt, dessen Tests eng an UI-Zustände, globale Ressourcen oder spezielle XCTest-Helfer gebunden sind.
[ SECTION_02 ] Interoperabilität schützt vor stillen Fehlalarmen
Ein Test kann nach der Migration weiterhin „grün“ erscheinen und dennoch einen wichtigen Fehler nicht so melden, wie das Team es erwartet. Das Risiko betrifft besonders gemeinsame Assertions, Hilfsfunktionen und Testcode, der von einem Framework aus Funktionen des anderen aufruft. Deshalb müssen Sie drei Dinge getrennt prüfen: Wird der Test entdeckt? Wird die Assertion ausgeführt? Und führt ihr Fehlschlag zu einem sichtbaren Fehler im Testlauf?
Wie stellen Sie sicher, dass eine XCTest-Hilfsassertion einen migrierten Test weiterhin scheitern lässt? Legen Sie einen kleinen, kontrollierten Negativtest an: Lassen Sie eine Hilfsfunktion absichtlich eine falsche Bedingung prüfen und verifizieren Sie, dass der Testlauf sie als Fehlschlag ausweist. Führen Sie denselben Prüfweg mit der echten gemeinsamen Hilfsfunktion aus, nicht nur mit einer künstlichen Minimalvariante. Entfernen Sie den Negativtest anschließend oder halten Sie ihn in einer klar abgegrenzten Kompatibilitätsprüfung.
Apple beschreibt in der Migrationsdokumentation die Interoperabilität zwischen XCTest und Swift Testing. Verwenden Sie diese Hinweise, um die jeweilige Aufrufrichtung und die Unterstützung vorhandener Assertions zu überprüfen. Leiten Sie daraus aber nicht ab, dass jeder projektinterne Helper ohne Änderung dieselbe Wirkung hat. Eigenentwickelte Wrapper, zusätzliche Fehlerbehandlung oder gemeinsam genutzter Zustand können das Ergebnis beeinflussen.
Eine belastbare Prüfung umfasst folgende Schritte:
- Testinventar erstellen. Erfassen Sie Framework, Testaufgabe, verwendete Assertions, Hilfsfunktionen und Abhängigkeiten. Halten Sie pro Gruppe fest, ob ein Test UI, Netzwerk, Dateien oder globale Zustände berührt.
- Kleine Pilotgruppe auswählen. Beginnen Sie mit isolierten Swift-Unit-Tests ohne XCTest-spezifische Abhängigkeit. Nehmen Sie nicht gleichzeitig Testlogik, Fixtures und Produktionscode in eine größere Überarbeitung auf.
- Testfall migrieren. Übertragen Sie die eigentliche Prüfbedingung, nicht bloß die Syntax. Achten Sie darauf, dass dieselben Eingaben, Grenzfälle und erwarteten Ergebnisse geprüft werden.
- Negativpfad verifizieren. Lösen Sie bewusst einen bekannten Fehler aus. Prüfen Sie, ob der Test entdeckt wird, die Assertion greift und die CI den Fehler korrekt registriert.
- Lokalen und automatisierten Lauf vergleichen. Lassen Sie die neue und die bisherige Variante unter denselben relevanten Bedingungen laufen. Bewahren Sie Fehlermeldungen und Ergebnisdateien für die Analyse auf.
- Migrationsumfang freigeben. Erweitern Sie die Umstellung erst, wenn Tests und Hilfsfunktionen nachvollziehbar scheitern, wenn sie scheitern sollen. Bei unklarer Meldung bleibt der betreffende Test vorerst in XCTest.
Wichtig: Das Abschalten einer Interoperabilitätswarnung oder eines Problems ist kein Nachweis, dass der Test korrekt migriert wurde. Erst ein gezielt ausgelöster Fehler zeigt, ob der tatsächliche Prüfpfad zuverlässig reagiert.
Wenn das Team „Fehler“ unterschiedlich definiert, sollten Sie vor der Migration die Erwartung festhalten: Welche Assertion muss auslösen? Welche Ausgabe muss im Testbericht erscheinen? Welcher Rückgabestatus muss den CI-Lauf fehlschlagen lassen? Diese Kriterien verhindern, dass eine scheinbar erfolgreiche Umstellung lediglich die Beobachtbarkeit verschlechtert.
[ SECTION_03 ] UI, Leistung und Spezialfälle bleiben eigene Entscheidungskriterien
Eine Frameworkmigration ist nicht gleichbedeutend mit einer vollständigen Ablösung von XCTest. Die Benutzeroberflächen-Automatisierung ist ein klarer Grenzfall. Apple stellt dafür eine separate Dokumentation zu XCUIAutomation bereit. Wenn Ihre Tests App-Oberflächen bedienen, auf UI-Elemente warten oder Nutzerinteraktionen automatisieren, behalten Sie diese Abläufe in der bestehenden Umgebung, bis die benötigte Funktionalität und Ausführung im Zielsetup nachgewiesen ist.
Dasselbe gilt für Tests mit besonderer Leistungsmessung. Apple dokumentiert Performance Tests für XCTest. Migrieren Sie einen solchen Test nur, wenn die neue Lösung denselben Messzweck erfüllt und Ergebnisse vergleichbar erhoben werden können. Eine ähnliche Bezeichnung oder eine erfolgreiche Kompilierung beweist keine gleichwertige Messung.
Bei Objective-C-Ausnahmen, projektspezifischen Test-Runnern und stark integrierten Fixtures ist ein enger Funktionstest besser als eine pauschale Annahme. Prüfen Sie zuerst, ob der Test an eine XCTest-API gebunden ist und ob seine Fehler zuverlässig bis zum Ergebnis des gesamten Laufs gelangen. Fehlt ein gleichwertiger Ablauf oder ist die Fehlermeldung nicht mehr eindeutig, bleibt XCTest die sachgerechte Wahl für genau diesen Test.
Neue Funktionen können dagegen eine echte Lücke schließen. Swift Testing dokumentiert parametrisierte Tests, mit denen sich mehrere Eingabefälle in einer Testdefinition ausdrücken lassen. Die Eignung hängt davon ab, ob die Fälle unabhängig verständlich bleiben und Fehler in den Berichten gut zuzuordnen sind. Wenn der Test Fehler über Prozessende prüft, bietet die Dokumentation zu Exit Testing einen relevanten Ansatzpunkt. Übernehmen Sie solche Funktionen nur, wenn sie einen konkreten bestehenden Prüfbedarf lösen.
Welche XCTest-Tests sollten nicht ohne Weiteres migriert werden? Behalten Sie zunächst Tests, die XCUIAutomation, XCTest-Leistungsmessung, Objective-C-Ausnahmen oder nicht geprüfte XCTest-Helfer voraussetzen. Auch Tests mit gemeinsam genutzten Ressourcen gehören erst dann in eine Migration, wenn ihr Zustand sauber isoliert ist. So bleibt die Entscheidung an belegbaren Abhängigkeiten orientiert und nicht an einer pauschalen Vorstellung, ein Framework müsse vollständig verschwinden.
[ SECTION_04 ] Parallelität und Isolation müssen im Projekt nachweisbar sein
Die Möglichkeit paralleler Testausführung ist kein automatischer Geschwindigkeitsgewinn. Sie verändert die Anforderungen an gemeinsam genutzte Zustände. Swift Testing dokumentiert seine Regeln zur Testparallelisierung. Prüfen Sie diese Hinweise zusammen mit dem Verhalten Ihrer eigenen Suite, statt aus einem schnellen Einzelrun auf die Stabilität eines parallelen Laufs zu schließen.
Suchen Sie vor einer Umstellung nach folgenden Abhängigkeiten:
- Gemeinsamer Prozesszustand: Tests verändern globale Variablen, Singleton-Instanzen oder Umgebungswerte.
- Dateisystem: Mehrere Tests schreiben unter denselben Pfad oder lesen veränderliche Testdaten.
- Netzwerk und externe Dienste: Tests teilen Konten, Endpunkte, Ports oder Datenbankzustände.
- Reihenfolgeabhängigkeit: Ein Test setzt implizit voraus, dass ein anderer vorher Daten angelegt oder aufgeräumt hat.
- Nicht deterministische Zeitabläufe: Tests hängen von Wartezeiten, Timern oder asynchronen Ereignissen ab.
Für jede gefundene Abhängigkeit braucht es eine konkrete Isolation: eindeutige Testdaten, getrennte Verzeichnisse, Stub-Dienste, kontrollierte Zustandsrücksetzung oder eine bewusst begrenzte Parallelisierung. Wählen Sie die Maßnahme nach Ursache. Eine globale Deaktivierung der Parallelität kann Symptome verbergen, löst aber keinen fehlerhaften gemeinsam genutzten Zustand.
Vergleichen Sie wiederholte Läufe unter derselben Konfiguration. Dokumentieren Sie, welcher Test scheitert, welcher Zustand geteilt wurde und ob sich das Ergebnis nach Isolation ändert. Das ist belastbarer als ein Versprechen über Laufzeitverkürzung. Eine Migration ist erst dann tragfähig, wenn ein Test sowohl im lokalen Ablauf als auch in der CI reproduzierbare Ergebnisse liefert.
[ SECTION_05 ] Swift Package Manager, Xcode 27 und CI werden gemeinsam geprüft
Wie führen Sie Swift Testing schrittweise in einem Swift-Package-Manager-Projekt ein? Beginnen Sie mit einem einzelnen Testziel oder einer klar abgegrenzten Gruppe. Prüfen Sie die verwendete Toolchain, die Testentdeckung, den lokalen Aufruf und die Ergebnisdarstellung in der CI. Swift Testing und XCTest sollten zunächst unter denselben Bedingungen ausgeführt werden, damit Unterschiede auf die Testumstellung zurückgeführt werden können und nicht auf eine gleichzeitig geänderte Build-Konfiguration.
Für Projekte mit Xcode 27 ist die konkrete Unterstützung von APIs und Werkzeugen anhand der jeweiligen Toolchain zu prüfen. Apples Xcode-27-Veröffentlichungshinweise sind dafür eine Referenz; die Dokumentation allein ersetzt jedoch keinen Testlauf mit dem Projekt. Halten Sie fest, welche Xcode-Version lokal und in der CI verwendet wird. Prüfen Sie außerdem, ob Paketabhängigkeiten, Testpläne, Kommandozeilenaufrufe und die Ausgabe der Testergebnisse konsistent behandelt werden.
Die Abnahme sollte mindestens folgende Fragen beantworten:
- Werden beide Frameworks in den vorgesehenen Testzielen entdeckt?
- Stimmen die lokal ausgeführten Tests mit dem automatisierten Lauf überein?
- Ist ein fehlgeschlagener Test anhand der Ausgabe eindeutig zuzuordnen?
- Sind Testartefakte und Ergebnisdateien für die Fehleranalyse zugänglich?
- Lassen sich relevante Fehler auf derselben Toolchain erneut auslösen?
- Sind Änderungen an Paketmanifest, Testplan und CI-Konfiguration nachvollziehbar?
Ein grüner Lauf auf einem einzelnen Entwicklungsrechner ist kein Ersatz für die CI-Abnahme. Umgekehrt beweist ein fehlgeschlagener CI-Lauf nicht automatisch einen Fehler in Swift Testing. Unterscheiden Sie zwischen Kompilierung, Testentdeckung, tatsächlicher Testausführung und Ergebnisübertragung. Erst wenn diese Phasen separat überprüft sind, lässt sich ein Fehler sinnvoll eingrenzen.
Für Teams, die ihre Testkette auf einer entfernten Mac-Umgebung prüfen, muss die Prüfung dieselben Testziele, Kommandos und Ergebnisdateien umfassen wie der vorgesehene CI-Ablauf. Kontrollieren Sie, ob sich ein fehlgeschlagener Test mit denselben Eingaben erneut ausführen lässt und ob Logs sowie Testresultate zurückgegeben werden. Ohne dokumentierte Angaben zu einer konkreten Umgebung lässt sich daraus keine Aussage über Frameworkleistung, Kosten oder verfügbare Hardware ableiten. Ein Vergleich mit einem eigenen Mac mini ist nur dann sinnvoll, wenn Sie die benötigten Testabläufe, Verwaltungsaufwände und Nutzungshäufigkeit einbeziehen; als Hardwarealternative können Sie etwa die Informationen zum Mac mini M4 heranziehen.
[ SECTION_06 ] Die Entscheidung fällt pro Testgruppe, nicht pro Repository
Die Bewertung lässt sich in drei Urteile zusammenfassen:
- Swift Testing bevorzugen: Neue, isolierte Swift-Unit-Tests lassen sich damit verständlich abbilden, und ihre Fehler werden lokal wie in der CI zuverlässig sichtbar.
- Gemischten Betrieb fortsetzen: Bestehende XCTest-Tests funktionieren, einzelne Gruppen sind migriert und die Interoperabilität der gemeinsamen Hilfsfunktionen ist noch zu prüfen.
- XCTest gezielt beibehalten: UI-Automatisierung, Leistungstests oder Spezialfälle benötigen nachweislich vorhandene XCTest-Funktionen oder verhalten sich nach der Migration nicht gleichwertig.
Damit ist die Migration keine Alles-oder-nichts-Entscheidung. Ein Projekt kann neue Unit-Tests mit Swift Testing schreiben, unkomplizierte Bestandsfälle nach und nach umstellen und XCTest dort behalten, wo es weiterhin die erforderliche Funktion bereitstellt. Die wichtigste Freigabebedingung ist nicht die Anzahl migrierter Dateien, sondern ein nachweisbar korrektes Fehlerverhalten und ein reproduzierbarer Lauf.
Wer die Tests dafür auf einem dauerhaften Mac ausführen muss, kann zunächst vorhandene lokale Hardware oder die bestehende CI nutzen. Ein eigener Mac verursacht Anschaffungs-, Wartungs- und Verwaltungsaufwand und bindet Kapital, auch wenn die Testlast unregelmäßig ist. Ein entfernter Mac wiederum setzt eine verlässliche Verbindung voraus und ersetzt keine Umgebung, die physische Geräte oder lokale Anschlüsse benötigt. Wenn ein temporärer oder kontinuierlich verfügbarer macOS-Testplatz benötigt wird, kann NOVAKVM als Mietlösung geprüft werden. Welche Variante passt, sollte sich aus den echten Xcode-Testzielen, der Wiederholbarkeit und dem Betriebsaufwand ergeben; Details zur Umgebung finden Sie auf der NOVAKVM-Seite.