Schemas XML et tests unitaires

Florian CAILLAUD
Publié par Florian CAILLAUD
Catégorie : BizTalk
13/04/2018

Lors d’un développement BizTalk, la création de schémas XML est quasiment inévitable. Une fois le schéma construit, il est de bonne pratique de le valider (en utilisant les fonctionnalités « Validate Schema » et « Validate Instance »). Cette vérification, plus qu’utile, est alors réalisée ponctuellement. Mais cela semble assez compliqué de garantir, de cette matière, la validité et/ou la non régression de l’ensemble des schémas de plusieurs projets BizTalk.

Afin de contrôler la validité des différents schémas, il est possible de les tester unitairement au sein d’un projet de tests unitaires. Pour cela, nous allons créer, dans un premier temps, un projet BizTalk contenant un schéma XML :

 

unit test xml schema projet

 

Il faut, ensuite, aller dans les propriétés du projet BizTalk pour mettre à « True » l’option « Enable Unit Testing ».

 

unit test xml schema proprietes

 

Cette action aura pour effet de faire hériter les différents schémas du projet de la classe Microsoft.BizTalk.TestTools.Schema.TestableSchemaBase qui elle-même hérite de Microsoft.XLANGs.BaseTypes.SchemaBase (donc on conserve bien toutes les propriétés initiales d’un schéma XML).

Il est possible de vérifier le changement d’héritage en ouvrant le fichier C# associé au schéma.

 

unit test xml schema vue code

 

Une des limites de cette approche est que l’assembly Microsoft.BizTalk.TestTools n’est pas présente nativement sur la version Production de BizTalk Server. Il existe alors 2 solutions :

  • Soit ajouter cette assembly sur son environnement de production ;
  • Soit définir un profil Debug (avec l’option « Enable Unit Testing» à « True »), et un profil Release (avec l’option à « False »).

La deuxième solution étant, à mon sens, plus propre que la première.

Dans un deuxième temps, et pour faciliter la mise en place des tests unitaires, nous allons créer une classe SchemaValidator (dans un autre projet). Cette classe aura pour but de fournir la méthode statique « Validate ». Cette dernière retournera « True » si le fichier (dont le chemin est donné en paramètre) est valide du point de vue du schéma (donné également en paramètre).

 

unit test xml schema validateur

 

using System;
using Microsoft.XLANGs.BaseTypes;
using Microsoft.BizTalk.TestTools.Schema;
using System.Xml;
using System.Xml.Schema;

namespace SchemaValidationHelpers
{

public class SchemaValidator
{

public static bool Validate(string xmlPath, SchemaBase schema, OutputInstanceType schemaType, out string errorMessage)
{

string err = String.Empty;

//Validation settings Initialisation
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas = schema.SchemaSet;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += new ValidationEventHandler((s, a) =>
{
if (a.Severity == XmlSeverityType.Warning)
err += « \n\tValidation warning:  » + a.Message;
else
err += « \n\tValidation error:  » + a.Message;
});

// Create the XmlReader object.
XmlReader reader = XmlReader.Create(xmlPath, settings);

// Parse the file.
while (reader.Read()) ;

errorMessage = err;

return String.IsNullOrEmpty(errorMessage);

}

}

}

 

Enfin, nous créons un projet de tests unitaires. Celui-ci référence les 2 premiers projets et contient cette classe :

 

namespace UnitTestProject
{

[TestClass]
public class UnitTestExample
{

[TestMethod]
public void Validate_AdressSchema_FirstMethod()
{

Address schema = new Address();
string strSourceXML = @ »..\..\Sample\testAdress1.xml »;

bool result = schema.ValidateInstance(strSourceXML, OutputInstanceType.XML);
Assert.IsTrue(result);

}

[TestMethod]
public void Validate_AdressSchema_SecondMethod()
{

Address schema = new Address();
string strSourceXML = @ »..\..\Sample\testAddress1.xml »;
string errorMessage = String.Empty;

//Second Method
bool result = SchemaValidator.Validate(strSourceXML, schema, OutputInstanceType.XML, out errorMessage);
Assert.IsTrue(result, errorMessage);

}

}

}

 

Cette classe de test permet de valider un fichier XML de 2 façons différentes. La première utilise la méthode ValidateInstance de TestableSchemaBase. Malheureusement, en cas d’erreur, il n’est pas possible d’obtenir d’informations supplémentaires. Il faudra donc repasser par la fonctionnalité Visual Studio « Validate Instance » pour en savoir plus. (Cette façon de faire n’utilise pas la classe Helper décrite plus haut)

La deuxième approche utilise la classe Helper et sa méthode « Validate ». L’avantage est qu’il est possible de récupérer l’ensemble des erreurs (et des warnings selon les XmlReaderSettings utilisés).

Avec ces éléments, il est possible de mettre en place assez simplement des tests unitaires liés aux schémas XML. Ainsi, la validité et la non régression des différents schémas peuvent être assurées tout au long des développements.