Xcode 4: Exécuter des tests à partir de la ligne de commande (xcodebuild)?
J'ai créé un tout nouveau iOS projet dans Xcode 4, et inclus des tests unitaires. La valeur par défaut de l'app a 2 objectifs, l'application principale et l'unité de test bundle. À l'aide de "Produit > Test" (Commande-U) génère l'application, construit l'unité de test bundle, lance le simulateur iOS et exécute les tests. Maintenant, je voudrais être capable de faire la même chose à partir de la ligne de commande. L'outil de ligne de commande (xcodebuild) n'a pas un "test" de l'action, mais il semble que je devrais être en mesure de construire l'unité de test faisceau cible directement, car elle dépend de l'application elle-même. Toutefois, en cours d'exécution:
xcodebuild -target TestAppTests -sdk iphonesimulator4.3 -configuration Debug build
vous donne le message suivant:
/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools/Tools/RunPlatformUnitTests:95: warning: Skipping tests; the iPhoneSimulator platform does not currently support application-hosted tests (TEST_HOST set).
Qui semble comme un mensonge, puisque l'Hôte de Test est fixé pour mon test de l'unité bundle cible, quand je lance la Commande-U à partir de l'interface graphique. J'ai vu des posts précédents au sujet de la séparation entre la logique des tests et des examens, mais il semble comme Xcode 4 ne fait pas cette distinction. Aucune idée de comment je peux faire tourner mes tests en ligne de commande?
Vous devez vous connecter pour publier un commentaire.
Remarque Importante
Avec Xcode 5.1 (peut-être plus tôt Xcode ainsi)
test
est valable action de construire.Nous avons été en mesure de remplacer la totalité du hack ci-dessous avec un appel à xcodebuild à l'aide de l'action de génération de test approprié et des
-destination
options.man xcodebuild
pour plus d'info.Les informations ci-dessous à gauche ici pour la postérité
J'ai essayé de piratage d'Apple scripts pour exécuter des tests unitaires comme mentionné dans
L'exécution de Xcode 4 tests unitaires à partir de la ligne de commande
et
Xcode4: Application en cours d'Exécution de Tests à Partir de la Ligne de Commande dans iOS
et de nombreuses écritures semblables à travers le web.
Cependant, j'ai rencontré un problème avec ces solutions. Certains de nos tests unitaires exercé l'iOS Trousseau et ces appels, lors de l'exécution dans l'environnement qui vient de piratage d'Apple scripts, a échoué avec une erreur (
errSecNotAvailable
[-25291] pour le morbide curieux). En conséquence, les tests ont toujours échoué... une caractéristique indésirable dans un test.J'ai essayé un certain nombre de solutions basées sur les informations que j'ai trouvé ailleurs sur le web. Certaines de ces solutions impliqués essayer de lancer le simulateur iOS du démon des services de sécurité, par exemple. Après avoir lutté avec celles-là, Mon meilleur pari semble être à exécuter dans le simulateur iOS tirer pleinement parti des avantages du simulateur de l'environnement.
Ce que j'ai fait, puis de mettre la main sur le Simulateur iOS de lancement de l'outil de ios-sim. Cet outil de ligne de commande utilise privé Apple cadres de lancer une application iOS à partir de la ligne de commande. De moi, cependant, est le fait qu'il me permet de passer des Variables d'Environnement et les Arguments de Ligne de Commande de l'application qu'il lance.
Si les variables d'Environnement, j'ai pu obtenir mon Test Unitaire faisceau injecté dans mon Application. À travers les arguments de ligne de commande, je peux passer l' "-SenTest Tous" nécessaire pour obtenir l'application pour exécuter les tests unitaires et d'arrêter de fumer.
J'ai créé un programme (que j'ai appelée "CommandLineUnitTests) pour mes tests unitaires bundle et coché la case "Exécuter" dans la construction de la section comme décrit dans les posts ci-dessus.
Plutôt que de piratage d'Apple scripts, si, j'ai remplacé le script avec celui qui lance l'application en utilisant ios-sim et configure l'environnement à injecter mes tests unitaires module dans l'application séparément.
Mon script est écrit en Ruby qui est plus familier pour moi que des scripts BASH. Voici le script:
L'exécution de cette ligne de commande ressemble à ceci:
Après la recherche de la
SL_RUN_UNIT_TESTS
variable d'environnement, le script trouve le "lanceur" (iOS-sim exécutable) dans le cadre du projet de l'arbre source. Il construit alors le chemin d'accès de mes Tests Unitaires Bundle basé sur les paramètres de construction que Xcode passe dans les variables d'environnement.Ensuite, j'ai créer l'ensemble de l'Environnement d'exécution Variables pour mon application en cours d'exécution que d'injecter de l'unité de test bundle. J'ai mis en place ces variables dans le
environment
de hachage dans le milieu du script puis utiliser ruby grunge à se joindre à eux dans une série d'arguments de ligne de commande pour leios-sim
application.Près de la bas je prends la
TEST_HOST
de l'environnement dans l'application que je veux le lancer et lesystem
commande s'exécute en faitios-sim
en passant de l'application, les arguments de la commande pour configurer l'environnement, et les arguments-SenTest All
et le test bundle chemin d'accès à l'application en cours d'exécution.L'avantage de ce régime est qu'il exécute les tests unitaires dans le simulateur de l'environnement autant que je crois que Xcode lui-même n'. L'inconvénient de ce procédé est qu'il s'appuie sur un outil externe pour lancer l'application. Que outil externe utilise privé Apple cadres, de sorte qu'il peut être fragile, avec postérieure de l'OS versions, mais il fonctionne pour le moment.
P. S. j'ai utilisé le "je" beaucoup de choses dans ce post, le récit raisons, mais une grande partie du mérite en revient à mon partenaire dans le crime, Pawel, qui a travaillé par le biais de ces problèmes avec moi.
WaxSim
projet sur github (voir le dernier clone) offre un meilleur contrôle deios-sim
sur le simulateur de cadre - vous pouvez passer des paramètres plus facilement. Je peux aussi recommander de voir commentgcov
utilitaire de ligne de commande fonctionne. Il est très facile de générer assez de couverture de code de rapports. Vous pouvez également utilisersed
ignorer non testable code délimité par COV_NF_START/_END/_LINE si vous utilisezCoverStory
comme moi (l'astuce consiste à remplacer#####
par quelque chose d'autre).[DEBUG] Session could not be started: Error Domain=DTiPhoneSimulatorErrorDomain Code=1 "Unknown error." UserInfo=0x7ffc23ce0dd0 {NSLocalizedDescription=Unknown error., DTiPhoneSimulatorUnderlyingErrorCodeKey=-1}
. A toute personne rencontre le même problème?I replaced the script with one that launches the application using ios-sim
Ack, ont besoin de plus de détails sur cette partie. Comment est-ce fait?J'ai été inspiré par Jonas post et a trouvé un moyen de le faire:
http://longweekendmobile.com/2011/04/17/xcode4-running-application-tests-from-the-command-line-in-ios/
Fondamentalement, vous avez besoin d'Xcode 4 et vous avez à pirater un script pour le faire fonctionner, mais il n'.
Le point clé est de convaincre Xcode 4 pour exécuter votre iOS test bundle comme si c'était un MacOS X bundle - il un problème avec la plate-forme, Xcode ne veut pas exécuter l'application des tests de la boîte sur la ligne de commande. Drôle, parce qu'elle semble fonctionner.
Il y a aussi un exemple de projet sur le site.
ce que vous cherchez est ce sans-papiers argument (vous avez besoin du sdk et cible trop) pour exécuter votre OCUnit de Tests à partir de la borne
warning: Skipping tests; the iPhoneSimulator platform does not currently support application-hosted tests (TEST_HOST set).
avec XCode 4.6.1 quand je lancexcodebuild -target TestTarget -sdk iphonesimulator TEST_AFTER_BUILD=YES
C'est une solution incomplète mais j'ai été en mesure d'exécuter la ligne de commande des versions de tests de logique dans leur propre régime et de construire cible: http://blog.carbonfive.com/2011/04/06/running-xcode-4-unit-tests-from-the-command-line/
xctool résout ce problème: https://github.com/facebook/xctool
nous l'utilisons sur notre serveur d'intégration continue sans problèmes
xctool
mais encore obtenir le message d'erreur de ce poste est d'environ. La version de Xcode utilisez-vous?