Test Unitarios de código X++ en Visual Studio (AX 2012)

Creo que todo el que lo haya intentado estará de acuerdo en que el framework para Unit Testing integrado en el propio entorno de desarrollo de Microsoft Dynamics AX 2012 (del nuevo Dynamics AX, AX 7, hablaremos otro día) es bastante limitado. Tan limitado que resulta prácticamente inutilizable en cuanto quieres probar algo más o menos serio.

Pero hoy no quiero hablar de limitaciones sino de lo que podemos hacer, y entre estas cosas está la posibilidad de utilizar classes proxy del código X++ para poder escribir las pruebas unitarias en el propio Visual Studio, y utilizar así sus posibilidades y su flexibilidad. Veamos un ejemplo sencillo.

Voy a intentar probar una clase que he hecho en X++ específicamente para esto, con este código:

/// <summary>
/// Dummy fluid class for testing purposes
/// </summary>
class DEVDummyTestCalcClass
{
    real value;
}
public void new(real _value)
{
    value = _value;
}
public real Value()
{
    return value;
}
public DEVDummyTestCalcClass Add(real _value)
{
    return new DEVDummyTestCalcClass(value + _value);
}
public DEVDummyTestCalcClass Substract(real _value)
{
    return new DEVDummyTestCalcClass(value - _value);
}
public DEVDummyTestCalcClass Multiply(real _value)
{
    return new DEVDummyTestCalcClass(value * _value);
}
public DEVDummyTestCalcClass Divide(real _value)
{
    return new DEVDummyTestCalcClass(value / _value);
}

En el Visual Studio 2010 que todos tenemos en nuestros entornos de desarrollo de Microsoft Dynamics AX 2012, creamos un nuevo proyecto de tipo Test Project (yo he elegido C# pero supongo que también funcionarán en Visual Basic):

AX 2012 X++ Unit Test

Añadimos este proyecto al AOT. Esto es necesario para que se añada al proyecto la referencia al ensamblado que nos va a permitir el Interop entre X++ y CIL que necesitamos para que se generen las clases proxy:

AX 2012 X++ Unit Test

Si no lo tenemos visible, mostramos el Application Explorer para poder acceder a los objetos del AOT desde Visual Studio:

AX 2012 X++ Unit Test

Elegimos la clase (o clases) que queremos probar, y las añadimos al proyecto, lo que efectivamente generará la clase proxy automáticamente:

AX 2012 X++ Unit Test

Ahora, en la clase de pruebas creada por defecto en el proyecto, o en otra clase cualquiera que hayamos creado, sustituimos el método TestMethod1 por métodos de pruebas como estos (aplicables a la clase X++ que puse más arriba):

[TestMethod]
public void TestConstruct()
{
    using (Session axSession = new Session())
    {
        axSession.Logon(null, null, null, null);

        Assert.AreEqual(0, new DEVDummyTestCalcClass(0).Value());
        Assert.AreEqual(-1, new DEVDummyTestCalcClass(-1).Value());
    }
}

[TestMethod]
public void TestSum()
{
    using (Session axSession = new Session())
    {
        axSession.Logon(null, null, null, null);

        Assert.AreEqual(10, new DEVDummyTestCalcClass(0).Add(10).Value());
        Assert.AreEqual(10, new DEVDummyTestCalcClass(0).Add(5).Add(5).Value());
    }
}

[TestMethod]
public void TestDivide()
{
    using (Session axSession = new Session())
    {
        axSession.Logon(null, null, null, null);

        Assert.AreEqual(10, new DEVDummyTestCalcClass(20).Divide(2).Value());
    }
}

[TestMethod]
[ExpectedException(typeof(Microsoft.Dynamics.AX.ManagedInterop.NumericException))]
public void TestDivideByZeroException()
{
    using (Session axSession = new Session())
    {
        axSession.Logon(null, null, null, null);

        new DEVDummyTestCalcClass(100).Divide(0).Value(); // Exception
    }
}

A continuación ya podemos ejecutar estos Test y verificar que nuestra clase funciona como se espera de ella:

00500-ax2012-xpp-unittests

Fácil, ¿Verdad? Si este tema interesa a más gente seguiré publicando artículos para escenarios más complicados. Digamos, más cerca de lo que serían unas pruebas de objetos reales. Mientras tanto, probablemente te interese mi serie de artículos sobre gestión del ciclo de vida de aplicaciones AX 2012. 🙂

1 comentario
  • FH-Inway
    junio 14, 2016

    Thanks for the article, I would be interested in more information, specifically about the differences between the Dynamics AX Unit Test framework and unit tests in Visual Studio.