Comment accéder à launchEnvironment et launchArguments définis dans XCUIApplication, en exécutant des tests D'interface utilisateur dans XCode?
j'ai essayé de définir des attributs dans le XCUIApplication
Exemple, dans mes tests D'interface utilisateur setUp()
let app = XCUIApplication()
app.launchEnvironment = ["testenv" : "testenvValue"]
app.launchArguments = ["anArgument"]
app.launch()
didFinishLaunch
j'ai essayé de les montrer à l'écran quand j'ai lancé mes Uitest
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()
}
}
mais je n'arrive pas à trouver les arguments et l'environnement que j'ai mis. Quelqu'un sait comment obtenir une prise de eux?
8 réponses
Si vous définissez launchArguments
dans un Test de l'INTERFACE utilisateur (Swift):
let app = XCUIApplication()
app.launchArguments.append("SNAPSHOT")
app.launch()
puis les lire dans votre application en utilisant:
swift 2.x:
if NSProcessInfo.processInfo().arguments.contains("SNAPSHOT") {
// Do snapshot setup
}
Swift 3.0
if ProcessInfo.processInfo.arguments.contains("SNAPSHOT") {
}
pour définir les variables d'environnement, utilisez launchEnvironment
et NSProcessInfo.processInfo().environment
, respectivement, à la place.
en me basant sur la réponse de Joey C., j'ai écrit une petite extension pour éviter d'utiliser des chaînes brutes dans l'application. De cette façon, vous évitez tout problème de typographie et obtenir autocomplete.
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")
}
}
de Cette façon, vous pouvez utiliser
if NSProcessInfo.processInfo().isUITesting {
// UITesting specific behavior,
// like setting up CoreData with in memory store
}
pour aller plus loin, les différents arguments devraient probablement entrer dans un enum qui pourrait être réutilisé dans les UITest lors de la mise en place des launchArguments.
voici un exemple avec launchArguments et Objective-C:
if ([[NSProcessInfo processInfo].arguments containsObject:@"SNAPSHOT"]) {
//do snapshot;
}
Swift:
let arguments = ProcessInfo.processInfo.arguments
if arguments.contains("SNAPSHOT") {
//do snapshot
}
je suis seulement conscient de la façon dont cela fonctionne dans L'objectif-C
NSDictionary *environment = [[NSProcessInfo processInfo] environment];
garder à l'esprit quelques détails. Tout d'abord, XCUIAppliction n'est pas un singleton, donc, si vous appelez XCUIApplication().arguments.append("myargument")
et puis vous appelez XCUIApplication().launch()
, il n'envoie pas les arguments. Vérifier ici.
deuxièmement, si vous modifiez les arguments après le lancement de l'application il ne fonctionnera pas, il enverra les nouveaux arguments à la prochaine exécution.
il est également intéressant de noter que les arguments passés à XCUIApplication.launchArguments
sont également disponibles à partir de UserDefaults
.
dans votre XCTestCase
let app = XCUIApplication()
app.launchArguments.append("-ToggleFeatureOne")
app.launchArguments.append("true")
app.launch()
dans votre cible sous test
UserDefaults.standard.bool(forKey: "ToggleFeatureOne") // returns true
A partir de là vous pouvez créer des extensions sur UserDefaults
pour fournir des basculements de temps de course pratiques.
c'est le même mécanisme que le schéma Xcode "arguments transmis au lancement" utilise. Les arguments de lancement et leur effet sur UserDefaults
sont documenté sous Préférences et des Paramètres Guide de Programmation.
si vous avez besoin passer le variables d'environnement de votre schéma vers XCUITes, modifiez XCTestCase - > app.objet launchEnvironment, sur chaque classe test de cette façon:
Swift 3
override func setUp(){
app.launchEnvironment = ProcessInfo.processInfo.environment
}