El informe de cobertura de código iOS contiene files que no deberían estar allí

Tengo un proyecto Xcode con dos objectives: el objective principal donde vive el código fuente (llamémoslo CoolApp), y un objective de testing para las testings de unidades (llamémoslo CoolAppTests). También tengo un gancho de confirmación de Git que garantiza que no puedo comprometer un cambio si la cobertura total de la línea del proyecto cae por debajo de un determinado porcentaje.

El problema es que el informe de cobertura contiene no solo los files en CoolApp, sino también los files en CoolAppTests. Como resultado, cuando agrego un nuevo file de testing, la cobertura total de la línea del proyecto podría realmente disminuir , lo que hace que el enlace de confirmación sea inútil.

Para generar el informe de cobertura, paso los siguientes pasos:

xcodebuild test \ -project "CoolApp.xcodeproj" \ -scheme "CoolAppTests" \ -destination "platform=iOS Simulator,name=iPhone 6,OS=10.0" \ -configuration Debug \ -enableCodeCoverage YES 

Luego obtengo DerivedData para CoolAppTests buscando el directory TEMP_ROOT en la configuration de compilation (xcodebuild-target CoolAppTests -showBuildSettings). A partir de ahí, obtengo el /CodeCoverage/Coverage.profdata, y el binary ubicado en /CodeCoverage/Products/Debug-iphonesimulator/CoolAppTests.xctest/CoolAppTests.

 PROFDATA=.../CodeCoverage/Coverage.profdata BINARY=.../CodeCoverage/Products/Debug-iphonesimulator/CoolAppTests.xctest/CoolAppTests 

Finalmente, genero el informe y captura su resultado:

 xcrun llvm-cov report -instr-profile "${PROFDATA}" "${BINARY}" 

En ese momento, como se indicó anteriormente, el informe contiene files de CoolApp y CoolAppTests.

¿Hay alguna manera de filtrar lo que está en el informe para que solo tenga los files de mi objective principal, CoolApp, y no los files de mi objective de testing, CoolAppTests?

Interesante. Pude mostrar el informe en un marco de mi ejecutando:

 xcrun llvm-cov report -instr-profile Coverage.profdata Products/Debug-iphonesimulator/StoryTeller.framework/StoryTeller 

Tenga en count que especificé la ruta al marco. Esto me mostró las classs marco solamente. Para mostrar la cobertura de las testings, tuve que usar esto:

 xcrun llvm-cov report -instr-profile Coverage.profdata Products/Debug-iphonesimulator/StoryTellerTests.xctest/StoryTellerTests 

Para verificar esto, ingresé a los datos derivados de una aplicación Swift en la que estoy trabajando y ejecuté esto:

 xcrun llvm-cov report -instr-profile Coverage.profdata Products/Debug-iphonesimulator/xxxxxx.app/xxxxxx 

Una vez más, solo se me mostró la cobertura de las classs en la aplicación.

Supongo que lo que está sucediendo con su código es que cuando creó el objective de testing, le dijo que comstackra todas las classs de su aplicación y sus classs de testing. Por lo tanto, el objective de testing los considerará como parte del código de testing. Es algo que a menudo he visto hacer a los desarrolladores. Su objective de testing debe tener la aplicación en sus Dependencias de destino, pero no necesita comstackr ni include las classs nuevamente, incluso si solo se realizan testings de unidades. Las classs de la aplicación estarán disponibles automáticamente para propósitos de testing.