web-dev-qa-db-fra.com

Ne lancez pas le simulateur lors de l'exécution de tests unitaires

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

35
Victor Ronin

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.

 enter image description here

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
24
rustylepord

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:

  1. Sélectionnez le projet -> la liste déroulante cible -> "Ajouter une cible ..."
  2. Sélectionnez "Mac OSX" -> "Autre" -> "Kit de test des unités de cacao"
  3. Créez le kit de test comme vous le feriez d'un projet normal

Vous pouvez maintenant ajouter des sources au test unitaire et l'exécuter comme un test iOS sans lancer le simulateur.

14
Saltymule

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"];
}
14
rfrittelli

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.

3
LimeRed

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
0
abdullahselek

Solution de contournement:

L'application sera toujours lancée, mais vous pouvez #if définir ce que vous ne voulez pas exécuter.

Approche:

  1. Créez une configuration de construction personnalisée appelée Test en dupliquant Debug (Projet> Info> Créer une nouvelle configuration).
  2. Dans Build Settings> Active Compilation Conditions pour Test, ajoutez TESTING
  3. Edit Scheme> Info> Build Configuration, définissez la configuration de construction sur Test.
  4. Utilisez #if !TESTING#endif autour du code que vous ne voulez pas exécuter lors des tests.

Cadres:

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é.

0
user1046037