Frage

Ich bin gerade dabei, mein Projekt von Xcode 4.6.3 auf Xcode 5.0.2 zu migrieren.Die Unit-Tests des Projekts wurden mit SenTestingKit/OCUnit entwickelt.Wenn ich jetzt die Tests in Xcode 5 ausführe, erhalte ich eine Fehlermeldung RunUnitTests Das Drehbuch sagt mir das

RunUnitTests ist veraltet.

Möglicherweise verwandt ist dieser Hinweis in den Versionshinweisen zu Xcode 5:

SenTestingKit und OCUnit sind veraltet.Verwenden Sie den Migrator, um zu XCTest zu wechseln.

Leider konnte ich nicht mehr über diesen mysteriösen „Auswanderer“ herausfinden.Möglicherweise fehlt mein Google-Fu [wieder], daher lautet meine Hauptfrage:Wie migriere ich Unit-Tests von SenTestingKit/OCUnit zum neuen XCTest (mit oder ohne „Migrator“)?

Eine sekundäre Frage für den Fall, dass die Migration eine komplizierte Angelegenheit ist:Ist es möglich, Xcode 5 dazu zu bringen, Unit-Tests auszuführen, die noch auf SenTestingKit/OCUnit basieren?Schließlich sind diese lediglich veraltet und sollten daher immer noch verfügbar und funktionsfähig sein.

War es hilfreich?

Lösung

Dank der Antwort von Shaggy Frog wissen wir, dass der mysteriöse „Migrator“, der in den Xcode-Versionshinweisen erwähnt wird, ein Assistent ist, der durch Auswahl von „Bearbeiten > Refactor > In XCTest konvertieren“ gestartet wird.Ich werde in zwei Teilen über meine Erfahrungen mit diesem Zauberer schreiben.Der erste Teil ist eine unvollständige Antwort auf die Hauptfrage, der zweite Teil beantwortet die Nebenfrage.


Teil 1:So migrieren Sie von OCUnit zu XCTest

Als Erstes müssen Sie sich darüber im Klaren sein, dass Sie dies tun müssen, damit der Assistent funktioniert Wählen Sie ein Unit-Test-Ziel aus.Wenn Sie das Hauptziel ausgewählt haben, listet der Assistent einfach keine zu konvertierenden Ziele auf.

Als ich davon erfuhr, konnte ich zwar den Assistenten durchlaufen, aber in meinem Fall war das Endergebnis immer noch ein spektakulärer Misserfolg!Der Assistent behauptete, dass keine Quelländerungen erforderlich seien und dass nur die Build-Einstellungen aktualisiert werden müssten, um zu XCTest zu migrieren.Am Ende hat der Zauberer es nicht einmal geschafft, das richtig zu machen:Es tat Entfernen Sie den Verweis auf das SenTestingKit-Framework, aber das war der Fall nicht Fügen Sie einen Verweis auf das XCTest-Framework ein.

Was folgt, ist jedenfalls eine Liste der Änderungen, die ich manuell vornehmen musste, weil der Assistent sie nicht für mich durchführen konnte.Wenn der Assistent für Sie besser funktioniert, müssen Sie möglicherweise nicht alle diese Dinge tun.

  1. Entfernen Sie die Build-Phase „Run Script“ aus dem Unit-Test-Ziel
  2. Ändern Sie die Basisklasse aller Testfallklassen von SenTestCase Zu XCTestCase
  3. Ändern Sie den importierten Header von <SenTestingKit/SenTestingKit.h> Zu <XCTest/XCTest.h>
  4. Ändern Sie in den Build-Einstellungen des Testziels die Wrapper-Erweiterung von octest Zu xctest.
  5. Benennen Sie alle Assert-Makros um von ST* Zu XCT* (z.B. STAssertTrue wird XCTAssertTrue)
  6. Ausnahme zum oben Gesagten: STAssertEquals muss umbenannt werden in XCTAssertEqual (Beachten Sie das fehlende „s“ am Ende).Sie wissen, dass Sie das vergessen haben, wenn Sie diese Compiler-Warnung erhalten: warning: implicit declaration of function 'XCTAssertEquals' is invalid in C99
  7. Die neuen XCTest-Assert-Makros erlauben dies nicht nil als Fehlerbeschreibung übergeben werden.Zum Beispiel, XCTAssertNotNil(anObject, nil) ist nicht möglich und muss geändert werden XCTAssertNotNil(anObject).Sie wissen, dass Sie dieses Problem haben, wenn Sie diesen Compilerfehler erhalten: error: called object type 'NSString *' is not a function or function pointer.
  8. Wenn du Tun Wenn Sie eine Fehlerbeschreibung übergeben müssen, erfordern die neuen XCTest-Assertion-Makros einen konstanten Ausdruck für den Formatbezeichner, genau wie die NSString Klassenmethode stringWithFormat: tut.Sie wissen, dass Sie dieses Problem haben, wenn Sie diesen Compilerfehler erhalten: error: expected ')'.Einige Beispiele:
NSString* formatSpecifier = @"%@";
NSString* failureDescription = @"foo";
// These are OK
XCTAssertNotNil(anObject, @"foo")
XCTAssertNotNil(anObject, @"%@", failureDescription)
// These are not OK
XCTAssertNotNil(anObject, failureDescription);
XCTAssertNotNil(anObject, formatSpecifier, failureDescription);

Zu guter Letzt muss, wie bereits weiter oben erwähnt, der Verweis auf das XCTest-Framework zum Unit-Test-Ziel hinzugefügt werden.Sie werden wissen, dass Sie dies vergessen haben, wenn Sie Linkerfehler erhalten, z Undefined symbols for architecture i386: "_OBJC_CLASS_$_XCTestCase", referenced from: foo.

Xcode 6-Update:Die Verknüpfung mit XCTest ist in Xcode 6 nicht mehr erforderlich (tatsächlich wird XCTest nicht einmal mehr als verfügbares Framework aufgeführt).Setzen Sie stattdessen die Build-Einstellung CLANG_ENABLE_MODULES auf YES (in der Benutzeroberfläche als „Enable Modules (C and Objective-C)“ angezeigt).Dies wird dazu führen clang um automatisch eine Verknüpfung mit XCTest herzustellen, wenn ein erkannt wird #import <XCTest/XCTest.h> Stellungnahme.Einzelheiten finden Sie im Abschnitt „Module“ der Clang-Dokumentation.


Teil 2:So führen Sie OCUnit-Tests in Xcode 5 aus

Zu diesem Zeitpunkt erhielt ich einen Linker-Fehler, der mir klar machte, dass meine Mission, auf XCTest zu migrieren, gescheitert war.Der Grund:XCTest ist nicht Teil von SDK 6.1, aber ich erstelle mein Projekt immer noch mit dem Basis-SDK iOS 6.1 (diese SO-Antwort erklärt, wie man SDK 6.1 in Xcode 5 integriert.

Da ich die Migration nicht fortsetzen kann, besteht meine Lösung im Moment darin, meine Unit-Tests auf Basis von SenTestingKit/OCUnit beizubehalten, bis ich die Zeit finde, meine App auf iOS 7 zu aktualisieren.Folgendes musste ich tun, um die Unit-Tests zum Laufen zu bringen:

  1. Entfernen Sie die Build-Phase „Run Script“ aus dem Unit-Test-Ziel.Dies ist alles, was erforderlich ist, damit Xcode Unit-Tests über die Aktion „Test“ ausführen kann ( + U) während das Unit-Test-Ziel ausgewählt ist.
  2. Das ist jedoch nicht ideal, da ich nicht das Ziel wechseln möchte, nur um Unit-Tests durchzuführen.Stattdessen möchte ich Unit-Tests ausführen während das Hauptziel ausgewählt ist.Der zweite Schritt besteht daher darin, das Xcode-Schema des Hauptziels so zu ändern, dass beim Ausführen der Aktion „Test“ stattdessen die Tests des Unit-Test-Ziels ausgeführt werden.

Die endgültige Lösung ist nicht so gut wie in Xcode 4.x, wo die Komponententests jedes Mal automatisch ausgeführt wurden, wenn ich die Aktion „Ausführen“ oder „Erstellen“ des Hauptziels ausführte.Leider scheint es, dass ich dies ohne eine Build-Phase „Run Script“ nicht zum Laufen bringen kann.

Andere Tipps

Bearbeiten -> Refactor -> In XCTest konvertieren

OCUnit-Tests funktionieren weiterhin, aber Sie können genauso gut migrieren.Am Ende sind die Änderungen recht minimal.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top