15/5/2011 21:22 El Bruno

[TEAMBUILD2010] HowTo: Agregar resultados de análisis de Métricas de Código en una Build (I)

image47dd1de4

Buenas,

desde hace un par de versiones en el IDE de Visual Studio, tenemos la capacidad de realizar análisis de métricas de código en nuestras soluciones. En este análisis podremos ver la complejidad ciclomática del código, el acoplamiento entre clases, y otras métricas que nos ayudarán a ver si la calidad de nuestro código es aceptable. El problema con los resultados de esta herramienta es que no es posible incorporar esas métricas “out of the box” en el resultado de una build. En este post mostraré como se puede agregar este resultado a una build y trabajar sobre el mismo.

Para esto parto de un código que al momento de ejecutar las métricas de código retorna los siguientes valores:

image

 

Y antes de entrar al trapo, es decir un par de tareas personalizadas, interpretar xmls feos, veamos los prerequisitos. En este caso es uno y muy simple:

Descargar las Visual Studio Code Metrics Power Tools 10.0 para Visual Studio 2010 desde http://www.microsoft.com/downloads/en/details.aspx?FamilyID=edd1dfb0-b9fe-4e90-b6a6-5ed6f6f6e615

Las Visual Studio Code Metrics Power Tools 10.0 consisten en una herramienta de línea de comandos que nos permite analizar ensamblados .Net. Una vez descargadas e instaladas las PT, las mismas funcionan de una forma muy simple:

Sobre un ensamblado compilado de .Net, se lanza la aplicación [%Program Files%\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\metrics.exe] y la misma genera un xml con los resultados del análisis de métricas de código.

Por ejemplo, sobre la aplicación anterior que está compilada en la ubicación

E:\srcBcapuano\AgileLabs\Blog\TeamBuildCodeMetrics\TeamBuildCodeMetrics\bin\Debug\

debería lanzar el siguiente comando desde la línea de comandos:

   1:  
   2: C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop>;
   3: Metrics.exe 
   4:   /f:e:\srcBcapuano\AgileLabs\Blog\TeamBuildCodeMetrics\TeamBuildCodeMetrics\bin\Debug\teambuildcodemetrics.exe 
   5:   /out:e:\srcBcapuano\AgileLabs\Blog\TeamBuildCodeMetrics\TeamBuildCodeMetrics\bin\Debug\codemetrics.xml
   6:  
   7: Microsoft (R) Code Metrics Command-Line Tool, Version 10.0
   8: Copyright (C) Microsoft Corporation.  All rights reserved.
   9:  
  10: Calculating metrics for file 
  11: 'e:\srcBcapuano\AgileLabs\Blog\TeamBuildCodeMetrics\TeamBuildCodeMetrics\bin\Debug\TeamBuildCodeMetrics.exe'.
  12: Writing report to e:\srcBcapuano\AgileLabs\Blog\TeamBuildCodeMetrics\TeamBuildCo
  13: deMetrics\bin\Debug\codemetrics.xml...
  14: Done.
  15:  
  16: C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop>

 

Esta acción crea el siguiente xml con toda la información de análisis de métricas de código del proyecto anterior.

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <CodeMetricsReport Version="10.0">
   3:   <Targets>
   4:     <Target Name="e:\srcBcapuano\AgileLabs\Blog\TeamBuildCodeMetrics\TeamBuildCodeMetrics\bin\Debug\TeamBuildCodeMetrics.exe">
   5:       <Modules>
   6:         <Module Name="TeamBuildCodeMetrics.exe" AssemblyVersion="1.0.0.0" FileVersion="1.0.0.0">
   7:           <Metrics>
   8:             <Metric Name="MaintainabilityIndex" Value="95" />
   9:             <Metric Name="CyclomaticComplexity" Value="24" />
  10:             <Metric Name="ClassCoupling" Value="14" />
  11:             <Metric Name="DepthOfInheritance" Value="12" />
  12:             <Metric Name="LinesOfCode" Value="47" />
  13:           </Metrics>
  14:           <Namespaces>
  15:             <Namespace Name="TeamBuildCodeMetrics">
  16:               <Metrics>
  17:                 <Metric Name="MaintainabilityIndex" Value="95" />
  18:                 <Metric Name="CyclomaticComplexity" Value="24" />
  19:                 <Metric Name="ClassCoupling" Value="14" />
  20:                 <Metric Name="DepthOfInheritance" Value="12" />
  21:                 <Metric Name="LinesOfCode" Value="47" />
  22:               </Metrics>
  23:               <Types>
  24:                 <Type Name="Program">
  25:                   <Metrics>
  26:                     <Metric Name="MaintainabilityIndex" Value="55" />
  27:                     <Metric Name="CyclomaticComplexity" Value="11" />
  28:                     <Metric Name="ClassCoupling" Value="13" />
  29:                     <Metric Name="DepthOfInheritance" Value="1" />
  30:                     <Metric Name="LinesOfCode" Value="32" />
  31:                   </Metrics>
  32:                   <Members>
  33:                     <Member Name="Main(string[]) : void" File="E:\srcBcapuano\AgileLabs\Blog\TeamBuildCodeMetrics\TeamBuildCodeMetrics\Program.cs" Line="8">
  34:                       <Metrics>
  35:                         <Metric Name="MaintainabilityIndex" Value="46" />
  36:                         <Metric Name="CyclomaticComplexity" Value="10" />
  37:                         <Metric Name="ClassCoupling" Value="13" />
  38:                         <Metric Name="LinesOfCode" Value="31" />
  39:                       </Metrics>
  40:                     </Member>
  41:                     <Member Name="Program()">
  42:                       <Metrics>
  43:                         <Metric Name="MaintainabilityIndex" Value="100" />
  44:                         <Metric Name="CyclomaticComplexity" Value="1" />
  45:                         <Metric Name="ClassCoupling" Value="0" />
  46:                         <Metric Name="LinesOfCode" Value="1" />
  47:                       </Metrics>
  48:                     </Member>
  49:                   </Members>
  50:                 </Type>
  51:                 <Type Name="Class1">
  52:                   <Metrics>
  53:                     <Metric Name="MaintainabilityIndex" Value="85" />
  54:                     <Metric Name="CyclomaticComplexity" Value="2" />
  55:                     <Metric Name="ClassCoupling" Value="1" />
  56:                     <Metric Name="DepthOfInheritance" Value="1" />
  57:                     <Metric Name="LinesOfCode" Value="4" />
  58:                   </Metrics>
  59:                   <Members>
  60:                     <Member Name="GetData() : int" File="E:\srcBcapuano\AgileLabs\Blog\TeamBuildCodeMetrics\TeamBuildCodeMetrics\Class1.cs" Line="8">
  61:                       <Metrics>
  62:                         <Metric Name="MaintainabilityIndex" Value="80" />
  63:                         <Metric Name="CyclomaticComplexity" Value="1" />
  64:                         <Metric Name="ClassCoupling" Value="1" />
  65:                         <Metric Name="LinesOfCode" Value="3" />
  66:                       </Metrics>
  67:                     </Member>
  68:                     <Member Name="Class1()">
  69:                       <Metrics>
  70:                         <Metric Name="MaintainabilityIndex" Value="100" />
  71:                         <Metric Name="CyclomaticComplexity" Value="1" />
  72:                         <Metric Name="ClassCoupling" Value="0" />
  73:                         <Metric Name="LinesOfCode" Value="1" />
  74:                       </Metrics>
  75:                     </Member>
  76:                   </Members>
  77:                 </Type>
  78:                 <Type Name="Class2">
  79:                   <Metrics>
  80:                     <Metric Name="MaintainabilityIndex" Value="100" />
  81:                     <Metric Name="CyclomaticComplexity" Value="1" />
  82:                     <Metric Name="ClassCoupling" Value="1" />
  83:                     <Metric Name="DepthOfInheritance" Value="2" />
  84:                     <Metric Name="LinesOfCode" Value="1" />
  85:                   </Metrics>
  86:                   <Members>
  87:                     <Member Name="Class2()">
  88:                       <Metrics>
  89:                         <Metric Name="MaintainabilityIndex" Value="100" />
  90:                         <Metric Name="CyclomaticComplexity" Value="1" />
  91:                         <Metric Name="ClassCoupling" Value="1" />
  92:                         <Metric Name="LinesOfCode" Value="1" />
  93:                       </Metrics>
  94:                     </Member>
  95:                   </Members>
  96:                 </Type>
  97:                 <Type Name="Class3">
  98:                   <Metrics>
  99:                     <Metric Name="MaintainabilityIndex" Value="100" />
 100:                     <Metric Name="CyclomaticComplexity" Value="1" />
 101:                     <Metric Name="ClassCoupling" Value="1" />
 102:                     <Metric Name="DepthOfInheritance" Value="3" />
 103:                     <Metric Name="LinesOfCode" Value="1" />
 104:                   </Metrics>
 105:                   <Members>
 106:                     <Member Name="Class3()">
 107:                       <Metrics>
 108:                         <Metric Name="MaintainabilityIndex" Value="100" />
 109:                         <Metric Name="CyclomaticComplexity" Value="1" />
 110:                         <Metric Name="ClassCoupling" Value="1" />
 111:                         <Metric Name="LinesOfCode" Value="1" />
 112:                       </Metrics>
 113:                     </Member>
 114:                   </Members>
 115:                 </Type>
 116:                 <Type Name="Class4">
 117:                   <Metrics>
 118:                     <Metric Name="MaintainabilityIndex" Value="100" />
 119:                     <Metric Name="CyclomaticComplexity" Value="1" />
 120:                     <Metric Name="ClassCoupling" Value="1" />
 121:                     <Metric Name="DepthOfInheritance" Value="4" />
 122:                     <Metric Name="LinesOfCode" Value="1" />
 123:                   </Metrics>
 124:                   <Members>
 125:                     <Member Name="Class4()">
 126:                       <Metrics>
 127:                         <Metric Name="MaintainabilityIndex" Value="100" />
 128:                         <Metric Name="CyclomaticComplexity" Value="1" />
 129:                         <Metric Name="ClassCoupling" Value="1" />
 130:                         <Metric Name="LinesOfCode" Value="1" />
 131:                       </Metrics>
 132:                     </Member>
 133:                   </Members>
 134:                 </Type>
 135:                 <Type Name="Class5">
 136:                   <Metrics>
 137:                     <Metric Name="MaintainabilityIndex" Value="100" />
 138:                     <Metric Name="CyclomaticComplexity" Value="1" />
 139:                     <Metric Name="ClassCoupling" Value="1" />
 140:                     <Metric Name="DepthOfInheritance" Value="5" />
 141:                     <Metric Name="LinesOfCode" Value="1" />
 142:                   </Metrics>
 143:                   <Members>
 144:                     <Member Name="Class5()">
 145:                       <Metrics>
 146:                         <Metric Name="MaintainabilityIndex" Value="100" />
 147:                         <Metric Name="CyclomaticComplexity" Value="1" />
 148:                         <Metric Name="ClassCoupling" Value="1" />
 149:                         <Metric Name="LinesOfCode" Value="1" />
 150:                       </Metrics>
 151:                     </Member>
 152:                   </Members>
 153:                 </Type>
 154:                 <Type Name="Class6">
 155:                   <Metrics>
 156:                     <Metric Name="MaintainabilityIndex" Value="100" />
 157:                     <Metric Name="CyclomaticComplexity" Value="1" />
 158:                     <Metric Name="ClassCoupling" Value="1" />
 159:                     <Metric Name="DepthOfInheritance" Value="6" />
 160:                     <Metric Name="LinesOfCode" Value="1" />
 161:                   </Metrics>
 162:                   <Members>
 163:                     <Member Name="Class6()">
 164:                       <Metrics>
 165:                         <Metric Name="MaintainabilityIndex" Value="100" />
 166:                         <Metric Name="CyclomaticComplexity" Value="1" />
 167:                         <Metric Name="ClassCoupling" Value="1" />
 168:                         <Metric Name="LinesOfCode" Value="1" />
 169:                       </Metrics>
 170:                     </Member>
 171:                   </Members>
 172:                 </Type>
 173:                 <Type Name="Class7">
 174:                   <Metrics>
 175:                     <Metric Name="MaintainabilityIndex" Value="100" />
 176:                     <Metric Name="CyclomaticComplexity" Value="1" />
 177:                     <Metric Name="ClassCoupling" Value="1" />
 178:                     <Metric Name="DepthOfInheritance" Value="7" />
 179:                     <Metric Name="LinesOfCode" Value="1" />
 180:                   </Metrics>
 181:                   <Members>
 182:                     <Member Name="Class7()">
 183:                       <Metrics>
 184:                         <Metric Name="MaintainabilityIndex" Value="100" />
 185:                         <Metric Name="CyclomaticComplexity" Value="1" />
 186:                         <Metric Name="ClassCoupling" Value="1" />
 187:                         <Metric Name="LinesOfCode" Value="1" />
 188:                       </Metrics>
 189:                     </Member>
 190:                   </Members>
 191:                 </Type>
 192:                 <Type Name="Class8">
 193:                   <Metrics>
 194:                     <Metric Name="MaintainabilityIndex" Value="100" />
 195:                     <Metric Name="CyclomaticComplexity" Value="1" />
 196:                     <Metric Name="ClassCoupling" Value="1" />
 197:                     <Metric Name="DepthOfInheritance" Value="8" />
 198:                     <Metric Name="LinesOfCode" Value="1" />
 199:                   </Metrics>
 200:                   <Members>
 201:                     <Member Name="Class8()">
 202:                       <Metrics>
 203:                         <Metric Name="MaintainabilityIndex" Value="100" />
 204:                         <Metric Name="CyclomaticComplexity" Value="1" />
 205:                         <Metric Name="ClassCoupling" Value="1" />
 206:                         <Metric Name="LinesOfCode" Value="1" />
 207:                       </Metrics>
 208:                     </Member>
 209:                   </Members>
 210:                 </Type>
 211:                 <Type Name="Class9">
 212:                   <Metrics>
 213:                     <Metric Name="MaintainabilityIndex" Value="100" />
 214:                     <Metric Name="CyclomaticComplexity" Value="1" />
 215:                     <Metric Name="ClassCoupling" Value="1" />
 216:                     <Metric Name="DepthOfInheritance" Value="9" />
 217:                     <Metric Name="LinesOfCode" Value="1" />
 218:                   </Metrics>
 219:                   <Members>
 220:                     <Member Name="Class9()">
 221:                       <Metrics>
 222:                         <Metric Name="MaintainabilityIndex" Value="100" />
 223:                         <Metric Name="CyclomaticComplexity" Value="1" />
 224:                         <Metric Name="ClassCoupling" Value="1" />
 225:                         <Metric Name="LinesOfCode" Value="1" />
 226:                       </Metrics>
 227:                     </Member>
 228:                   </Members>
 229:                 </Type>
 230:                 <Type Name="Class10">
 231:                   <Metrics>
 232:                     <Metric Name="MaintainabilityIndex" Value="100" />
 233:                     <Metric Name="CyclomaticComplexity" Value="1" />
 234:                     <Metric Name="ClassCoupling" Value="1" />
 235:                     <Metric Name="DepthOfInheritance" Value="10" />
 236:                     <Metric Name="LinesOfCode" Value="1" />
 237:                   </Metrics>
 238:                   <Members>
 239:                     <Member Name="Class10()">
 240:                       <Metrics>
 241:                         <Metric Name="MaintainabilityIndex" Value="100" />
 242:                         <Metric Name="CyclomaticComplexity" Value="1" />
 243:                         <Metric Name="ClassCoupling" Value="1" />
 244:                         <Metric Name="LinesOfCode" Value="1" />
 245:                       </Metrics>
 246:                     </Member>
 247:                   </Members>
 248:                 </Type>
 249:                 <Type Name="Class11">
 250:                   <Metrics>
 251:                     <Metric Name="MaintainabilityIndex" Value="100" />
 252:                     <Metric Name="CyclomaticComplexity" Value="1" />
 253:                     <Metric Name="ClassCoupling" Value="1" />
 254:                     <Metric Name="DepthOfInheritance" Value="11" />
 255:                     <Metric Name="LinesOfCode" Value="1" />
 256:                   </Metrics>
 257:                   <Members>
 258:                     <Member Name="Class11()">
 259:                       <Metrics>
 260:                         <Metric Name="MaintainabilityIndex" Value="100" />
 261:                         <Metric Name="CyclomaticComplexity" Value="1" />
 262:                         <Metric Name="ClassCoupling" Value="1" />
 263:                         <Metric Name="LinesOfCode" Value="1" />
 264:                       </Metrics>
 265:                     </Member>
 266:                   </Members>
 267:                 </Type>
 268:                 <Type Name="Class12">
 269:                   <Metrics>
 270:                     <Metric Name="MaintainabilityIndex" Value="100" />
 271:                     <Metric Name="CyclomaticComplexity" Value="1" />
 272:                     <Metric Name="ClassCoupling" Value="1" />
 273:                     <Metric Name="DepthOfInheritance" Value="12" />
 274:                     <Metric Name="LinesOfCode" Value="1" />
 275:                   </Metrics>
 276:                   <Members>
 277:                     <Member Name="Class12()">
 278:                       <Metrics>
 279:                         <Metric Name="MaintainabilityIndex" Value="100" />
 280:                         <Metric Name="CyclomaticComplexity" Value="1" />
 281:                         <Metric Name="ClassCoupling" Value="1" />
 282:                         <Metric Name="LinesOfCode" Value="1" />
 283:                       </Metrics>
 284:                     </Member>
 285:                   </Members>
 286:                 </Type>
 287:               </Types>
 288:             </Namespace>
 289:           </Namespaces>
 290:         </Module>
 291:       </Modules>
 292:     </Target>
 293:   </Targets>
 294: </CodeMetricsReport>

En próximos posts veremos como analizar este archivo XML de una forma simple y luego procesarlos en una tarea de Team Build

 

Saludos @ Home

El Bruno

   

Descarga: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=edd1dfb0-b9fe-4e90-b6a6-5ed6f6f6e615

Archivado en: ,,,,,,
Comparte este post:

# re: [TEAMBUILD2010] HowTo: Agregar resultados de análisis de Métricas de Código en una Build (I)

Wednesday, May 18, 2011 6:48 PM by Ivan Martinez

¿Sabes si se pueden usar las Visual Studio Code Metrics Power Tools en la versión Express?

# re: [TEAMBUILD2010] HowTo: Agregar resultados de análisis de Métricas de Código en una Build (I)

Wednesday, May 18, 2011 6:52 PM by Ivan Martinez

Me auto-respondo: vale premio a la pregunta estúpida del día. Sólo sirve para las versiones Ultimate, Premium y Team Foundation Server. Eso me pasa por preguntar sin informarme antes, sorry!