Crear una Regla para el Analizador de Código de Visual Studio 2008
El analizador de código del Visual Studio 2008 es una herramienta que permite comprobar si el código cumple una serie de reglas. Funciona exactamente igual que FxCop, sólo que se encuentra integrado dentro del propio IDE.
El propio Visual Studio ya cuenta con un gran número de reglas predefinidas. Aunque este número puede ser aumentado por medio de la creación de nuevas reglas. Esto puede ser muy útil para equipos de trabajo que utilicen una guía de estilos específica. De esta forma, se puede comprobar que todos los miembros del equipo cumplen con los estándares fijados.
Creando una Regla
Cómo ejemplo vamos a definir una regla que permita comprobar los nombres de las pruebas unitarias. Según esta regla, el nombre de un test debe de tener este formato: NombreDelMetodoAProbar_DescripcionDeLaPruebas_ResultadoEsperado. Ej: GetCustomersById_NullParameter_ArgumentException.
Para ello habrá que crear un proyecto de tipo librería. Este proyecto debe de tener una referencia a estas tres dlls: FxCopSdk.dll, FxCopCommon.dll, Microsoft.Cci.dll. Estas dlls se pueden encontrar en la carpeta: %ProgramFiles%\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop\.
Para que el analizador de código pueda determinar que clases son reglas. Las clases deben de heredar de la clase abstracta BaseIntrospectionRule. Esta clase se encuentra dentro del namespace Microsoft.FxCop.Sdk.
public abstract class BaseRule : BaseIntrospectionRule
{
protected BaseRule(string name)
: base(name, "Sector7G.VisualStudio.CodeAnalysisRules.Rules",
typeof(BaseRule).Assembly)
{
}
public override TargetVisibilities TargetVisibility
{
get
{
return TargetVisibilities.All;
}
}
}
Nota: En este caso he creado una clase base de la cual heredarán todas mis reglas.
Al constructor de la clase BaseIntrospectionRule hay que pasarle como argumentos: El nombre de la regla, el namespace del archivo xml con la definición de la regla, y el ensamblado que tiene la regla.
Para crear la regla hay que sobre escribir el método Check de la clase BaseIntrospectionRule. Dentro de este método deberemos escribir el código de verifique si el nombre de un test es correcto.
public sealed class TestMethodsNamesMustHaveThreePartsRule : BaseRule
{
public TestMethodsNamesMustHaveThreePartsRule()
: base("TestMethodsNamesMustHaveThreePartsRule")
{
}
public override ProblemCollection Check(Member member)
{
if (member == null || member.NodeType != NodeType.Method)
return Problems;
if (member.HasAttribute("TestMethodAttribute"))
{
if (!member.Name.Name.IsCorrectTestMethodName())
{
Problems.Add(new Problem(GetResolution(member.Name.Name)));
return Problems;
}
}
return Problems;
}
}
En este código se puede ver como se comprueba que método este decorado con el atributo TestMethodAttribute. De esta forma podemos identificar si el método se trata de una prueba. Seguidamente se comprueba si el nombre cumple con la especificación establecida.
El código del método HasAttribute es:
public static class RuleHelper
{
public static bool HasAttribute(this Member member, string type)
{
var info = member.Attributes.Where(a => a.Type.Name.Name == type);
return info != null && info.Count() != 0;
}
}
El códigio de método IsCorrectTestMethodName es:
public static class NamingHelper
{
public static bool IsCorrectTestMethodName(this string name)
{
if (String.IsNullOrEmpty(name))
return false;
string[] parts = name.Split(new[] { '_'});
return parts.Length == 3;
}
}
Ya sólo queda incluir un archivo xml con la información de la regla. Este archivo debe incluirse como recurso dentro de la dll, es decir, su propiedad Build Action debe de ser Embedded Resource. El nombre de este archivo debe de ser el mismo que declaro en el parámetro resourceName del constructor de la clase BaseIntrospectionRule. En el caso del ejemplo se llama Rules.xml y tiene el siguiente formato:
<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="Sector7G Code Analysis Rules">
<Rule TypeName="TestMethodsNamesMustHaveThreePartsRule"
Category="Sector7G.Naming" CheckId="S7G0001">
<Name>The name of a test method must have three parts</Name>
<Description>A test method name must have three parts.</Description>
<Resolution>
The name "'{0}'" does not have three parts.
The correct format of a test method name is:
name of the method to test, a description and an expected result. Sample:
GetCustomerById_NullParameter_ArgumentException
</Resolution>
<MessageLevel Certainty="95">Error</MessageLevel>
<FixCategories>NonBreaking</FixCategories>
<Owner>Pedro Alvarez Fernandez</Owner>
<Email></Email>
<Url>http://www.sectorsieteg.net</Url>
</Rule>
</Rules>
Una vez terminado el desarrollo, la regla debe de ser desplegada para poder ser utilizada desde el Visual Studio. Para ello, la dll debe de ser copiada a la carpeta: C:\Program Files\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop\Rules. En esta carpeta encontraras las dlls del resto de reglas que utiliza el Visual Studio.