36 votes

Tests unitaires en ligne de commande dans Xcode 4.5

J'ai un problème depuis la mise à jour vers Xcode 4.5 lorsque je lance mes tests unitaires via la ligne de commande. Voici le résultat que je vois lorsque j'essaie d'exécuter mes tests

Unknown Device Type. Using UIUserInterfaceIdiomPad based on screen size
Terminating since there is no workspace.
/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include:334: note: Passed tests for architecture 'i386' (GC OFF)

/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include:345: note: Completed tests for architectures 'i386'

Même s'il est indiqué que les tests ont été passés et achevés, je ne pense pas qu'ils aient réellement été effectués.

J'utilise la commande suivante pour exécuter les tests :

xcodebuild -workspace MyApp.xcworkspace -scheme MyAppTests -sdk iphonesimulator -configuration Debug clean build TEST_AFTER_BUILD=YES

Quelqu'un a-t-il rencontré le même problème et peut-il proposer une solution ?

0 votes

J'ai le même problème, et d'autres personnes aussi : github.com/gabriel/gh-unit/issues/96 . Aucune solution pour l'instant.

1 votes

Je peux confirmer le même problème. Il existe depuis la première bêta, mais comme il s'agit d'une "fonctionnalité non prise en charge", Apple n'a rien fait pour y remédier. Ma solution est d'écrire un runner de test OCUnit/SenTest séparé lancé à l'aide de WaxSim. Il est partiellement écrit, mais fonctionne jusqu'à présent, je le partagerai une fois qu'il sera terminé.

0 votes

Le meilleur que j'ai trouvé est le suivant (mais je n'ai pas encore réussi à le faire fonctionner) gerardcondon.com/blog/2012/09/20/

29voto

Edward Huynh Points 1651

J'ai pensé que je devais également partager ce que j'ai fait pour résoudre ce problème. J'ai suivi la solution décrite dans https://stackoverflow.com/a/10823483/666943 mais a converti le ruby script en shell. À la fin, j'ai essentiellement installé ios-sim via homebrew et remplacez le Run Script dans le Build Phases de ma cible de test avec ce qui suit :

if [ "$RUN_UNIT_TEST_WITH_IOS_SIM" = "YES" ]; then
    test_bundle_path="$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.$WRAPPER_EXTENSION"
    ios-sim launch "$(dirname "$TEST_HOST")" --setenv DYLD_INSERT_LIBRARIES=/../../Library/PrivateFrameworks/IDEBundleInjection.framework/IDEBundleInjection --setenv XCInjectBundle="$test_bundle_path" --setenv XCInjectBundleInto="$TEST_HOST" --args -SenTest All "$test_bundle_path"
    echo "Finished running tests with ios-sim"
else
    "${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests"
fi

Pour démarrer le test maintenant, je passe l'argument RUN_UNIT_TEST_WITH_IOS_SIM=YES par exemple

xcodebuild -workspace MyApp.xcworkspace -scheme MyAppTests -sdk iphonesimulator -configuration Debug clean build RUN_UNIT_TEST_WITH_IOS_SIM=YES

3 votes

J'obtiens toujours l'erreur suivante : [DEBUG] Session could not be started: Error Domain=DTiPhoneSimulatorErrorDomain Code=2 "Simulator session timed out." UserInfo=0x7fd323c2a4a0 {NSLocalizedDescription=Simulator session timed out.}

0 votes

Si c'est pour Jenkins, comme je vois que votre autre question était liée, vous aurez besoin d'une autre étape pour le faire fonctionner. Lors de l'installation de Jenkins sur notre serveur de construction, le plist launchd a été créé dans /Library/LaunchDaemons. Lorsque j'ai essayé de lancer ios-sim, j'ai rencontré la même erreur que celle que vous avez décrite. Le problème semble être que Jenkins n'est pas exécuté en tant qu'utilisateur connecté. En déplaçant le plist launchd dans /Library/LaunchAgents, afin qu'il soit exécuté en tant qu'utilisateur connecté, le problème a été résolu.

1 votes

Nono, j'ai essayé celui-là sans Jenkins pour l'instant. Je l'ai exécuté depuis Xcode en lançant le schéma de test (je vais aussi essayer depuis la ligne de commande, c'est peut-être de là que vient l'erreur). Et : J'ai un serveur Jenkins et un nœud de construction séparés. Dans la plupart des cas, le jenkins sur le nœud de construction est no connecté. Le serveur s'y connecte simplement via SSH. Cela fonctionnait bien dans Xcode 4.4.1 avec cette modification : raingrove.com/2012/03/28/…

9voto

Stew Points 1301

J'ai remarqué ce problème dans les versions bêta de Xcode 4.5 / iOS 6. J'ai travaillé sur un runner de tests unitaires autonome pour contourner ce problème. Il fonctionne en compilant votre bundle de tests unitaires, puis en compilant une version de votre application qui exécute automatiquement les tests unitaires dans un environnement simulateur.

L'outil n'est en aucun cas complet, mais suffisamment de personnes semblent avoir ce problème pour que je publie l'outil tel quel pour le moment. S'il vous plaît fork ou commentaire afin que je puisse améliorer l'outil.

xcodetest : https://github.com/sgleadow/xcodetest

Gardez également à l'œil ce radar sur la question http://openradar.appspot.com/12306879

0 votes

Je peux confirmer que c'est la réponse de Stew qui m'a aidé à faire fonctionner les tests unitaires.

0 votes

Ça marche ! Mais j'ai dû ajouter -arch i386 aux deux xcodebuild occurrences dans le script.

0 votes

Ce qui ne fonctionne pas, c'est l'exécution d'autres tests à partir d'un sous-projet de bibliothèque dans le même schéma.

6voto

Victor Lima Points 116

xcodebuild -project ${PROJECT_PATH}/${PROJECT_NAME}.xcodeproj \ -scheme ${TEST_SCHEME} \ -configuration Debug \ -sdk iphonesimulator5.1 \ clean build \ TEST_AFTER_BUILD=YES

Le réglage de l'iphonesimulator à la version 5.1 semble résoudre le problème. Il y a des bugs de radar remplis sur cette question.

Cet article mentionne également une bonne solution à suivre :

http://baolei.tumblr.com/post/32428168156/ios-unit-test-from-command-line-ios6-xcode4-5

1 votes

J'ai fini par opter pour une solution similaire au lien que vous avez fourni en me basant sur la réponse suivante stackoverflow.com/a/10823483/666943 .

0 votes

Je suppose que tu as toujours besoin de patcher RunPlatformUnitTests comme celle décrite ici ? raingrove.com/2012/03/28/…

0 votes

Yup, Parcheando le RunPlatformUnitTests est également nécessaire. J'en ai un exemple ici : github.com/victorlima/AutoBuild/blob/master/scripts/ . Faites-moi savoir si cela fonctionne.

2voto

tt.Kilew Points 2136

Il existe également une petite astuce qui peut aider à exécuter des tests en ligne de commande sur le SDK du simulateur iOS6.0.

J'utilise Cedar et ce tweak m'a aidé :

Tout d'abord, vous devez mettre à jour votre principal un peu :

  // Faking up that workspace port
  CFMessagePortCreateLocal(NULL, (CFStringRef) @"PurpleWorkspacePort", NULL, NULL,NULL);
  return UIApplicationMain(argc, argv, nil, @"CedarApplicationDelegate");

Deuxièmement, vous devez ajouter une catégorie à UIWindow :

@implementation UIWindow (Private)
- (void)_createContext {
   // Doing nothing here. Just for crash avoidance
}
@end

Cèdre Unittest fonctionneront bien, avec quelques avertissements d'exécution, mais, au moins, ils pourront fonctionner :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X