Un peu de fond:
J'ai une application iOS avec une cible configurée pour exécuter unitTests. Et j'exécute l'outil d'automatisation de la construction Jenkins sur mon MacBook, qui construit automatiquement cette application et exécute tous les tests (à l'aide de l'outil xcodebuild en ligne de commande).
Tout fonctionnait bien avec Xcode 4. Cet outil d’automatisation de la compilation fonctionnait sous différents utilisateurs et exécutait tous ces tests.
Je suis passé récemment à Xcode 5 et cela a commencé à échouer car il ne peut pas lancer Simulator.
Le problème
J'ai un schéma UnitTests qui est configuré pour exécuter des tests (tests logiques). A J'exécute ces tests en utilisant l'une des deux méthodes suivantes:
Commande U dans Xcode
Ou en ligne de commande "/ usr/bin/xcodebuild -scheme UnitTests -sdk iphonesimulator -configuration Libère la nouvelle version TEST_AFTER_BUILD = YES"
Dans les deux cas, il tente de démarrer le simulateur. Cependant, je crois comprendre que cela n’en a pas besoin. Quoi qu'il en soit, il fonctionne sur x86 et il ne semble pas que des applications soient installées sur Simulator.
Existe-t-il un moyen de supprimer ce démarrage fastidieux du simulateur (parce que cela rompt l'automatisation de la construction)?
Mise à jour 1
Semble trouver une question très similaire, mais ne peut pas le faire fonctionner: Exécuter des tests logiques dans Xcode 4 sans lancer le simulateur
Mise à jour 2
J'ai trouvé une question/réponse TRÈS pertinente et intéressante: Apple CI/Xcode Service et Jenkins
Utilisation de xCode 7 et xCtool.
xctool est capable d'exécuter des tests unitaires sans le simulateur.
Pour que cela fonctionne,
1 . Mettez à jour les paramètres de cible pour qu'ils s'exécutent sans application hôte.
Sélectionnez votre projet -> puis testez la cible -> Définissez l’application hôte sur none.
2. Installez xctool, si vous ne l'avez pas.
brew install xctool
3. Exécutez les tests avec terminal avec xctool.
xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator
Vous pouvez créer un test d'unité Mac OSX au lieu d'un test d'unité iOS. Cela nécessite toutefois de ne pas inclure de bibliothèques spécifiques à iOS dans les tests unitaires. Vous pouvez le faire via les éléments suivants:
Vous pouvez maintenant ajouter des sources au test unitaire et l'exécuter comme un test iOS sans lancer le simulateur.
J'ai posé la même question aux ingénieurs Apple. Malheureusement, il ne semble pas que vous puissiez accomplir cela et rester avec iOS en même temps. Il y a quelques astuces que vous pouvez faire pour vérifier si vous testez. Vous pouvez placer cet extrait de code dans votre AppDelegate.h ou dans une autre classe globale pour ne pas charger un contrôleur de vue racine et empêcher toute substance wierdo ui de corrompre vos tests unitaires:
static BOOL isTesting() {
BOOL isTesting = !isEmpty([[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"]);
return isTesting;
}
Un ingénieur Apple a également vérifié qu'il s'agissait d'un contrôle légitime. Et pour donner un crédit lorsque le crédit est dû, vous devez: Déterminer par programme la cible actuelle (exécution ou test) dans un projet iOS
EDIT: J'ai aussi eu du succès avec ça et c'est un peu plus simple:
static BOOL isTesting() {
return [[[NSProcessInfo processInfo] processName] isEqualToString:@"xctest"];
}
Une cible de test osx peut devenir un gros problème car vous devez vous-même gérer le fichier source à inclure. Mettre @testable import YourAppName
au-dessus de vos fichiers XCTest est beaucoup plus pratique. Donc, empêchez simplement le lancement de votre application en cas d’exécution de XCTest.
Dans votre formule AppDelegate: (solution Swift 3)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
if ProcessInfo.processInfo.environment["XCInjectBundleInto"] != nil {
return false
}
...
Cela n'empêchera pas le simulateur de se lancer, mais vous fera gagner beaucoup de temps.
Vous pouvez exécuter des tests unitaires et utilisateur en mode sans tête avec Xcode 9 et une commande de votre terminal. Pour des exemples de commandes:
Construire et tester un espace de travail
xcrun xcodebuild -workspace "YOUR_WORKSPACE_NAME.xcworkspace" -scheme "YOUR_SCHEME" -sdk "iphonesimulator12.0" -destination "OS=12.0,name=iPhone X" -configuration Debug -enableCodeCoverage YES clean build test
Pour projet
xcrun xcodebuild -project "YOUR_PROJECT_NAME.xcodeproj" -scheme "YOUR_SCHEME" -sdk "iphonesimulator12.0" -destination "OS=12.0,name=iPhone X" -configuration Debug -enableCodeCoverage YES clean build test
L'application sera toujours lancée, mais vous pouvez #if
définir ce que vous ne voulez pas exécuter.
Test
en dupliquant Debug
(Projet> Info> Créer une nouvelle configuration).Build Settings
> Active Compilation Conditions
pour Test
, ajoutez TESTING
#if !TESTING
#endif
autour du code que vous ne voulez pas exécuter lors des tests.Si vous avez des infrastructures intégrées, créez la même configuration de construction dans l'infrastructure afin que le fichier binaire de l'infrastructure soit correctement lié.