web-dev-qa-db-fra.com

Les tests Xcode 7 ne s'exécutent pas mais signalent le succès

J'essaie d'ajouter une cible de test à mon projet, mais lorsque je lance les tests, il semble que les tests réels ne soient pas exécutés, mais Xcode signale toujours le succès, mais le petit carré qui indique si le test a réussi ou non reste clair.

Je n'ai qu'une cible de test et une classe:

@implementation Tests

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
    XCTAssert(false, "");
}

- (void)testPerformanceExample {
    XCTAssert(false, "");
}

@end

Le test devrait échouer mais il affiche une fenêtre contextuelle indiquant succès. De plus, le rapport de test indique qu'il n'y a aucun test.

Si j'essaie d'exécuter les tests individuellement, les tests "réussissent" mais je n'obtiens aucune information sur le rapport et le carré reste vide.

Des idées sur la façon de le réparer?

33
Emanuel

Si vous construisez pour iOS, Xcode est-il généralement configuré pour s'exécuter sur un appareil physique? Si c'est le cas, essayez de le configurer pour qu'il s'exécute sur le simulateur iOS.

J'ai trouvé que si Xcode 7 est configuré sur un appareil physique, les tests unitaires se comporteront exactement comme vous l'avez décrit. Configurer Xcode pour qu'il s'exécute temporairement sur le simulateur iOS pour les tests unitaires a corrigé le problème, et maintenant cela fonctionne comme un charme.

J'espère que cela aide toute personne rencontrant le même problème. :RÉ

22
Martin Van Buren

Pour toute autre personne confrontée à ce problème, assurez-vous que votre classe de test hérite de XCTestCase par opposition à XCTest. Je devenais fou en essayant toutes ces solutions jusqu'à ce que je réalise que j'héritais d'une mauvaise classe. Xcode ne se plaint pas, il dira simplement que les tests ont réussi sans les exécuter. J'espère que cela aide quelqu'un.

25
faircloud

Il convient de mentionner pour tous ceux qui resteront bloqués à l'avenir: Xcode n'exécute que les fonctions XCTestCase qui commencent par "test". Cela est contraire aux autres plates-formes et m'a confondu lorsque j'ai commencé les tests sur iOS.

Dans la classe suivante:

class MyBigTest: XCTestCase {

    func testSensibleInputReturnSensibleAnswer() {
        XCTAssert(/* stuff */)
    }

    func someOtherTest() {
        XCTAssert(/* some other stuff */)
    }
}

Seule testSensibleInputReturnSensibleAnswer() s'exécutera.

15
huwr

Éteignez l'appareil iOS, puis rallumez-le. Vous pouvez également retirer le câble USB et vous reconnecter afin que Xcode puisse rétablir les communications avec l'appareil. Lorsque cela m'est arrivé, le test signalait que le test avait réussi immédiatement sans que le test ne soit jamais exécuté. J'ai également remarqué que lorsque j'essayais d'enregistrer une nouvelle action de test d'interface utilisateur que Xcode plantait à chaque fois - semblable à la façon dont il se comportait avant d'activer pour la première fois le paramètre Paramètres iOS - Développeur - Activer l'automatisation d'interface utilisateur et je me suis souvenu qu'un redémarrage du périphérique iOS était nécessaire lorsque cela était activé, j'ai donc essayé le redémarrage de l'appareil iOS et Xcode a recommencé à se comporter où je pouvais enregistrer et exécuter des tests avec succès sur mes appareils iOS. Divulgation complète: j'ai également activé et désactivé l'activation de l'automatisation de l'interface utilisateur avant de redémarrer mon appareil iOS, mais je doute que cela soit nécessaire. -rrh

10
Richie Hyatt

Vérifiez la console (Commande-Maj-Y).

Dans mon cas, une sortie était imprimée indiquant pourquoi les tests ne fonctionnaient pas. (La vérification avant vol pour les frameworks dynamiques échouait.) Mais je ne l'ai pas vu car la zone de débogage s'est effondrée.

Dans mon cas également, le problème a été résolu en ajoutant $(PROJECT_DIR)/Carthage/Build/iOS à mes chemins de recherche d'exécution comme décrit ici

9
funroll

Vieille question mais les choses qui l'ont résolue dans mon cas ont encore été mentionnées ici:

Vous ne pouvez pas (toujours?) Renommer des classes/cas de test. Créez une nouvelle classe/cas et jetez l'ancien.

2
Departamento B

J'ai eu le même problème et le nettoyage du dossier de construction le résoudrait. Cependant, il existe un moyen encore plus rapide qui fait Product -> Perform Action -> Test Without Building

2
jjramos

FWIW J'ai également eu un problème très similaire lors de l'utilisation de beforeAll de KIF. Parfois, le code placé à l'intérieur de beforeAll ne fonctionnait tout simplement pas et le test revenait quand même comme un succès.

Il fait aussi parfois planter Xcode. Voir la page Github de KIF ici . Bien que certains aient souligné que le problème peut ne pas être dû à KIF et plutôt à XCTest lui-même

La solution temporaire était d'éviter d'utiliser beforeAll et d'utiliser à la place beforeEach

1
Honey

S'il s'agit de tests d'automatisation de l'interface utilisateur, cela peut être dû au fait que vous n'initialisez pas l'application et ne la lancez pas.

XCUIApplication *app = [[XCUIApplication alloc] init];
[app launch];
1

Je rencontre cette situation lors de la création Objective-C test class avec le même nom que la classe Swift existante.

Renommez simplement un fichier de test

0
yoAlex5

J'ai eu la méthode de test marquée comme private et ce qui m'a résolu était simplement de supprimer le modificateur d'accès private.

0
shoe