Question

Je suis en train de migrer mon projet à partir de Xcode 4.6.3 à Xcode 5.0.2.Le projet de l'unité de tests ont été développés avec SenTestingKit/OCUnit.Maintenant, quand je suis en cours d'exécution des tests dans Xcode 5, j'obtiens une erreur à partir de la RunUnitTests script de me dire que

RunUnitTests est obsolète.

Possiblement liés à cette note dans Xcode 5 notes de version:

SenTestingKit et OCUnit sont obsolètes.Utiliser le migrator pour passer à XCTest.

Malheureusement, je n'ai pas pu en savoir plus sur ce mystérieux "migrateur".Peut-être mon google-fu est le manque de [nouveau], donc ma question principale est:Comment puis-je migrer de tests unitaires à partir de SenTestingKit/OCUnit à la nouvelle XCTest (avec ou sans le "migrateur")?

Une question secondaire, dans le cas où la migration est un processus complexe:Est-il possible d'obtenir Xcode 5 pour exécuter les tests unitaires qui sont encore fondées sur SenTestingKit/OCUnit?Après tout ce ne sont que des obsolète, de sorte qu'ils doivent être toujours là et fonctionnelle.

Était-ce utile?

La solution

Grâce à Shaggy Frog réponse, nous savons que le mystérieux "migrator" mentionné dans les notes de version de Xcode est un assistant lancé en sélectionnant "Edit > Refactor > Convertir XCTest".Je vais écrire au sujet de mon expérience avec cet assistant en deux parties.La première partie est une réponse incomplète à la question principale, la deuxième partie répond à la question secondaire.


Partie 1:Comment migrer à partir de OCUnit à XCTest

La première chose que vous devez comprendre, c'est que pour que l'assistant de travail, vous devez sélectionnez une unité de test de la cible.Si vous avez l'objectif principal est sélectionné, l'assistant n'est tout simplement pas la liste de toutes les cibles à convertir.

Une fois que j'ai découvert à ce sujet, j'ai été capable de l'étape par le biais de l'assistant, mais dans mon cas, le résultat final était encore un échec spectaculaire!L'assistant affirmé qu'aucun source des changements étaient nécessaires et que seuls les paramètres de construction nécessaires pour être mis à jour pour migrer vers XCTest.En fin de compte, l'assistant n'a même pas réussi à le faire correctement:Il n' supprimer la référence à l'SenTestingKit cadre, mais il n'a pas mettre dans une référence à la XCTest cadre.

De toute façon, ce qui suit est une liste des changements que j'ai eu à effectuer manuellement en raison de l'échec de l'assistant pour les faire pour moi.Si l'assistant est la meilleure pour vous, vous ne pouvez pas besoin de faire toutes ces choses.

  1. Supprimer le "Run Script" phase de construction de l'unité de test de la cible
  2. Modifier la classe de base de toutes les classes de cas de test à partir de SenTestCase pour XCTestCase
  3. Changement importées en-tête de <SenTestingKit/SenTestingKit.h> pour <XCTest/XCTest.h>
  4. Dans le test de la cible de Construire des Paramètres, modifier Wrapper Extension de octest pour xctest.
  5. Renommer tous les affirmer des macros à partir d' ST* pour XCT* (par ex. STAssertTrue devient XCTAssertTrue)
  6. Exception à ce qui précède: STAssertEquals doit être renommé XCTAssertEqual (remarque le manque de "s" à la fin).Vous saurez que vous avez oublié à ce sujet si vous obtenez ce message d'avertissement du compilateur: warning: implicit declaration of function 'XCTAssertEquals' is invalid in C99
  7. La nouvelle XCTest affirmer macros ne permettent pas nil pour être passé comme la description d'erreur.Par exemple, XCTAssertNotNil(anObject, nil) n'est pas possible et doit être changé XCTAssertNotNil(anObject).Vous saurez que vous avez ce problème lorsque vous obtenez cette erreur du compilateur: error: called object type 'NSString *' is not a function or function pointer.
  8. Si vous faire besoin de passer un échec de la description, la nouvelle XCTest affirmer macros nécessitent une expression constante pour le spécificateur de format, tout comme le NSString méthode de classe stringWithFormat: n'.Vous saurez que vous avez ce problème lorsque vous obtenez cette erreur du compilateur: error: expected ')'.Quelques exemples:
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);

Dernier mais non le moindre, comme déjà mentionné plus haut, la référence à la XCTest cadre doit être ajouté à l'unité de test de la cible.Vous saurez que vous avez oublié ce que si vous obtenez des erreurs, telles que l'éditeur de liens Undefined symbols for architecture i386: "_OBJC_CLASS_$_XCTestCase", referenced from: foo.

Xcode 6 mise à jour:De se lier à des XCTest n'est plus requis dans Xcode 6 (en fait XCTest n'est même pas répertorié comme un cadre plus).Au lieu de définir le paramètre de construction CLANG_ENABLE_MODULES OUI (exposée dans l'INTERFACE utilisateur "Activer les Modules (C et Objective-C)").Ce sera la cause de clang de lier automatiquement contre XCTest quand il voit un #import <XCTest/XCTest.h> l'énoncé.Les détails sont disponibles dans le Les "Modules" de la section de la documentation clang.


Partie 2:Comment faire pour exécuter OCUnit tests dans Xcode 5

À ce point, j'ai un linker erreur qui m'a fait réaliser que ma mission est de migrer vers XCTest avait échoué.La raison:XCTest ne fait pas partie du kit de développement SDK 6.1, mais je suis toujours à la construction de mon projet avec base SDK iOS 6.1 (cette SORTE de réponse explique comment intégrer le SDK 6.1 dans Xcode 5).

Depuis que je suis dans l'impossibilité de continuer avec la migration, ma solution pour l'instant est donc de garder mes tests unitaires basés sur SenTestingKit/OCUnit, jusqu'à ce que je trouve le temps de mettre à jour mon appli pour iOS 7.C'est ce que j'avais à faire pour obtenir l'unité tests à exécuter:

  1. Supprimer le "Run Script" phase de construction de l'unité de test de la cible.C'est tout ce qui est nécessaire pour permettre Xcode l'exécution de tests unitaires via le "Test" de l'action ( + U) alors que le test de l'unité cible est sélectionnée.
  2. Ce n'est pas l'idéal, mais, parce que je ne veux pas changer de cible juste pour l'exécution de tests unitaires.Au lieu de cela, je veux l'exécution de tests unitaires alors que la cible principale est sélectionnée.La deuxième étape est donc de modifier la cible principale Xcode de régime, de sorte que lorsque je lance le "Test" de l'action, l'unité de test de la cible de tests sont exécutés à la place.

La solution finale n'est pas aussi bon que dans Xcode 4.x où les tests unitaires ont été exécutés automatiquement à chaque fois que j'ai couru à la cible principale sur "Run" ou "Construire" de l'action.Malheureusement, il semble que je ne peux pas obtenir que cela fonctionne sans un "Run Script" phase de construction.

Autres conseils

Edit -> Refacteur -> Convertir en Xctest

Les tests OCUNIT vont toujours fonctionner, mais vous pourriez aussi bien migrer.Les changements finissent par être assez minimes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top