Publié mardi 26 février 2008 00:29 par Etienne Margraff

Filtrer les requêtes d’un test web

Lorsqu'on créé un test web, il y a parfois des requêtes qui font partie de l'application en production et qu'on aimerait ne pas exécuter lors d'un test. C'est par exemple le cas des pages de partenaires, des pages de publicités, etc.

Pour éviter cela, on créé en général le test et on passe ensuite en revue l'ensemble des requêtes de celui-ci pour supprimer le superflu.

Dans ma quête perpétuelle de simplification de ma vie quotidienne, je me suis dis qu'on pouvait faire plus simple et surtout moins manuel. La solution que je vous propose est de créer un plugin de test web pour intercepter les requêtes indésirables et ne pas les exécuter.

La création d'un plugin de test web est très simple. Il suffit de créer une classe qui dérive de Microsoft.VisualStudio.TestTools.WebTesting.WebTestPlugin.

On a alors la possibilité d'interagir à plusieurs moments de l'exécution d'un test :

  • Avant et après l'exécution du test (redéfinir les méthodes PreWebTest et PostWebTest)
  • Avant et après l'exécution de chaque requête du test (redéfinir les méthodes PreRequest et PostRequest)

Une fois ces méthodes redéfinies, on créé une instance du plugin de test dans le test qui doit l'utiliser et on abonne une ou plusieurs de ces méthodes aux événements correspondant dans ce dernier.

Commençons par créer le squelette de notre plugin de test (de préférence dans une belle librairie de classes, pour pouvoir la réutiliser facilement dans toutes nos solutions de tests).

using Microsoft.VisualStudio.TestTools.WebTesting;

public class WebTestFilterPlugin : WebTestPlugin

{

   public override void PreRequest(object sender, PreRequestEventArgs e)

   {

//Here will be the filtering code base.PreRequest(sender, e);

   }

}

Pour ce plugin, nous avons besoin d'interagir avant chaque requête, nous avons donc besoin de ne redéfinir que la méthode PreRequest.

La classe PreRequestEventArgs offre un certain nombre de moyen d'intervenir sur la requête qui est sur le point de s'exécuter. On peut modifier la méthode HTTP utilisée, le thinktime simulé, le temps d'exécution avant de lever un timeout, etc. Ce qui nous intéresse pour notre filtre est la propriété Instruction. C'est une énumération qui permet d'indiquer si on doit exécuter ou abandonner la requête.

Voici la version complète du plugin :

public class WebTestFilterPlugin : WebTestPlugin

{

   private List<string> _filters = new List<string>();

   public List<string> Filters

   {

get { return this._filters; }

set { this._filters = value; }

}

 

   public override void PreRequest(object sender, PreRequestEventArgs e)

   {

foreach (string filter in this.Filters)

{

if (e.Request.Url.Contains(filter))

{

           e.WebTest.AddCommentToResult(string.Format("Request {0} has been skipped", e.Request.Url));       

         //Skip the request

e.Instruction = WebTestExecutionInstruction.Skip;

}

}

base.PreRequest(sender, e);

      }

}

Le fonctionnement du plugin est très simple. Il possède une liste de chaînes de caractères et annule l'exécution des requêtes dont l'url contient un des filtres.

L'utilisation dans un test web est la suivante :

using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.VisualStudio.TestTools.WebTesting;

using Microsoft.VisualStudio.TestTools.WebTesting.Rules;

using WebTestPlugins; //The plugin library we created

 

public class FilterPluginDemoCoded : WebTest

{

   private WebTestFilterPlugin filterplugin = new WebTestFilterPlugin();

 

   public FilterPluginDemoCoded()

   {

this.PreAuthenticate = true;

 

//Register the plugin to the web test event(s)

this.PreRequest += new EventHandler<PreRequestEventArgs>(filterplugin.PreRequest);

      filterplugin.Filters.Add("prodserver");

   }

 

   public override IEnumerator<WebTestRequest> GetRequestEnumerator()

   {

      WebTestRequest request1 = new WebTestRequest("http://prodserver/index.html");

yield return request1;

request1 = null;

 

WebTestRequest request1 = new WebTestRequest("http://testserver/index.html");

yield return request1;

request1 = null;

   }

}

Vous l'avez deviné, ici seule la requête http://testserver/index.html sera exécutée.

On peut ensuite imaginer plusieurs améliorations, comme par exemple ne filtrer que sur les noms de domaines plutôt que sur l'intégralité de l'url ou encore de permettre l'utilisation d'expressions régulières.

Pour plus d'informations sur les plugins de test web et sur les tests dans Visual Studio en général, je vous invite à consulter la documentation de la MSDN : http://msdn2.microsoft.com/en-us/library/ms182409(VS.80).aspx

Edit : Désolé pour la mise en page bizzare pour le code, j'ai voulu tester la fonction publish de Word 2007 et on dirait bien que je ne maîtrise pas encore toutes les subtilités ;-)

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Les 10 derniers blogs postés

- [SharePoint] Les sessions TechDays 2012… par Le blog de Patrick [MVP SharePoint] le il y a 5 heures et 35 minutes

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le 02-09-2012, 11:01

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le 02-09-2012, 08:28

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59