2012-09-24 2 views
36

Problème depuis la mise à jour vers Xcode 4.5 lors de l'exécution de mes tests unitaires via la ligne de commande. Ce qui suit est la sortie que je vois quand je tente d'exécuter mes testsTest de l'unité de ligne de commande Xcode 4.5

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 si elle ne dit les tests ont passé et terminé, je ne pense pas qu'ils ont effectivement avoir été rodé.

J'utilise la commande suivante pour exécuter les tests xcodebuild -workspace MyApp.xcworkspace -schéma MyAppTests -sdk iphonesimulator propre débogage build -configuration TEST_AFTER_BUILD = OUI

Quelqu'un at-il courir dans le même problème et peut offrir une solution?

+0

J'ai la même question, et d'autres personnes font ainsi: https://github.com/gabriel/gh-unit/issues/96. Pas de solution pour le moment. –

+1

Je peux confirmer le même problème. Il est là depuis la première version bêta, mais comme il s'agit d'une "fonctionnalité non prise en charge", Apple ne l'a pas aidé. Ma solution est d'écrire un coureur de test OCUnit/SenTest séparé lancé avec WaxSim. Il est partiellement écrit, mais travaille jusqu'à présent, partagera une fois qu'il est terminé – Stew

+0

même problème. le meilleur que j'ai trouvé est ceci (pourtant je ne l'ai pas fonctionné) - http://www.gerardcondon.com/blog/2012/09/20/further-jenkins-setup-code-signing/ –

Répondre

29

Je pensais juste que je dois aussi partager ce que je l'ai fait pour une solution à ce problème. J'ai suivi la solution décrite dans https://stackoverflow.com/a/10823483/666943 mais j'ai converti le script ruby ​​en shell. A la fin je essentiellement installé ios-sim via homebrew et remise en place Run Script dans le Build Phases de mon objectif de test avec les éléments suivants:

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 dans 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

je reçois toujours l'erreur suivante: '[DEBUG] session n'a pas pu démarrer: Erreur de domaine = DTiPhoneSimulatorErrorDomain Code = 2 « session du simulateur a expiré. » UserInfo = 0x7fd323c2a4a0 {NSLocalizedDescription = La session du simulateur a expiré.} ' – fabb

+0

Si c'est pour jenkins comme je vois que votre autre question était liée à alors vous aurez besoin d'une autre étape pour le faire fonctionner. Lors de l'installation de Jenkins sur notre serveur de build, il a créé le plist du launchd 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 à/Library/LaunchAgents à la place, de sorte que son exécution en tant que l'utilisateur connecté, cela a résolu le problème. –

+1

Nono, j'ai essayé celui-ci sans Jenkins pour l'instant. Je l'ai exécuté à partir de Xcode en exécutant le schéma de test (j'essaierai aussi à partir de la ligne de commande, peut-être que c'est de là que vient l'erreur). Et: j'ai un serveur Jenkins séparé et un nœud de construction. Dans la plupart des cas, l'utilisateur 'jenkins' sur le noeud de construction n'est * pas * connecté. Le serveur se connecte simplement via SSH. Il a l'habitude de bien fonctionner dans Xcode 4.4.1 avec ce hack: http://www.raingrove.com/2012/03/28/running-ocunit-and-specta-tests-from-command-line.html – fabb

9

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

L'outil n'est en aucun cas complet, mais il semble que suffisamment de personnes aient ce problème pour que je libère l'outil tel quel pour l'instant. S'il vous plaît fourchez ou commentez afin que je puisse améliorer l'outil.

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

également garder un oeil sur ce radar sur la question http://openradar.appspot.com/12306879

+0

Je peux confirmer que la réponse de Stew est ce qui m'a aidé à obtenir des tests unitaires en cours d'exécution. – Jessedc

+0

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

+0

Ce qui ne fonctionne pas exécute d'autres tests à partir d'un sous-projet de bibliothèque dans le même schéma. – fabb

6

Réglage de la iphonesimulator à la version 5.1 semble résoudre le problème. Il y a des bugs radar sur ce problème.

Cet article mentionne également une bonne solution à suivre:

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

+1

J'ai fini par aller chercher une solution similaire au lien que vous avez fourni sur la base de la réponse http://stackoverflow.com/a/10823483/666943. –

+0

Je suppose que vous avez toujours besoin de patcher 'RunPlatformUnitTests' comme décrit ici? http://www.raingrove.com/2012/03/28/running-ocunit-and-specta-tests-from-command-line.html – fabb

+0

Eh oui, patcher les RunPlatformUnitTests est également nécessaire. J'ai un échantillon ici: https://github.com/victorlima/AutoBuild/blob/master/scripts/RunPlatformUnitTests.patched. Laissez-moi savoir si cela fonctionne. –

2

Il y a aussi un petit bidouillage qui peut aider à lancer des tests de ligne de commande sur iOS6.0 simulateur SDK

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

D'abord, vous devez mettre à jour votre fichier principalun peu:

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

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

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

Cedar unitTest fonctionnera bien, avec un peu de temps d'exécution mises en garde, mais au moins ils vont pouvoir courir :)

Questions connexes