Xcode: TEST vs DEBUG macros du préprocesseur
Lors de la création d'un nouveau projet avec les tests unitaires, Xcode, définit la configuration de build Debug pour le Test de schéma (de même pour le système).
Dois-je différencier les Exécuter (Commande-R) & Test (Commande-U) régimes?
I. e., dois-je créer une nouvelle Configuration de Build appelé Test, ajouter un pré-processeur de macros de TEST=1, et l'utiliser comme la configuration de build pour le Test de schéma à la place? Ou, devrais-je continuer à Courir & Test à la fois comme un Débogage?
Je viens de Ruby/Rails, de l'endroit où vous avez généralement de test, de développement, et les environnements de production. Il me semble que le Débogage est comme le développement et la sortie est à l'instar de la production, mais il nous manque un test, c'est pourquoi je pense qu'il pourrait faire sens pour ajouter de Test.
Commentaires? Des avis? Des Suggestions?
Je suis venu demander ce parce que je veux compiler quelque chose pour le Test avec:
#ifdef TEST
//Do something when I test.
#endif
Je ne pense pas que ça compte si j'ai aussi le compiler pour le Débogage. Alors, j'ai vraiment pourriez faire:
#ifdef DEBUG
//Do something when I run or test.
#endif
Mais, je suis vraiment seulement l'intention de le faire pour des tests pour l'instant. Donc, c'est pourquoi je pense que je devrait faire une distinction entre debug & test mais je me demande pourquoi Xcode ne le fait pas par défaut? Apple pense que vous ne devriez pas la différence entre eux?
- Cela ne semble pas avoir quelque chose à voir avec le Schéma, le langage de programmation. (mauvais tag)
- ouais, je voulais dire régimes dans Xcode.
Vous devez vous connecter pour publier un commentaire.
Préprocesseur macros ne fonctionnent pas, vous devez vérifier l'environnement lors de l'exécution.
(Mise à jour de Xcode 7.3)
XCInjectBundleInto
clé. Malade de mise à jour de ce peu de temps.func isRunningTests() -> Bool { let env: [String: String] = NSProcessInfo.processInfo().environment return env["XCInjectBundleInto"] != nil }
Vous pourriez envisager d'ajouter une nouvelle configuration de build.
Dans xcode 4, cliquez sur votre projet sur la main gauche navigator.
Dans la fenêtre principale, cliquez sur votre projet, puis sélectionnez l'onglet "info".
Cliquez sur le bouton "+" pour ajouter une nouvelle configuration (vous pouvez appeler la vôtre "test", si vous voulez").
Maintenant, cliquez sur votre cible, et d'aller à la construction de l'onglet paramètres.
De la recherche pour "macros du préprocesseur"
Ici, vous pouvez ajouter des macros du préprocesseur pour votre nouvelle configuration de build.
Il suffit de double cliquer sur votre nouveau "test" de la configuration, et ajouter de TEST=1.
Enfin, modifier votre régime. Sélectionnez les options de test pour votre régime. Il devrait y avoir une "Configuration" dans le menu déroulant. Sélectionnez votre "test" de configuration.
pod install
après la création de la nouvelle configuration de la compilation.Au lieu de créer un Test de configuration de la compilation, j':
créé un
Tests-Prefix.pch
fichier:entré son chemin dans le Préfixe de champ d'en-Tête des Tests de la cible de paramètres de construction.
ajouté le code suivant en haut d'un fichier que j'ai créé et appelé
MyAppDefines.h
, importé dans leMyApp-Prefix.pch
:Cela me permet d'utiliser
BUNDLE
où jamais je veux dire[NSBundle mainBundle]
et aussi qu'il fonctionne quand je lance les Tests.Importation SenTestingKit dans
Tests-Prefix.pch
aussi de la vitesse de la compilation de la SenTestingKit Cadre et me permet de laisser#import <SenTestingKit/SenTestingKit.h>
à partir du haut de tous les tests des fichiers.[UIApplication sharedApplication]
retourne nil pendant les tests. Je ne peux pas imaginer un autre scénario où ce serait nul, donc je l'ai utilisé comme un test de drapeau avant (s'il vous plaît commentaire si je me trompe!).J'ai décidé d'ajouter une case pour une variable d'environnement dans le code lui-même, au lieu d'utiliser le isRunningTests() suggestion de Robert a fait.
L'écran devrait ressembler à ceci lorsque vous avez terminé.
Le code ci-dessus va trouver l'environnement de TEST de la variable lors de l'exécution en mode test ou en mode application. Ce code va dans votre application, pas l'unité de fichiers de test. Vous pouvez utiliser
Pour prévenir le code exécuté dans la production.
Robert réponse rapide 3.0:
Je test un temps long, trouvé un résultat:
Non seulement vous ajoutez le preproessor macro dans votre unité cible de test(Vous pourriez avoir de nombreuses méthodes
à l'aide de variables pour les tests unitaires seulement,
et suivez les @MattDiPasquale méthodes),
mais aussi, Vous devez ajouter la condition complie de fichier dans votre cible de test.
nous devrions recomplie ce fichier, parce que vous avez une nouvelle macro préprocesseur pour ce fichier,
mais ce fichier est construit dans l'application cible que le temps de votre macro préprocesseur ne l'a pas fait.
Espère que cela vous aidera.
TEST
macro préprocesseur être définis au cours des essais, ajouter ce fichier à la Compilation des Sources" en vertu de la liste "Phases de construction" dans votre cible de test.Si vous créez un Test de configuration de la compilation et de définir ensuite les "Autres Swift Drapeaux" de la propriété de votre Cible afin de "-DTEST" il permettra de définir une macro de TEST qui va travailler dans votre code swift. Assurez-vous que vous définissez dans les paramètres de construction de votre Application cible de sorte que vous pouvez l'utiliser dans votre Application code Swift.
Puis avec ce jeu, vous pouvez tester votre code comme suit:
Mis à jour pour Xcode10:
Regarder des variables d'environnement pour voir si les tests unitaires sont en cours d'exécution. Semblable à Robert de réponse, mais j'seule case à la fois pour la performance de saké.
Sur iOS,
[UIApplication sharedApplication]
sera de retournil
lorsqu'une unité de test est en cours d'exécution.Version modifiée de Kev réponse qui fonctionne pour moi sur Xcode 8.3.2