2015-09-19 12 views
19

Sto sviluppando un progetto iOS e ho bisogno di accedere ai codici dell'app host dall'obiettivo del test dell'interfaccia utente, ma ho scoperto che mostra un errore di collegamento: non definito simbolo quando ho provato a Ho trovato che l'host di test e il caricatore di pacchetti per questo target sono tutti vuoti, quindi li ho impostati sulla mia app host e sono riuscito a superare l'errore di collegamento. Tuttavia, in fase di esecuzione continua a fallire quando chiama XCUIApplication.launch(). Qualcuno ha capito come accedere ai codici dell'app ospitante da questo target di test dell'interfaccia utente? Senza essere in grado di farlo, siamo costretti a fare tutto il test dell'interfaccia utente, che è molto traballante. Abbiamo sicuramente bisogno di avere passaggi non dell'interfaccia utente in scenari di test. Sto usando Swift per il mio progetto.Accesso al codice dell'app host dal target del test dell'interfaccia utente Xcode 7

+0

Sto avendo lo stesso identico problema. Ho usato [link] (http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/) per il caricatore/host di test bundle e [link] (http://savvyapps.com/blog/how-to-implement-ui-testing-in-an-existing-ios-app) che ha rilevato la verifica di "Abilita testabilità" nell'obiettivo principale. Sono arrivato allo stesso identico punto di te. Hai avuto fortuna negli ultimi due giorni da quando hai postato questa domanda? – Chris

+0

Come dice @Konnor nella risposta, non è possibile accedere al processo della tua app da un test dell'interfaccia utente. Cosa stai cercando di fare? Ho avuto un certo successo lavorando a queste limitazioni nei nostri test. – kubi

+0

@kubi: sono interessato alla soluzione alternativa. Voglio impostare/leggere un attributo in un oggetto singleton. Di fatto, questo può essere fatto aggiungendo un'interfaccia utente per questo nell'applicazione testata, ma questo sembra un po 'eccessivo. Hai trovato una soluzione migliore? –

risposta

6

Utilizzando il nuovo framework di automazione dell'interfaccia utente Apple introdotto in WWDC 15 non è possibile accedere al codice dell'app dal test di automazione interfaccia utente. Ha lo scopo di simulare ciò che un utente avrebbe accesso anche, che a volte può essere frustrante.

+2

Hai una fonte per la tua dichiarazione relativa al fatto che il codice dell'app non è accessibile dai test dell'interfaccia utente? – singingAtom

+0

@singingAtom I test dell'interfaccia utente sono un modulo separato dall'app, pertanto non vengono eseguiti all'interno dell'app come farebbe un test logico. L'unico modo per condividere il codice è compilare tutti i file dell'app che è necessario condividere tra i due moduli. Spero possa aiutare. – cakes88

+0

@ cakes88 Hai qualche riferimento a come funziona la tua ultima frase? –

32

Uso la seguente tecnica per impostare i valori nella mia app prima di eseguire i test dell'interfaccia utente. Utile per impostare valori predefiniti o attivare mock di networking, ecc. Per la maggior parte, non ho avuto bisogno di leggere dall'app ancora. Tutto è riflesso nell'interfaccia utente e può essere testato in questo modo. Presto aggiungeremo dei test per garantire che l'app effettui determinate chiamate di rete. Non sono ancora sicuro di come lo proveremo da un caso di test dell'interfaccia utente.

impostare gli argomenti di tuo test dell'interfaccia utente

let app = XCUIApplication() 
app.launchArguments = ["ResetDefaults", "NoAnimations", "UserHasRegistered"] 
app.launch() 

Leggi argomenti nella vostra applicazione

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    var arguments = NSProcessInfo.processInfo().arguments 
    arguments.removeFirst() 
    print("App launching with the following arguments: \(arguments)") 

    // Always clear the defaults first 
    if arguments.contains("ResetDefaults") { 
     destroyUserDefaults() 
     clearKeychain() 
    } 

    for argument in arguments { 
     switch argument { 
     case "NoAnimations": 
     UIView.setAnimationsEnabled(false) 
     case "UserHasRegistered": 
     Defaults.userRegistered = true 
     default: 
     break 
    } 
    } 
} 

bonus aggiuntive: se si utilizza argomenti di lancio per configurare la vostra applicazione, è banale per aggiungere le bandiere al vostro Xcode schema. Ad esempio, ho uno schema che cancella tutti i dati memorizzati e blocca ogni tentativo di accesso con una risposta positiva. Ora posso "accedere" tramite il simulatore senza colpire alcun server.

+0

Haha, l'ho appena implementato. E come secondo passo ho provato a passare le informazioni tramite un'interfaccia di file. Scrivo il file 'a' nell'app e provo a leggerlo nei test ma non è lo stesso. Non so perché ... @ "/ var/mobile/Contenitori/Dati/Applicazione/8EDD0F16-005B-49E7-B8E3-726F195989DD/Documenti/a" @ "/ var/mobile/Contenitori/Dati/Applicazione/DD4A912D-5808-40AC-9BAD- 0475842190DA/Documenti/a " –

+0

Se capisci qualcosa, scrivi un post sul blog! sono sicuro che molte persone sarebbero interessate Penso che la via da seguire potrebbe essere quella di effettuare una chiamata API a un server locale. Sembra un po 'complicato, ma scommetto che potrebbe essere gestito con uno script python a 30 linee. – kubi

+0

Si noti che per gli argomenti che devono essere analizzati da NSUserDefaults, la chiave e il valore, ad es. '-AppleLanguages' e' (en) ', devono essere due elementi di array separati. –

Problemi correlati