Dynamics 365, AppSource, PowerApps y compañía… ¿Qué esperar del futuro de los ERP en Microsoft?

Hace bastante tiempo (hablamos de ello aquí y aquí) que se intuye el objetivo a largo plazo de Microsoft de ofrecer sus soluciones empresariales como servicios en la nube. Las que faltan, porque la mayoría llevan mucho tiempo allí como Sharepoint o CRM Online, y otras no tanto como NAV (anunciado como Project Madeira y disponible en pruebas sólo en EEUU y Canadá). Esta intuición se vuelve casi una evidencia viendo el enorme esfuerzo que ha hecho el equipo de producto en llevar el nuevo Dynamics AX a Azure y la extensa integración con todos los servicios SaaS y de infraestructura que allí se ofrecen como Power BI, Cortana Intelligence, Azure IoT y un largo y creciente etcétera, y también con la adquisición de LinkedIn anunciada recientemente. Dynamics 365 Para confirmar estas sospechas, que ya eran un secreto a voces, durante la pasada Worldwide Partner Conference fue anunciada la materialización de esta estrategia en forma de nuevo producto llamado Dynamics 365 y del que a estas alturas me extrañaría mucho que no hayas oído hablar, ya que ha estado en boca de todos en las últimas semanas. Ha sido muchísimo lo que se ha publicado en redes sociales y blogs de partners sobre el tema, pero no es mucha la información confirmada oficialmente, por lo que voy a intentar hacer un resumen/recopilación de lo que sí sabemos seguro y centrándonos en el material publicado directamente por Microsoft o por fuentes fiables. Para los que prefieran escucharlo, este vídeo de la WPC contiene una gran cantidad de información útil y de primera mano: Driving Enterprise ERP Business

Dynamics 365 ¿Qué es y cuándo estará disponible?

TL;DR

Dynamics 365 viene a ser una solución completa para clientes empresariales de Microsoft que englobe las características actuales de los productos ERP (NAV y AX) y CRM, de forma que pueda ser implementada de forma sencilla e incremental, empezando desde unos pocos usuarios hasta la escalabilidad de un sistema Dynamics AX completo, y su lanzamiento está anunciado para el próximo otoño (se comenta Octubre en algunas fuentes, pero ya sabemos cómo funciona esto).
De momento no viene a sustituir las soluciones existentes sino a complementarlas con una oferta más personalizable, fácil de implementar, de comprar y de escalar a los clientes actuales de otras soluciones como Office 365. Sin embargo, y como parece obvio, utiliza como base las tecnologías y funcionalidades ya desarrolladas para estos productos (AX, NAV, CRM) que seguirán evolucionando. Se anuncia también Microsoft AppSource, la nueva tienda para que los partners puedan vender sus soluciones a medida de forma centralizada. Dynamics 365 - Investment areas Para entender mejor este roadmap, hay que tener en cuenta el reciente anuncio (no oficial) de que Azure Stack, la solución de Microsoft que llevaría los servicios Azure a nuestros servidores on-premise, ha sido retrasado hasta mediados de 2017, aunque no hay fechas anunciadas, sólo un anuncio de que no será lanzado en breve. También comentar que el soporte extendido para Dynamnics AX 2012 R3 ha sido ampliado 3 años hasta 2023, y la última revisión CU11 se publicó hace pocas semanas con soporte para SQL 2016, por lo que podemos entender AX 2012 como la solución de facto para uso on-premise o cloud mixto (AX 2012 R3 puede desplegarse en Azure en modo IaaSa corto plazo, mientras que Dynamics 365 se anuncia exclusivamente disponible en la nube pública. Durante la WPC se anunció la inminente publicación de un roadmap dinámico en formato web, actualizado a "cloud speed" (cada 90 días) y que muestre los planes de inversión a corto, medio y largo plazo para todos los productos y de forma detallada por módulos, tecnologías, etc., incluyendo cambios previstos en funcionalidades y procesos de negocio.

Quiero saber más

Dynamics 365 formará parte de la ya extensa oferta de servicios disponibles bajo la suscripción de Azure para empresas. Será un servicio único que englobará funciones propias de aplicaciones ERP y CRM como Ventas, Servicio a clientes, Finanzas, Operaciones, Marketing, etc. Al formar parte de los servicios de Azure se integrará de forma nativa con el resto, tales como Power BI, Cortana Intelligence, Azure IoT, y con servicios que puedan aparecer en el futuro. Por supuesto estos procesos empresariales tendrán integración total con Office 365 y por tanto con las herramientas que los usuarios utilizan durante esos procesos como el correo electrónico, hojas Excel, documentos Word, etc. AppSource vendrá a complementar estos módulos estándar que Microsoft proveerá basándose en las funcionalidades de NAV (en su versión SaaS llamada hasta ahora Project Madeira), CRM Online y el nuevo Dynamics AX, con nuevas soluciones basadas en estas tecnologías, un nuevo modelo de datos común (llamado de momento Common Data Model, CDM), y el resto de servicios que los partners puedan desarrollar para mejorar esta oferta. Only Microsoft has all the pieces to deliver an intelligent business cloud En cuanto al licenciamiento, aunque la oferta no está todavía confirmada, se prevén dos versiones (Enterprise y [Small] Business) y dos modos de licenciamiento (por aplicación o por rol, llamado Team Member). La licencia por aplicación es el modelo tradicional en el que se contrata el uso de uno o varios de los módulos disponibles (Ventas, Marketing, Operaciones, etc.), mientras que el modelo por rol pretende dar una solución más flexible y adaptada a las necesidades de cada usuario, permitiendo que cada usuario tenga acceso a las partes de cada aplicación que necesite para su trabajo. Los precios no estarán disponibles hasta poco antes del lanzamiento oficial. Dynamics 365 - License plans Previsiblemente la versión Business (llamada también "Financials") está basada en el recientemente anunciado Project Madeira (Dynamics NAV como servicio en la nube) e incluirá los módulos (llamados "Apps"): Financials, Sales y Marketing. La versión Enterprise incluirá componentes del nuevo Dynamics AX para añadir las Apps: Operations, Customer Service, Field Service y Project Service Automation. En ambos casos, las funcionalidades de ventas y márquetin utilizarán, probablemente, componentes de CRM Online. Financials se lanzará en primer lugar (donde ya puede probarse) en EEUU y Canadá, y a esta primera versión le seguirá Enterprise con el resto de módulos. La disponibilidad por países será incremental, no estará disponible globalmente desde el lanzamiento. Las soluciones disponibles solamente en la nube como CRM Online y Madeira ("NAV Online") serán sustituidas por alguno de los "sabores" de Dynamics 365 [previsiblemente] en la próxima renovación de licencia tras el lanzamiento, mientras que las versiones on-premise podrán mantenerse tal y como están (incluyendo las licencias perpetuas actuales on-premise, sin suscripción periódica). Los detalles específicos, tanto de los modelos y especificaciones de licencia como de los planes de transición para clientes actuales se publicarán cuando quede poco tiempo para el lanzamiento.

¿Cómo afecta esto a los productos actuales? (¡Y a sus profesionales!)

En el anuncio se insiste en que esta solución no llega para sustituir a las soluciones actuales sino a complementar la oferta disponible, y que en cualquier caso es un anuncio de lo que ocurrirá en el próximo año e incluso algo más tarde. Dejo a discreción de cada uno interpretar o hacer las previsiones que considere más acertadas. Personalmente yo estaría preparado para algunos cambios en mi forma de trabajar a medio y largo plazo y mantendría una mente abierta de cara a la formación y el reciclaje, si es que no la tenemos ya. Se ha anunciado oficialmente que todas las aplicaciones de línea empresarial de Microsoft se alinearán a medio plazo para seguir un modelo de datos común y una arquitectura modular en la nube que facilite la integración entre ellas, con nuevas funcionalidades de Microsoft, con el resto de servicios de Azure, y con las nuevas funcionalidades desarrolladas por los partners mediante AppSource. No hay detalles concretos sobre este modelo de datos pero es algo sobre lo que me gustaría publicar en cuanto tengamos más información.
Como ya he comentado, Dynamics 365 estará disponible total y exclusivamente en la nube pública, por lo que se seguirán utilizando los productos actuales, que seguirán innovando y evolucionando de forma paralela para implementaciones on-premise y también para grandes cuentas cuando la oferta en Dynamics 365 no sea suficiente para cubrir la funcionalidad completa. Forma parte del roadmap el desarrollo de conectores de estas aplicaciones on-premise con sus versiones en la nube tanto para soportar escenarios híbridos como para facilitar la migración hacia la nube desde los sistemas actuales. AppSource abre una nueva vía de negocio a los partners y también un nuevo reto para consultores y desarrolladores, ya que permite desarrollar funcionalidades que pueden ser vendidas y desplegadas de forma independiente sobre aplicaciones existentes mediante una Store (como la Office Store, Windows Store o el Azure Marketplace) que permitirá a los clientes descubrir y probar estas funcionalidades con mínimo esfuerzo. Estas aplicaciones pueden hacer uso de todos los servicios en Azure como ya hemos dicho, permitiendo a partners desarrollar nuevas funcionalidades para procesos de negocio, inteligencia (con Power BI) y predicción (con Cortana Intelligence), y también de nuevas funcionalidades pensadas para orquestar la integración de procesos de negocio formales con otras acciones menos estructuradas mediante herramientas para definir flujos de trabajo integrados entre aplicaciones y basados en eventos como Microsoft Flow al estilo IFTTTPor ejemplo: Cuando se cree una nueva cuenta en CRM, envía un correo de bienvenida con un adjunto, crea una carpeta y una serie de documentos en mi OneDrive con los datos de la cuenta y crea alertas en Outlook para llamar al cliente y concretar una primera cita. Aunque estas son herramientas pensadas para ser utilizadas directamente por usuarios avanzados (o "citizen developers"), seguro que desde los equipos de desarrollo tendremos que estar al día de su utilización para incorporarlos a nuestras soluciones. Dada la filosofía integrada de esta nueva solución, y viendo que en las presentaciones se refieren a PowerApps en general, esta integración no se limitará sólo a Flow sino que en el futuro integrará otras aplicaciones transversales en las que Microsoft pueda trabajar como Microsoft Graph.

Más información ...

El post ha quedado un poco largo, y quizás menos técnico de lo habitual, pero lo cierto es que no conocemos detalles técnicos todavía así que no es posible profundizar nada más. No quepa duda de que lo haré en cuanto pueda 🙂
Leer Más >>

Novedades Junio 2016 en Lifecycle Services (LCS)

Microsoft Dynamics Lifecycle Services Ya está disponible la revisión mensual de Microsoft Dynamics Lifecycle Services (LCS). Los cambios más importantes son sin duda las primeras funcionalidades disponibles para el manejo de diferentes versiones del nuevo Microsoft Dynamics AX.
  • Se pueden desplegar directamente entornos de Desarrollo o Build y pruebas (habrá más y mejores cambios en futuras versiones)
  • Mejoras en el manejo de las metodologías (adjuntar una metodología a otra existente; añadir fases y tareas)
  • Actualizada la hoja Excel Subscription estimator (otra vez, es un permanente work-in-progress). A partir de ahora la utilización de esta hoja es obligatoria para implementar proyectos.
  • Las herramientas de diagnóstico y monitorización han sido publicadas a través de LCS (podía verse cierta monitorización genérica antes a través del portal de Azure, pero la disponible en LCS es específica para AX, incluyendo las métricas de SQL Insights).
  • ¡Integración de las tareas de procesos de negocio con Work Items de TFS (en realidad, con VSTS)! (esta funcionalidad está todavía en preview por lo que hay que activarla especificamente).
  • Ahora se pueden añadir requerimientos a los procesos de negocio.
Puedes ver todas las notas y ejemplos de estas novedades en el siguiente enlace: Y los cambios de la actualización anterior aquí
Leer Más >>

Cumulative Update 11 para Microsoft Dynamics AX 2012 R3

Microsoft Dynamics Ya está disponible la siguiente actualización acumulativa para Microsoft Dynamics AX 2012 R3, la CU11 (6.3.4000.127). Esta actualización está disponible para instalación mediante el módulo Updates de Lifecycle Services, como viene siendo habitual desde la revisión R3. Información sobre las mejoras sobre el proceso de instalación se puede encontrar en la guía de instalación enlazada más abajo, incluyendo la página de TechNet que detalla los cambios de esta revisión. La documentación del parche: Descarga y detalle de cambios en: Vale la pena echar un vistazo a los cambios realizados en los modulos de almacén y cadena de suministro detallados en este post del equipo de SCM. Y como pequeño offtopic comentar el anuncio de que el soporte extendido para AX 2012 R3 ha sido extendido hasta 2023, supongo para garantizar las inversiones de AX 2012 como versión de on-premise hasta que el nuevo AX esté disponible fuera de Azure. Supongo que veremos algo más el mes que viene durante la conferencia anual de partners en Toronto.
Leer Más >>

PowerShell para la administración automática de Dynamics AX 2012 (PS-II)

En la primera entrega de esta serie sobre PowerShell y DevOps para Microsoft Dynamics AX 2012  hablábamos sobre los principios más básicos de PowerShell y su sintaxis. También vimos en post anteriores como PowerShell se puede usar de formas bastante creativas. Keyboard Esta vez vamos a ver los comandlets específicos para la administración de Microsoft Dynamics AX 2012, que podemos separar en varias familias:

Gestión de Modelos y la Model Store

Estos comandlets son muy importantes y van a ser la base de nuestra estrategia DevOps, combinada con los procesos builds automáticos que tendremos configurados en nuestro TFS, si es que los utilizamos. La combinación de estos componentes va a permitirnos diseñar procesos que actualicen automáticamente nuestros entornos, orientando nuestros procesos hacia la integración o el despliegue continuo de nuestros entornos, especialmente entornos de desarrollo y/o pruebas. Hablaremos sobre esto en los siguientes posts de esta serie. Estos son los que normalmente utilizamos para estas tareas, aunque vale la pena echar un vistazo a la referencia completa porque todos pueden ser útiles para tareas concretas o para scripts que automaticen tareas más completas:

Modelos

Comando Descripción
New-AXModel  Crea un nuevo modelo en la Model Store
Uninstall-AXModel  Elimina un modelo de la Model Store
Install-AXModel  Importa un modelo (desde un fichero) en la Model Store
Export-AXModel  Exporta un model de la Model Store a un fichero .axmodel
Move-AXModel  Mueve los objetos de un modelo a otro modelo, combinando todos los objetos en este último.

Model Store

Comando Descripción
Import-AXModelStore  Importa una Model Store (desde un fichero)
Export-AXModelStore  Exporta una Model Store a un fichero fichero .axmodelstore
Initialize-AXModelStore  Inicializa una model store para ser utilizada.  Es recomendable utilizar este comando después de algunas tareas de mantenimiento.
Optimize-AXModelStore  Optimiza y reindexa la model store para mejorar su rendimiento.  Es recomendable utilizar este comando después de algunas tareas de mantenimiento.
Set-AXModelStore  Asigna a la Model Store ciertos flags que indican las acciones que se han realizado sobre ella. Estos flags van a influir, por ejemplo, en si se muestra o no la cabina de actualización de modelo al iniciar un cliente, y son:
  • -InstallMode (mostrar cabina);
  • -NoInstallMode (no mostrar cabina)

Gestión y despliegue de informes y Reporting Services

La gestión de informes es otra de las tareas que podemos automatizar dentro de nuestras builds o scripts de despliegue. Aquí dejo los comandos más utilizados pero hay muchos más, consultad la referencia completa para verlos todos:
Comando Descripción
Publish-AXReport  Publica un informe desde el AOS hacia el Report Rerver de SSRS.  Es recomendable revisar la documentación de este comando porque tiene varios parámetros muy interesantes para desplegar informes de manera optimizada.
Test-AXReportServerConfiguration  Comprueba la configuración y la conectividad entre el AOS y el Report Server. Este comando es útil si tenemos problemas con el despliegue o la impresión de informes, para detectar posibles configuraciones erróneas o qué partes del sistema pueden estar fallando.
Get-AXReportServerConfiguration  Muestra la configuración actual, incluyendo la mostrada en el formulario correspondiente en Dynamics AX 2012 y algunos parámetros extra.
Get-AXReport  Muestra información sobre el informe como la fecha de creación/modificación, el usuario que lo ha modificado, la lista de diseños, el correspondiente proyecto de Visual Studio en el AOT, etc. Este comando es muy útil sobre todo cuando se usa en scripts de despliegue pero a veces es útil también utilizado directamente en la consola para obtener información de cualquier informe que esté dando problemas.

Gestión de usuarios y artefactos de seguridad

Otra tarea que es muy propia de su utilización tanto en consola como en scripts de automatización de tareas es la gestión de usuarios, y en el caso de AX, también de roles de seguridad. Cabe recordar que como veremos, PowerShell no se limita al manejo de AX sino que incluye todas las funcionalidades de Windows, con lo que estos comandos se pueden utilizar junto a los propios de la gestión de Active Directory para la creación, mantenimiento y supervisión automática de los usuarios en AX en base a los cambios en el dominio.

Usuarios

Comando Descripción
New-AXUser  Crea un nuevo Usuario
Disable-AXUser  Desactiva un Usuario
Get-AXUser  Devuelve una lista con todos los Usuarios  Este comando devuelve, entre otras informaciones útiles sobre cada usuario, su SID en Active Directory, por lo que resulta el punto de enlace ideal entre la seguridad de Dynamics AX y los usuarios del dominio.

Roles

Comando Descripción
New-AXSecurityRole  Crea un Rol de seguridad
Remove-AXSecurityRole  Elimina un Rol de seguridad
Add-AXSecurityRoleMember  Añade un Usuario a un Rol
Get-AXSecurityRole  Devuelve una lista con los Roles que tiene asignado un Usuario
Get-AXSecurityRoleMember  Devuelve una lista con los Usuarios asignados a un Rol
Get-AXSecurityRoleInfo  Devuelve información sobre todos los Roles existentes en el sistema
Debo insistir en revisar la referencia completa, no tiene sentido reproducir aquí la toda la lista de comandos disponibles por eso he puesto sólo los más relevantes, pero hay muchos más y es interesante conocerlos:

No sólo de AX vive el hombre

Hasta aquí he hablado sólo de los comandlets disponibles dentro de las herramientas de administración de Dynamics AX 2012. Pero no debemos limitarnos a esto. Para realizar tareas de automatización complejas vamos a necesitar integrarnos con el resto del sistema y utilizar no sólo los comandos genéricos de PowerShell sino los que vienen con el resto de productos que utilicemos como Analysis Services, Sharepoint, Active Directory, SQL Server, servicios de Azure, ... cualquier producto de Microsoft tiene su correspondiente módulo de PowerShell para interactuar con sus componentes. Por ejemplo, hace un tiempo mostré como obtener información la información de los usuario susuarios en Active Directory desde X++, esto mismo se puede hacer desde PowerShell para ser reutilizado rápidamente por los administradores sin necesidad de abrir AX; También mostré hace tiempo cómo utilizar PowerShell para asignar nuestro usuario activo a una base de datos de AX que hemos restaurado desde otro dominio para hacernos administradores, como ejemplo de uso del módulo de SQL Server. Y así podríamos seguir... Ejemplos de módulos que vamos a utilizar: El uso de estos módulos es bastante intuitivo, tras importar el módulo correspondiente con Import-Module podemos utilizar los comandlets que ya vimos en nuestra introducción a PowerShell tales como Get-Command y Get-Help para obtener cuales son los comandos disponibles y cómo utilizarlos. PowerShell - Import-Module

Reutilizar es la clave

Como sucede con el resto de consolas y lenguajes de script, siempre hay que intentar evitar reinventar la rueda desarrollando scripts que muy probablemente alguien haya hecho antes que nosotros. Buscando en internet se pueden encontrar scripts para realizar prácticamente cualquier tarea de administración usando PowerShell. Además, hay varias iniciativas para publicar scripts específicos para el uso con Microsoft Dynamics AX 2012, el más notable creo yo es el paquete de scripts publicado por Martin Dráb en codeplex y que incluye acciones para casi todas las fases de un despliegue automático. Prácticamente podemos montar un sistema de builds y actualización de entornos utilizando sólo PowerShell. Puede que este paquete te sirva o puede que no, pero en cualquier caso se puede aprender mucho de ese código y es una buena base para desarrollar los tuyos propios, ya que incluye buenas ideas específicas para conectar a servidores AX. Se puede descargar aquí:

Extra

Como nota final voy a comentar un artículo que, más que por su utilidad real, vale la pena revisar por sus posibilidades. Recordemos que desde PowerShell se pueden utilizar ensamblados de .NET y eso incluye por supuesto el .NET Business Connector de AX. En este artículo nos enseñan un ejemplo de esta utilización, tenga sentido o no 😉 Y hasta aquí esta segunda parte, que tras la primera introducción va a ser el punto de partida para desarrollar nuestros scripts de ¡DevOps para AX 2012!
Leer Más >>

Unit Testing X++ code in Visual Studio (AX 2012) [EN]

I'm pretty sure everybody who has tried will agree with me that the Unit Testing framework included in the AX 2012 development environment (aka MorphX) has some limitations. Sometimes such limits become so impacting that makes the framework almost useless when the code you need to test starts growing (let's discuss design problems in a separate post :)). But I'm not going to talk here about limitations, but about what we actually can do, and one of such things is to use X++ proxy classes to write our unit tests in Visual Studio, and use the native testing framework included here with all its possibilities. Let's see how it works with an easy example. I wrote this simple X++ class in order to have something to test:
/// 
/// Dummy fluid class for testing purposes
/// 
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);
}
First of all, go to the Visual Studio 2010 instance we all have in our AX 2012 development environments and create a new Test Project. (I've chosen C# but it should work in Visual Basic if that's your preferred choice): AX 2012 X++ Unit Test Add this new project to AOT. By doing so, Visual Studio will add the Interop assembly to the project, allowing us to run our X++ code from this CIL project, automatically creating all needed proxy classes: AX 2012 X++ Unit Test Show the Application Explorer panel so we can see AOT objects from the Visual Studio editor: AX 2012 X++ Unit Test Choose the class (or classes) you want to test and add them to the project. This will automatically create all required proxy classes: AX 2012 X++ Unit Test Now remove the TestMethod1 method in the default class or create your own test classes at your convenience. For instance, for testing the X++ simple class shown above, we can write some test methods like these ones:
[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
	}
}
Finally, we can run our test cases as a regular Visual Studio test project, to be sure our X++ class works as expected: 00500-ax2012-xpp-unittests How cool is that? Isn't it easy? If this is an interesting topic I'll publish more about it, including more complicated and close-to-real scenarios. In the meantime, please feel free to comment or get in touch via twitter! 🙂
Leer Más >>

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:
/// 
/// Dummy fluid class for testing purposes
/// 
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. 🙂
Leer Más >>