jueves, 1 de junio de 2017

Tip acerca del code coverage en una VSTS Build

Estaba hoy “jugando” con las builds de Visual Studio Team Services, quería ver la cobertura de código que tenía después de ejecutar mis tests… es sencillo, tan solo hay que activar un check en la configuración de la build para que la ejecución capture la cobertura.
Supongo que sabéis que una vez que VSTS os muestra el resultado de la build, incluyendo la cobertura, podemos descargar dicha cobertura para realizar un análisis más en profundidad en nuestro Visual Studio


clip_image002

Abriendo el archivo en Visual Studio me llevé una desagradable “sorpresa:


clip_image003

Podéis ver como la cobertura está teniendo en cuenta 3 asemblies que en principio no deberían estar ahí, ya que son dependencias a través de paquetes NuGet. Qué demonios, ¡Yo sólo quiero ver la cobertura de mi código!

Lo primero, entender la causa: ¿Por qué pasa esto?

Parece que por defecto VSTS va a tratar de analizar la cobertura de todo assembly para el cual tenga símbolos. Buscando en mi carpeta packages, o en mi bin, efectivamente, los assemblies “malignos” tienen además de su dll un bonito archivo .pdb, es decir símbolos.  Parece que VSTS hace bien su trabajo L


clip_image005

No quiero entrar en la discusión ahora mismo, eso daría para un post entero pero el caso es que hay paquetes que lo hacen, incluyen símbolos, aunque la recomendación parece ser tener dos paquetes, el “normal” sin símbolos, y el que incluye símbolos, por si se necesitan….

Aquí vais a encontrar información:
· https://github.com/elastic/elasticsearch-net/issues/436
· https://docs.microsoft.com/es-es/nuget/create-packages/symbol-packages

En cualquier caso, si no lo remediamos vamos a “ensuciar” nuestros datos de code coverage, ha

¿Que podemos hacer?


De momento solo he encontrado un modo, mediante el uso de un archivo de tipo .runsettings, en el que podamos excluir ciertos elementos de la cobertura. En este caso vamos a excluir los 3 assemblies:


clip_image006

Podéis ver aquí documentación oficial, hay opciones para incluir y excluir assemblies, funciones y atributos

¿Cómo lo uso en visual studio? Tan solo debo seleccionar el archivo, en la siguiente imagen indico como se hace. A partir de ese momento el archivo “aplicará” siempre que lo tengamos marcado, como se ve en la imagen anterior


clip_image007
clip_image008

Parece que está funcionando, ya no vemos assemblies externos, pero vemos el assembly de tests, y este tampoco lo queremos. Aquí debemos jugar con los atributos, hay que modificar nuestro fichero para que también excluya el atributo [ExcludeFromCodeCoverage] con el que decoramos nuestras clases de tests (https://msdn.microsoft.com/en-us/library/system.diagnostics.codeanalysis.excludefromcodecoverageattribute(v=vs.110).aspx)


clip_image009

Mis clases de tests son así:


clip_image010

Ya tenemos todo lo necesario entonces, ¿cómo lo llevamos a VSTS? Pues bien, debemos subir el fichero a nuestro control de código fuente de modo que VSTS lo pueda encontrar. Además, hay que indicar en la build, en el paso de ejecución de tests, que utilice dicho fichero


clip_image012

Una vez hecho esto podemos lanzar una nueva build y ver que la cobertura de código ya solo incluye lo que queremos.


clip_image013

Objetivo cumplido, aquí podéis descargar mi fichero .runsettings


Espero que os sea de utilidad.

No hay comentarios:

Publicar un comentario