2011-04-09 2 views
6

J'ai créé un projet Xcode 4 avec un ensemble de tests Cocoa Touch Unit. Je suis capable de créer et d'exécuter des tests logiques avec succès. Cependant, je ne suis pas sûr de savoir comment créer un test en tant que test d'application qui s'exécute sur un appareil iOS et utilise UIKit. Lorsque je crée un test qui utilise UIKit et essayer de lancer les tests dans le faisceau sur l'appareil, Xcode 4 apparaît un dicton dialogue:Comment créer des tests d'application dans un ensemble de test Cocoa Touch Unit avec Xcode 4?

Logic Test Non disponible

Test Logic sur les appareils iOS est non supporté. Vous pouvez exécuter des tests logiques sur le simulateur.

J'ai essayé d'exécuter le test sur le simulateur, mais bien sûr, il a échoué lors des appels UIKit. Est-ce que quelqu'un sait comment créer et exécuter des tests d'application sur des appareils iOS en utilisant Xcode 4 et un ensemble de test de l'unité Cocoa Touch?

EDIT: Dans le cas où il aide, voici le code de test:

@implementation TinyWordsTests 

- (void)setUp 
{ 
    [super setUp]; 
    CC_DIRECTOR_INIT(); 
} 

- (void)tearDown 
{ 
    CC_DIRECTOR_END(); 
    [super tearDown]; 
} 

- (void)testExample 
{ 
    CCScene *scene = [TWOHelloWorldLayer scene]; 
    STAssertNotNil(scene, @"Scene must not be nil."); 
} 

@end 

et la trace de la pile résultant de gdb lorsque le test est exécuté dans le simulateur:

(gdb) bt 
#0 0x00464781 in __HALT() 
#1 0x003af8ed in _CFRuntimeCreateInstance() 
#2 0x00da81ea in GSFontCreateWithName() 
#3 0x038f55eb in UINewFont() 
#4 0x038f56bd in +[UIFont fontWithName:size:traits:]() 
#5 0x038f507d in +[UIFont fontWithName:size:]() 
#6 0x01a49205 in -[CCTexture2D(Text) initWithString:fontName:fontSize:] (self=0x197f9f0, _cmd=0xe10840, string=0x1a9c900, name=0x1a9c8f0, size=64) at CCTexture2D.m:487 
#7 0x01a2d897 in -[CCLabelTTF setString:] (self=0x1981d70, _cmd=0x156e07, str=0x1a9c900) at CCLabelTTF.m:95 
#8 0x01a2dc9d in -[CCLabelTTF initWithString:fontName:fontSize:] (self=0x1981d70, _cmd=0xe10840, str=0x1a9c900, name=0x1a9c8f0, size=64) at CCLabelTTF.m:79 
#9 0x01a2da9a in +[CCLabelTTF labelWithString:fontName:fontSize:] (self=0x1a9b53c, _cmd=0xe0ddc0, string=0x1a9c900, name=0x1a9c8f0, size=64) at CCLabelTTF.m:53 
#10 0x01a01b10 in -[TWOHelloWorldLayer init] (self=0x197ee40, _cmd=0x2c7c) at TWOHelloWorldLayer.m:39 
#11 0x01a341bb in +[CCNode node] (self=0x1a99ee4, _cmd=0x3baad59) at CCNode.m:231 
#12 0x01a01a80 in +[TWOHelloWorldLayer scene] (self=0x1a99ee4, _cmd=0xe00fa0) at TWOHelloWorldLayer.m:22 
#13 0x01a5d430 in -[TinyWordsTests testExample] (self=0x197e490, _cmd=0xe59dd0) at TinyWordsTests.m:30 
#14 0x00410c7d in __invoking___() 
#15 0x00410b51 in -[NSInvocation invoke]() 
#16 0x201043d2 in -[SenTestCase invokeTest]() 
#17 0x20104aa7 in -[SenTestCase performTest:]() 
#18 0x201041d3 in -[SenTest run]() 
#19 0x20106eda in -[SenTestSuite performTest:]() 
#20 0x201041d3 in -[SenTest run]() 
#21 0x20106eda in -[SenTestSuite performTest:]() 
#22 0x201041d3 in -[SenTest run]() 
#23 0x201067a4 in +[SenTestProbe runTests:]() 
#24 0x000023c7 in ??() 
#25 0x000025f2 in ??() 
#26 0x0000209a in ??() 
#27 0x00002049 in ??() 
+0

Le bon moyen pour ceci est placé ici: [Comment implémenter le test d'unité d'application dans Xcode 4 à la main] (http://stackoverflow.com/questions/5637272/how-to-implement-application-tests-in- xcode4/6138044 # 6138044) – poGUIst

Répondre

2

Malheureusement , tester sur iOS est un méli-mélo avec les outils officiels. Il existe deux types de tests unitaires. Tests logiques qui n'ont pas d'invocations d'interface utilisateur et s'exécutent dans le simulateur. Tests d'application qui peuvent exercer et manipuler l'interface utilisateur, mais uniquement sur l'appareil.

Il semble que vous ayez écrit des tests de logique qui exercent l'interface utilisateur. Ce que vous voulez, c'est créer des tests d'application et l'exécuter sur l'appareil. Pour ce faire, vous devez suivre http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html et créer une cible d'application indépendante à exécuter sur le périphérique qui inclut la cible AppTest. Mais, juste un aparté est que cela devient assez fastidieux car vous devez ajouter tout le code sous test et les dépendances dans chaque cible et cible de l'application. Vous devez également placer uniquement des tests logiques dans la cible de test logique et les tests d'application dans la cible de test d'application.

+0

Merci pour l'aide. Je ne savais pas s'il y avait de nouvelles instructions pour Xcode 4, donc je n'avais pas encore suivi les instructions de Xcode 3. Fonctionne comme un charme une fois que j'ai compris la façon Xcode 4 de tout faire dans les instructions. – Greg

8

Pour que cela fonctionne correctement, vous devez accéder aux paramètres de génération de votre ensemble de tests et définir la clé Test Host sur $(BUNDLE_LOADER).

En outre, assurez-vous que Bundle chargeur clé est définie sur la $(BUILT_PRODUCTS_DIR)/yourAppName.app/yourAppName dans les paramètres de construction du faisceau ainsi.

+0

Merci. Ajoutez également une 'dépendance à la cible' sur votre application dans les phases de construction ou elle n'existera pas – amleszk

Questions connexes