J'ai essayé de définir des attributs dans l'instance XCUIApplication
, dans mes tests d'interface utilisateur setUp()
let app = XCUIApplication()
app.launchEnvironment = ["testenv" : "testenvValue"]
app.launchArguments = ["anArgument"]
app.launch()
dans didFinishLaunch
J'ai essayé de les afficher à l'écran lorsque j'exécute mes 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()
}
}
Mais je n'arrive pas à trouver les arguments et l'environnement que j'ai définis. Quelqu'un sait-il comment les obtenir?
Si vous définissez launchArguments
dans un test d'interface utilisateur (Swift):
let app = XCUIApplication()
app.launchArguments.append("SNAPSHOT")
app.launch()
Lisez-les ensuite dans votre application en utilisant:
Swift 2.x:
if NSProcessInfo.processInfo().arguments.contains("SNAPSHOT") {
// Do snapshot setup
}
Swift 3.
if ProcessInfo.processInfo.arguments.contains("SNAPSHOT") {
}
Pour définir les variables d'environnement, utilisez à la place launchEnvironment
et NSProcessInfo.processInfo().environment
.
En s'appuyant 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 frappe et obtenez la saisie semi-automatique.
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 une énumération qui pourrait être réutilisée dans UITest lors de la définition de launchArguments.
Voici un exemple avec launchArguments et Objective-C:
if ([[NSProcessInfo processInfo].arguments containsObject:@"SNAPSHOT"]) {
//do snapshot;
}
Rapide:
let arguments = ProcessInfo.processInfo.arguments
if arguments.contains("SNAPSHOT") {
//do snapshot
}
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 en cours de test
UserDefaults.standard.bool(forKey: "ToggleFeatureOne") // returns true
De là, vous pouvez créer des extensions sur UserDefaults
pour fournir des bascules d'exécution pratiques.
Il s'agit du même mécanisme utilisé par les schémas Xcode "arguments transmis au lancement". Les arguments de lancement et leur effet sur UserDefaults
sont documentés sous Guide de programmation des préférences et paramètres .
Pour les arguments de lancement, passez-les en deux arguments distincts:
let app = XCUIApplication()
app.launchArguments.append("-arg")
app.launchArguments.append("val")
app.launch()
Tiré de ici .
Gardez à l'esprit quelques détails. Premièrement, XCUIAppliction n'est pas un singleton, par conséquent, si vous appelez XCUIApplication().arguments.append("myargument")
puis vous appelez XCUIApplication().launch()
, il n'enverra pas les arguments. Vérifiez-le ici .
Deuxièmement, si vous modifiez les arguments après le lancement de l'application, cela ne fonctionnera pas, il enverra les nouveaux arguments à la prochaine exécution.
Je sais seulement comment cela fonctionne dans Objective-C
NSDictionary *environment = [[NSProcessInfo processInfo] environment];
Si vous devez passer les variables d'environnement de votre schéma à XCUITes, modifiez l'objet XCTestCase -> app.launchEnvironment, sur chaque classe de test de cette façon:
Swift
override func setUp(){
app.launchEnvironment = ProcessInfo.processInfo.environment
}