2015-07-20 9 views
12

Xcode 7 † ha un nuovo modo di testare direttamente l'interfaccia utente, incluso un nuovo obiettivo di test "Pacchetto di test dell'interfaccia utente iOS" (o "OS X").Xcode 7: la voragine tra test delle app e test dell'interfaccia utente è invalicabile?

enter image description here

Nel target di test dell'interfaccia utente, sembra non c'è built-in l'accesso al modello o classi che compongono la vostra app. Per esempio. [UIApplication sharedApplication] non potrebbe essere richiamabile dai test dell'interfaccia utente. Ciò implica che "test di app" e "test dell'interfaccia utente" esistono in un chasm possibilmente inamovibile.

Come dichiarato here:

Il problema è che il test dell'interfaccia utente di Xcode non consente l'accesso al app reale.

Domande:

  1. può questo abisso da colmare? In tal caso, come, in dettaglio, con le impostazioni di build e linker e possibilmente un xcodeproj funzionante su github.
  2. Dove potrebbe essere trovata una chiara dichiarazione di questa divisione, in Apple docs.

† Al momento della scrittura, software in versione beta.

risposta

7

black-box test

UI Test è un framework black-box testing. Non dovresti sapere nulla sull'implementazione del codice che stai testando.

Ad esempio, si deve solo preoccuparsi che il valore su un'etichetta cambi, non che il controller abbia trasmesso i dati corretti alla vista. Puoi pensare a UI Testing dall'utente della prospettiva della tua app. A lei non importa come funziona il tuo ItemsViewController (o anche che esiste), quindi perché dovrebbero i test dell'interfaccia utente?

riuscite a farla "funzionare"

Detto questo, capisco la tua frustrazione. Sarebbe fantastico se potessi far ruotare un controller di visualizzazione e poi fare un giro con UI Testing e fare asserzioni. Tuttavia, a partire da Beta 5 questo non è possibile.

Ciò che è interessante è che è possibile, tuttavia, creare istanze degli oggetti della propria app con un semplice @testable import ModuleName nella parte superiore dei test dell'interfaccia utente. Si noti che non è possibile interagire con i metodi .tap() -like, poiché è una classe UI*, non uno XCUI*.

Considerare Donut come il nome del modulo dell'applicazione.

import XCTest 
@testable import Donut 

class DonutUITests: XCTestCase { 
    let app = XCUIApplication() 

    override func setUp() { 
     continueAfterFailure = false 
     app.launch() 
    } 

    func testItemsViewController() { 
     let controller = ItemsViewController() 
     controller.addItemButton.tap() // <---- UIButton does not respond to tap()! 
    } 
} 
+1

Supponiamo di avere un'app con contenuto dinamico. Desideri manipolare l'interfaccia utente e quindi verificare qualcosa che non è visibile sullo schermo. Oppure, forse è necessario verificare uno stato specificato prima di decidere quale metodo chiamare, e tale stato è noto solo interrogando un metodo Objective-C nel codice dell'app. È bello avere un mix di entrambi i modi di test, senza dover creare ogni vista da soli. –

+1

In seguito ai commenti di Teresa, è possibile che si desideri inizializzare il progetto in un determinato stato prima di eseguire i test dell'interfaccia utente. – gone

Problemi correlati