2015-10-07 3 views
29

Ho provato a installare attributi nel caso XCUIApplication, nel mio test dell'interfaccia utente setUp()Come accedere a launchEnvironment e launchArguments impostati in XCUIApplication, eseguendo test dell'interfaccia utente in XCode?

let app = XCUIApplication() 
app.launchEnvironment = ["testenv" : "testenvValue"] 
app.launchArguments = ["anArgument"] 
app.launch() 

in didFinishLaunch Ho cercato di mostrare questi su schermo quando eseguo i miei UITests

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    if launchOptions != nil { 
     for (key, value) in launchOptions! { 
      let alertView = UIAlertView(title: key.description, message: value.description, delegate: nil, cancelButtonTitle: "ok") 
      alertView.show() 
     } 
    } 

Ma io non riesco a essere in grado di trovare gli argomenti e l'ambiente che ho impostato. Qualcuno sa come ottenerli?

+0

Yea Non riesco a trovarli - vorrei che ci fosse più documentazione su molte di queste cose. È bello solo ... difficile fare qualche buon test. – cakes88

+0

Ciao, sai per caso se qualche esempio su come usare '' 'launchArguments''' esiste sul sito web di apple? La documentazione ufficiale mi sta solo uccidendo: '' 'Gli argomenti che verranno passati all'applicazione all'avvio''' (https://developer.apple.com/documentation/xctest/xcuiapplication/1500477-launcharguments). Come se non fosse ovvio dal nome – olyv

risposta

3

Sono a conoscenza solo di come funziona in Objective-C

NSDictionary *environment = [[NSProcessInfo processInfo] environment]; 
41

Se si imposta launchArguments in un test UI (Swift):

let app = XCUIApplication() 
app.launchArguments.append("SNAPSHOT") 
app.launch() 

Poi li leggono nella tua app utilizzando :

rapida 2.x:

if NSProcessInfo.processInfo().arguments.contains("SNAPSHOT") { 
    // Do snapshot setup 
} 

Swift 3,0

if ProcessInfo.processInfo.arguments.contains("SNAPSHOT") { 
} 

Per impostare le variabili di ambiente, utilizzare launchEnvironment e NSProcessInfo.processInfo().environment rispettivamente, invece.

+5

Sotto Xcode 7.3 questo non sembra funzionare. Ho provato a impostare launchArguments e poi a leggerli immediatamente. Ritorno sempre e array vuoto. Anche se lo faccio nella riga successiva. Sembra che potrebbero essere rotte. Lo stesso per launchEnvironment. – drekka

+1

Assicurarsi di disporre di una sola istanza XCUIApplication e avviare la chiamata * dopo * impostazione di launchArguments. – EricS

+3

Quando 'Record UI Test' in Xcode, non esegue' setUp() '. Mi fuorvia i codici sopra non funzionanti. Ma esegui di nuovo il test dell'interfaccia utente (non la modalità 'Record UI Test'), funziona. – AechoLiu

11

Sulla base della risposta di Joey C., ho scritto una piccola estensione per evitare l'utilizzo di stringhe non elaborate nell'app. In questo modo eviti qualsiasi problema di errore di battitura e ottieni il completamento automatico.

extension NSProcessInfo { 
    /** 
    Used to recognized that UITestings are running and modify the app behavior accordingly 

    Set with: XCUIApplication().launchArguments = [ "isUITesting" ] 
    */ 
    var isUITesting: Bool { 
     return arguments.contains("isUITesting") 
    } 

    /** 
    Used to recognized that UITestings are taking snapshots and modify the app behavior accordingly 

    Set with: XCUIApplication().launchArguments = [ "isTakingSnapshots" ] 
    */ 
    var isTakingSnapshots: Bool { 
     return arguments.contains("isTakingSnapshots") 
    } 
} 

In questo modo è possibile utilizzare

if NSProcessInfo.processInfo().isUITesting { 
    // UITesting specific behavior, 
    // like setting up CoreData with in memory store 
} 

Andando oltre, i vari argomenti dovrebbe probabilmente andare in un enum che potrebbe essere riutilizzata nel UITest quando si impostano i launchArguments.

5

Ecco esempio con launchArguments e Objective-C:

if ([[NSProcessInfo processInfo].arguments containsObject:@"SNAPSHOT"]) { 
     //do snapshot; 
} 

Swift:

let arguments = ProcessInfo.processInfo.arguments 
    if arguments.contains("SNAPSHOT") { 
     //do snapshot 
    } 
+0

Ciao! Dove trovo un elenco di argomenti di avvio supportati da al? – BadmintonCat

3

Per gli argomenti di lancio, passarli come due argomenti distinti:

let app = XCUIApplication() 
app.launchArguments.append("-arg") 
app.launchArguments.append("val") 
app.launch() 

Tratto da here.

2

Ricordare alcuni dettagli. In primo luogo, XCUIAppliction non è un singleton, pertanto, se si chiama XCUIApplication().arguments.append("myargument") e quindi si chiama XCUIApplication().launch(), non invierà gli argomenti. Check it here.

In secondo luogo, se si modificano gli argomenti dopo aver avviato l'app non funzionerà, invierà i nuovi argomenti all'esecuzione successiva.

+0

Questa è la risposta che risolve il problema e spiega perché. –

+0

Il tuo check è qui link 404. – ablarg

+0

Grazie a @ablarg - Ho risolto il link non funzionante. –

1

Se è necessario passare i variabili d'ambiente dal vostro schema per XCUITes, modificare l'XCTestCase - oggetto app.launchEnvironment>, per ogni classe di test in questo modo:

Swift 3

override func setUp(){ 
    app.launchEnvironment = ProcessInfo.processInfo.environment 
}