Trucos para probar unitariamente nuestros componentes de pipeline para BizTalk Server

Es una práctica común entre los desarrolladores de BizTalk Server crear componentes de pipelines específicos con el objetivo de personalizar el tratamiento de los mensajes recibidos y/o enviados a través del motor de mensajería de BizTalk Server, pero ¿Qué sueles hacer para probarlos?

En el SDK puedes encontrar herramientas de consolas como Pipeline.exe,  FFAsm.exe, XmlAsm.exe, etc.("C:\Program Files\Microsoft BizTalk Server 2006\SDK\Utilities\PipelineTools"). Cuando queremos comprobar el mensaje resultante pueden ser de mucha utilidad.

La otra opción es desplegar los pipelines en BizTalk Server y probarlos directamente en el servidor. Y ¿si queremos depurar? entonces la cosa se complica porque tenemos que abrir el proyecto en Visual Studio y adjuntarse al proceso de BizTalk (BTSNTSvc.exe).

Personalmente me gusta probar unitariamente mis componentes sin necesidad de desplegarlos en el servidor; simplificando en todo lo posible las tareas a realizar y el tiempo empleado en ello, además como es lógico, posibilitando que estas pruebas se puedan repetir de forma más o menos automática para garantizar que durante el avance del desarrollo algo deje de funcionar sin darme cuenta.

Te recomiendo que pruebes (valga la redundancia) la herramienta " Pipeline Testing " que ha publicado Tomas Restrepo en su blog . Se trata de una utilidad que nos ayudará a probar unitariamente nuestros componentes personalizados de Pipeline sin tener que desplegarlos en el servidor de BizTalk y facilitando la depuración de estos.

Su uso es muy sencillo, y se puede resumir en 4 pasos:

1) Referenciar

  • La librería de Tomas: Winterdom.BizTalk.PipelineTesting.dll
  • El proyecto o proyectos que contiene el pipeline a probar, así como los artefactos necesarios (por ejemplo, los esquemas)
  • Opcionalmente, tu framework de pruebas unitarias favorito: nUnit o las incluidas Visual Studio

2) Importar los namespaces

using NUnit.Framework;
using Winterdom.BizTalk.PipelineTesting;
using Winterdom.BizTalk.PipelineTesting.Simple; 

3) Un poco de código

SendPipelineWrapper pipeline = PipelineFactory.CreateSendPipeline(typeof(MiProyecto.Pipelines.MiPipelineSalida));
pipeline.AddDocSpec(typeof (MiProyecto.Esquemas.MiEsquema));
Stream stream = DocLoader.LoadStream("MiInstancia.xml");
IBaseMessage inputMessage = MessageHelper.CreateFromStream(stream);
MessageCollection msgCollection = new MessageCollection();
msgCollection.Add(inputMessage);
IBaseMessage outputMessage = pipeline.Execute(msgCollection);

4) y a probar :)