unit test ios xcode swift ui-testing

ios - test - ¿Cómo acceder a launchEnvironment y launchArguments establecidos en XCUIApplication, ejecutando pruebas de UI en XCode?



unit test swift 4 (8)

Intenté establecer atributos en la instancia de XCUIApplication , en mi UI Tests setUp()

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

en didFinishLaunch , he intentado mostrarlos en la pantalla cuando ejecuto mis 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() } }

Pero parece que no puedo encontrar los argumentos y el entorno que establezco. ¿Alguien sabe cómo conseguirlos?


Aquí hay un ejemplo con launchArguments y Objective-C:

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

Rápido:

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


Para los argumentos de lanzamiento, páselos como dos argumentos separados:

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

Tomado de here .


Si configura launchArguments en una prueba de UI (Swift):

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

Luego léelos en su aplicación usando:

swift 2.x :

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

Swift 3.0

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

Para establecer variables de entorno, use launchEnvironment y NSProcessInfo.processInfo().environment , respectivamente.


Si necesita pasar las variables de entorno de su esquema a XCUITes, modifique el objeto XCTestCase -> app.launchEnvironment, en cada clase de prueba de esta manera:

Swift 3

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


Sobre la base de la respuesta de Joey C., escribí una pequeña extensión para evitar el uso de cadenas sin formato en la aplicación. De esta forma evitarás cualquier error tipográfico y obtendrás autocompletado.

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 esta manera puedes usar

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

Yendo más lejos, los diversos argumentos probablemente deberían entrar en una enumeración que podría reutilizarse en el UITest al establecer los argumentos de lanzamiento.


Solo estoy al tanto de cómo funciona esto en Objective-C

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


También es interesante observar que los argumentos pasados ​​a XCUIApplication.launchArguments también están disponibles en UserDefaults .

En tu XCTestCase

let app = XCUIApplication() app.launchArguments.append("-ToggleFeatureOne") app.launchArguments.append("true") app.launch()

En tu objetivo bajo prueba

UserDefaults.standard.bool(forKey: "ToggleFeatureOne") // returns true

Desde aquí, puede crear extensiones en UserDefaults para proporcionar alternar el tiempo de ejecución.

Este es el mismo mecanismo que usan los esquemas de Xcode "argumentos pasados ​​en el lanzamiento". Los argumentos de lanzamiento y su efecto en UserDefaults están documentados en la Guía de programación de preferencias y configuraciones .


Tenga en cuenta algunos detalles. En primer lugar, XCUIAppliction no es un singleton, por lo tanto, si llama a XCUIApplication().arguments.append("myargument") y luego llama a XCUIApplication().launch() , no enviará los argumentos. Verifíquelo aquí .

En segundo lugar, si modifica los argumentos después de iniciar la aplicación, no funcionará, enviará los nuevos argumentos a la siguiente ejecución.