XCResult: cómo y por qué leer





En 2018, Apple actualizó por próxima (tercera) vez el formato en el que se emite la información sobre la ejecución de prueba. Si antes era un archivo plist, que era un xml grande, ahora es un archivo grande con la extensión xcresult, que se abre a través de Xcode y contiene mucha información útil, comenzando con los resultados de las pruebas con registros, capturas de pantalla y terminando con la cobertura de destino. , información de diagnóstico sobre el montaje y mucho más. La mayoría de los desarrolladores no trabajan con esto todos los días, pero los constructores de infraestructura de este artículo pueden encontrar algo útil.



Analicemos los pros y los contras de actualizar el formato.



¿Cuáles son las desventajas de actualizar el formato?



  • Pesa mucho, lo que significa que el intercambio de dichos archivos con el servidor CI puede ser largo.
  • Si no hay Xcode, entonces no se abrirá (es dudoso que el probador o desarrollador no tenga Xcode, pero aún así).
  • Posible avería de las herramientas de integración existentes. Aprendiendo a trabajar con algo nuevo de nuevo.


¿Cómo es conveniente el nuevo xcresult?



  • Se abre de forma nativa a través de Xcode.
  • Puede transferirlo a colegas de QA y desarrollo, incluso si no tienen un proyecto local. Todo se abrirá y mostrará la información que necesita.
  • Contiene información completa sobre la ejecución de pruebas.
  • Se puede leer no solo a través de Xcode.


Hablaremos del último punto de este artículo.



¿Por qué leer XCResult fuera de Xcode?



Si su empresa cuenta con procesos de CI&CD configurados, probablemente recopile métricas sobre la construcción del proyecto, la estabilidad y el número de pruebas y, por supuesto, los datos de cobertura de las pruebas. Lo más probable es que, en algún lugar de Bamboo, Jenkins, Github, haya eliminado las pruebas o el estado de CI, o el porcentaje de cobertura. Es costumbre automatizar este tipo de operaciones y dejarlas a merced de máquinas sin alma. ¿Qué herramientas tenemos para esto?

Apple, junto con el lanzamiento del nuevo formato, lanzó las herramientas xcresulttool y xccov, con las que puede trabajar desde la terminal.



¿Qué podemos conseguir con xccov?



xcrun xccov view --report --json /path/to/your/TestScheme.xcresult







La solicitud devolverá información completa sobre qué cobertura tienen todos los objetivos, qué métodos y qué clases están cubiertas, cuántas veces se ejecutaron y qué líneas se ejecutaron. Los objetos tienen una estructura similar. Hay 4 niveles en total: raíz, destino, archivo, función. Todos los niveles excepto la raíz tienen un campo de nombre. Todos los niveles tienen campos cubiertos y lineCoverage. Es importante tener en cuenta que los objetos tienen su propio contexto. La estructura completa se puede describir en varios protocolos.







Además de los protocolos, destacamos las siguientes estructuras: CoverageReport - agregador de todo y root. Contiene una matriz de objetos Target. Cada Destino contiene una matriz de Archivo, que, a su vez, contiene una matriz de Función. Estos objetos implementarán los protocolos descritos anteriormente.

Estamos interesados ​​en el campo lineCoverage. Para redactar un informe hermoso (como en fastlane), diríjase al campo lineCoverage y recorra todos los objetos con una función simple: Obtendremos







algo similar a:



Coverage Report Summary:

• Utils.framework: 51,04 %

• NavigationAssistantKit.framework: 0,0 %

• NavigationKit.framework: 35,85 %

• Logger.framework: 20,32 %

• FTCCardData.framework: 78,21 %

• FTCFeeSDK.framework: 25,25 %

• ErrorPresenter.framework: 2,8 %

• MTUIKit.framework: 0,24 %

• AnalyticsKit.framework: 47,52 %

• EdaSDK.framework: 1,18 %

• Alerts.framework: 85,19 %

• Resources.framework: 39,16 %

• QpayApiTests.xctest: 88,37 %

• FTCFeeSDKTests.xctest: 97,91 %
      
      





PD Para que se recopile la cobertura, debe agregar el parámetro -enableCodeCoverage YES a su equipo de prueba o habilitarlo en la configuración del esquema en Xcode.



¿Qué oportunidades brindará xcresulttool?



De hecho, xcresulttool no tiene una interfaz muy grande, pero puede obtener mucha información si conoce la estructura de xcresult. Y esta es una base de datos completa a la que puede realizar consultas.



Es una buena idea comenzar con la propia interfaz:



xcrun xcresulttool --help

OVERVIEW: Xcode Result Bundle Tool (version 16015)

USAGE: xcresulttool subcommand [options] ...


SUBCOMMANDS:

  export                  Export File or Directory from Result Bundle

  formatDescription       Result Bundle Format Description

  get                     Get Result Bundle Object

  graph                   Print Result Bundle Object Graph

  merge                   Merge Result Bundles

  metadata                Result Bundle Metadata

  version                 XCResultKit Version
      
      





Para leer la estructura, solo necesitamos llamar al comando:



xcrun xcresulttool get --path /path/to/your/res.xcresult --format json
      
      





Aquí es donde obtenemos la "tabla de contenido" para nuestro paquete xcresult. Qué estaba sucediendo, qué pruebas se ejecutaron, cuánto tiempo tomó, dónde están las capturas de pantalla y los registros, y cuáles fueron las advertencias del compilador. Lo principal para nosotros es obtener los identificadores de archivos que contienen información sobre las pruebas.



xcrun xcresulttool get --path /path/to/your/res.xcresult --format json --id {id}
      
      





Luego obtendremos objetos con objetivos de prueba, tipo de pruebas, que se dividen en clases de prueba y trajes de prueba con informes con logs, capturas de pantalla, tiempo de ejecución y otra información para cada prueba.



Desafortunadamente, el motivo del fracaso de las pruebas rojas no será fácil de extraer; para ello, debe realizar otra solicitud por cada prueba fallida (y, de hecho, ¡ni siquiera una!



Para el Resumen de fallas, se utiliza la misma solicitud :



xcrun xcresulttool get --path /path/to/your/res.xcresult --format json --id {id}







Pero para los registros de fallos, debe eliminar --format json de la solicitud, porque solo hay una cadena y, al pasar el formateador, la herramienta generará un error.



¿Qué hacer a continuación con este conocimiento previo?



Automatizar, ¡por supuesto! Si prueba estos comandos, verá que las respuestas son gigantescas y difíciles de leer. ¿Cómo automatizar? Ruby, Python ... ¿O Swift?

Por supuesto, rápido. Cualquier desarrollador moderno de iOS lo sabe. El proyecto se abre en Xcode, depuración, resaltado de sintaxis, escritura fuerte están disponibles. En resumen, ¡un sueño! Especialmente con la llegada del administrador de paquetes Swift.



No es ningún secreto que con Swift podemos iniciar procesos fácilmente, escuchar errores y obtener resultados. En el caso más simple, podemos arreglárnoslas con tal construcción:







ahora solo tenemos que explorar el formato XCResult a través de las ya conocidas xcrun xcov y xcrun xcresulttool. Por ejemplo, para leer la cobertura de la prueba, usamos:







Y para obtener la tabla de contenido de XCResult, debemos ejecutar:







¿Pero cómo obtenemos nuestras apreciadas estructuras CoverageReport y XCResult?

Obtenemos una cadena de Data, que el primer comando de Shell nos devolverá y pondrá el contenido aquí: quicktype.io .



El servicio nos generará algo similar a las estructuras rápidas requeridas. Es cierto que no podrá utilizar el resultado "tal cual". Tendremos que estudiar la estructura de la respuesta más de cerca y descartar los duplicados. Sin embargo, ese trabajo no es difícil. Puede descartar partes innecesarias, o puede investigar un poco y resaltar algunos bloques de construcción básicos: En







base a esto, describa el resto de las estructuras, por ejemplo:







o incluso dicha información sobre las computadoras en las que se realizó la ejecución:







Bueno, ¿cómo se usa esto?



Hay dos formas de utilizar nuestro raspador. El primero es como ejecutable, y aquí es donde la biblioteca del analizador de argumentos rápidos de Apple resulta útil. Antes de eso, teníamos que escribir el procesamiento de los argumentos nosotros mismos, cubrirlo con pruebas y respaldarlo. Ahora, este trabajo ha sido asumido por una biblioteca popular, en cuyos mantenedores se puede confiar.



Hay dos comandos: obtener un informe de cobertura de prueba y generar un informe de prueba junit. Necesita construir el proyecto y ejecutar el binario, pasando los argumentos necesarios:







La segunda forma es utilizar este proyecto como biblioteca. Tenemos un gran proyecto de CI que se encarga de ensamblar, probar y enviar nuestro producto KoronaPay. Por ejemplo, en función de los resultados de pasar las pruebas, podemos extraer todas las fallas y bloqueos de afirmaciones en pruebas como esta:







O obtener pruebas rojas, analizar frascos y reiniciar solo ellos.

¿Cómo analizar? Todo es simple y no fácil al mismo tiempo. Para obtener los detalles del motivo de la falla de la prueba, debe realizar una solicitud adicional a xcresult utilizando el identificador de resumen de fallas. Y luego extraiga información del resumen de fallas. Por el momento, hemos aprendido a buscar fallas en las pruebas y casos de pérdida de conexión, así como a identificar los motivos. No es difícil comprender que se ha producido un accidente. Solo necesita encontrar las palabras preciadas que se estrellaron en FailSummaries.







Es un poco más difícil averiguar la causa del accidente.



Aquí es donde el mecanismo de reflexión en Swift resulta útil, que, aunque algo limitado, es excelente para resolver este problema. Busque todos los objetos adjuntos denominados kXCTAttachmentLegacyDiagnosticReportData.







No hay nada mágico en el método reflectProperties, es una extensión simple para Mirror:







se afirma otra categoría de pruebas rojas. A diferencia de los bloqueos, no puede simplemente buscar la cadena "bloqueado" aquí. Estas pruebas se pueden disfrazar como casos de pérdida de conexión. Para llegar al final del motivo, debe pasar por varias matrices dentro del objeto TestCase de esta manera:







Para tales operaciones, nuestra biblioteca tiene una entidad TestsInspector que puede proporcionar un resumen de las pruebas rojas. Así, las pruebas rojas están agrupadas por características en el informe.







En lugar de una conclusión



Como todas las soluciones existentes en esta área, nuestro scrapper no es una herramienta exhaustiva para analizar xcresult. Para obtener toda la información y ver capturas de pantalla, aún necesita abrir xcresult a través de Xcode. Sin embargo, si ha configurado CI y desea ver los resultados de las pruebas rápidamente, lo más probable es que pueda apreciar la combinación de junit y nuestro xcscrapper en su verdadero valor.



All Articles