Pruebas de IU en Xcode con Embassy y Succulent

Hola a todos!

Otra novedad en la lista de nuestros cursos: "iOS Developer" , lo que significa que ha llegado el momento de las piezas interesantes que encontramos durante la preparación del curso. En este artículo, el autor analiza cómo grabar y reproducir solicitudes de API para pruebas de IU.



Vamos

Recientemente integré Embassy y Succulent en mis pruebas de IU. Si necesita ejecutar pruebas de IU para una aplicación que utiliza estas API, esta guía puede ofrecer una alternativa a simulacro / código auxiliar.

Los problemas:

  • La aplicación utiliza los datos de la API para completar la interfaz de usuario;
  • El uso de talones puede requerir escribir y mantener una gran cantidad de archivos;
  • Cuando se utilizan simulacros, la lógica de la aplicación puede diferir de la llamada de red real;
  • Uso de esta API de conexión: EXACTAMENTE EXCLUIDA, demasiadas variables y bloqueos


Embajada + solución suculenta

La solución es crear un servidor local al que se dirija su aplicación (usando Embassy), y grabar / responder llamadas de red (usando Succulent).

La primera vez que ejecute la prueba, se realizarán llamadas de red estándar y se escribirán en el archivo de rastreo.

La próxima vez, estas mismas llamadas de red serán respondidas automáticamente. Genial, ¿no es así? No es necesario escribir simulacros, puede simular retrasos y errores, ¡y todo esto se ejecuta dentro de la máquina de compilación, dentro de XCtest!

¿Cómo usarlo?

1. Descargue e instale bajo Succulent. En el momento de escribir esto, no había un pod en cocoapods.com, por lo que debe descargar la fuente y agregarla a su subarchivo de la siguiente manera:

target “UI Tests” do inherit! :search_paths pod 'Succulent', :path => 'Succulent/' end 

La embajada requiere suculento y se instalará automáticamente.

2. Cree un nuevo archivo de interfaz de usuario de prueba y copie las instrucciones de Succulent GitHub . Como resultado, debería obtener este archivo:

 import Succulent @testable import TestAppUITests class SucculentTestUITest: XCTestCase { private var succulent: Succulent! var session: URLSession! var baseURL: URL! /// The name of the trace file for the current test private var traceName: String { return self.description.trimmingCharacters(in: CharacterSet(charactersIn: "-[] ")).replacingOccurrences(of: " ", with: "_") } /// The URL to the trace file for the current test when running tests private var traceUrl: URL? { let bundle = Bundle(for: type(of: self)) return bundle.url(forResource: self.traceName, withExtension: "trace", subdirectory: "Traces") } /// The URL to the trace file for the current test when recording private var recordUrl: URL { let bundle = Bundle(for: type(of: self)) let recordPath = bundle.infoDictionary!["TraceRecordPath"] as! String return URL(fileURLWithPath: "\(recordPath)/\(self.traceName).trace") } override func setUp() { super.setUp() continueAfterFailure = false if let traceUrl = self.traceUrl { // Replay using an existing trace file succulent = Succulent(traceUrl: traceUrl) } else { // Record to a new trace file succulent = Succulent(recordUrl: self.recordUrl, baseUrl: URL(string: "https//base-url-to-record.com/")!) } succulent.start() let app = XCUIApplication() app.launchEnvironment["succulentBaseURL"] = "http://localhost:\(succulent.actualPort)/" app.launch() } override func tearDown() { super.tearDown() } } 

Cuando inicie Succulent, puede especificar la URL base, gracias a la cual se registrarán todas las solicitudes, incluida la URL base, y se ignorarán todas las demás.

3. Agregue la siguiente línea al objetivo Info.plist de su IU de prueba:

 <key>TraceRecordPath</key> <string>$(PROJECT_DIR)/Succulent/Traces</string> 

4. Dirija la aplicación al servidor local.

Para hacer esto dentro de su aplicación principal, debe verificar si la variable de entorno "succulentBaseURL" existe y si está configurada.

Muestra la url de su servidor web local y está configurada en la función de configuración, que se copió anteriormente en el paso 2.

 #if DEBUG if let localServerUrl = ProcessInfo.processInfo.environment[“succulentBaseURL”] { return URL(string: localServerUrl)! } #endif 

¡Eso es todo, tal vez!

Ahora, cuando realice una prueba simple y la ejecute, Succulent escribirá una solicitud de API y creará un archivo .trace en la carpeta Traces del directorio de destino de su prueba de IU. La próxima vez que ejecute la misma prueba, verificará si el archivo existe y lo ejecutará.

Puede abrir archivos .trace directamente desde Xcode, ver todas las solicitudes de red y modificarlas según sea necesario.

Espero que el artículo haya resultado útil, aquí está la pizza:



El fin

Como de costumbre, estamos esperando comentarios, preguntas, etc. aquí o puede ver el Día de puertas abiertas y hacer una pregunta al maestro allí.

Source: https://habr.com/ru/post/es412955/


All Articles