Team Test - méthodes d’accès aux sources de données

by Louis-Guillaume Morand 13. septembre 2010 05:16

L’une des grandes forces des tests de charges réalisés à l’aide de Visual Studio Team Test est d’être paramétrables via des sources de données. Qu’il s’agisse de l’URL d’une requête, de paramètres GET/POST ou bien même d’un fichier à uploader, chaque donnée peut être rendue dynamique à chaque exécution du test simplement en définissant une (ou plusieurs) source de données. Pour cela, rien de bien compliqué, un simple clic droit sur votre Web Test > Ajouter une source de données et il ne vous reste plus qu’à choisir parmi une source de données SQL, un fichier CSV ou bien un fichier XML.

datasource1

Cette source de données sera donc liée à votre test qu’il soit exécuté de façon unitaire ou bien de façon groupée lors d’un test de charge. La chose intéressante est qu’il est possible de paramétrer la façon dont cette source de données sera utilisée. Il existe quatre méthodes d’accès telles qu’affichées sur la capture suivante:

datasource3[5]

Chacune d’entre elle va permettre d’agir différemment à chaque itération du test web.

Do Not Move Cursos Automatically: (nouveauté de Visual Studio 2010). Comme son nom l’indique le curseur ne change pas d’enregistrement automatiquement et reste sur la première ligne. C’est au développeur d’appeler la méthode pour passer à l’enregistrement suivant de façon explicite

Random: Comme son nom l’indique, chaque accès retourne un enregistrement de façon aléatoire.

Sequential: Ici, la source de données est accédée de façon séquentielle ce qui signifie que chaque fois que la source de données est appelée, c’est l’enregistrement suivant qui est retourné. Une fois le curseur arrivé au bout des enregistrements, il repart du premier enregistrement et ainsi de suite jusqu’à ce que le test de charge s’arrête.

Unique: Cette option une version séquentielle avancée qui garantit que chaque enregistrement ne sera utilisé qu’une seule fois. Le fonctionnement est identique à l’accès séquentiel mais une fois au bout des enregistrements, le test s’arrête. Très utile pour les processus de création utilisant des ID uniques par exemple.

Ces options marchent de la même façon lorsque vous utilisez plusieurs agents. Pour Random et Sequential, chaque agent se reçoit une copie propre de la source de données (déployée automatiquement) mais pour Unique, la source est déployée tout en garantissant que chaque enregistrement ne soit utilisée qu’une seule fois quelque soit le nombre d’agents.

Ces options sont bien utiles mais ne répondront pas à tous les cas de figures dont vous pourriez avoir besoin. Ainsi, il m’est arrivé de rencontrer le cas où chaque source de données pouvait être utilisée de façon séquentielle mais tout en garantissant qu’à un moment donné, l’enregistrement ne puisse pas être utilisé plusieurs fois (il s’agissait de credentials de session qui devait être unique à un moment T). Pour cela, il me fallut utiliser la notion de drapeau (flag) pour indiquer qu’un enregistrement était utilisé à ce moment. Dans le cas où la donnée était utilisée, je passais à l’enregistrement suivant.

Un autre cas de figure, dont parle Sean Lumley sur son blog, est le cas où vous voulez que vos donnés soient partitionnées de façon égale entre vos agents, chacun ayant son “sac” de données propre. Ici, la solution consiste à gérer soit-même l’appel aux données et ne retourner que les lignes qui concerne l’agent en cours, principalement grâce à une petite formule mathématique utilisant un modulo. Vous placez le tout dans un Web Plugin que appelez en début de test unitaire et le tour est joué.

Voici le code de Sean pour résoudre cette problématique

using Microsoft.VisualStudio.TestTools.WebTesting;
namespace Example
{
    public class DatasourcePlugin : WebTestPlugin
    {
        static int counter = 0;        
 

        public override void PreWebTest(object sender, PreWebTestEventArgs e)
        {
            while ((counter++ % e.WebTest.Context.AgentCount) != (e.WebTest.Context.AgentId - 1))
            {
                e.WebTest.MoveDataTableCursor("DatasourceName", "TableName");
            }
        }
    }
}

Cette le sensiblement le même principe que vous appliquerez avec l’option Do Not Move Cursor Automatically, en appelant la méthode MoveDataTableCursor(). Bien entendu les deux chaines DataSourceName et TableName sont à éditer en fonction des noms que vous avez donné aux données que vous souhaitez remonter.

Pour créer un Web Plugin, un petit tutoriel se trouve sur la MSDN.

Bien sûr vous trouverez d’autres cas où il vous faudra ruser pour simuler vos tests comme il se doit mais le modèle de test donne suffisamment de liberté pour que toute chose soit possible.

Si vous avez des astuces à partager, je

Tags:

Team test | Visual Studio

Visual Studio Team Test et Fiddler

by Louis-Guillaume Morand 11. septembre 2010 22:33

L’astuce peut sembler de moindre importance mais elle n’est généralement connue que si quelqu’un vous l’a transmise et surtout, elle peut sous sauver la vie  notamment pour la réalisation de vos webtests.

Pour rappel, nous avons d’un côté Visual Studio Team Test, qui permet de réaliser différents types de tests sur vos applications, dont notamment des tests de charge pour vos applications Web. Or, pour réaliser un test de charge, il convient de définir un scénario (durée, nombre d’utilisateur, paramètres de réseau, etc.) qui contient un jeu de tests à dérouler. Ces tests peuvent être soit codés (en C# par exemple), soit être des webtests. Ces derniers sont généralement enregistrés à l’aide de l’outil Web Test Recorder, outil qui s’insert au sein d’Internet Explorer pour enregistrer les actions (plus exactement les requêtes) que vous effectuez lors de l’utilisation du site Web à tester. Web Test Recorder peut être ainsi vu comme un sniffer HTTP mais malheureusement, celui-ci a des limites. Notamment, il a de grosses difficultés à détecter tous les paramètres des requêtes Web comme par exemple l’upload de fichier.

A l’inverse, Fiddler est le sniffer HTTP par excellence pour qui rien n’échappe et qui est capable de rejouer un jeu de requêtes pour simuler les actions réalisées sur un site Web y compris l’upload de fichier.

Là où je veux en venir c’est que Fiddler est capable d’exporter les requêtes enregistrées pour en faire un webtest au format Visual Studio. Il est ainsi possible de faire des tests que même Visual Studio n’est pas capable de réaliser de par ses limitations.

Pour cela, rien de plus simple, une fois votre capture effectuée, cliquez sur le menu File > export sessions

fiddler2

Puis sélectionnez le format d’export et le chemin.

fiddler1

Il ne vous reste plus qu’à insérer le webtest dans votre projet Visual Studio et le tour est joué!

/!\ à plusieurs reprises, notamment avec l’upload de certains fichiers (PDF entre autres), les captures Fiddler sont fonctionnelles et rejouables mais l’export produit un webtest corrompu, principalement parce que l’export ne respecte pas l’encodage de base (ou alors parce que Visual Studio n’est pas capable d’afficher le bon encodage dans son éditeur et la compilation en devient bloquée).

Tags:

Microsoft | Visual Studio

The load test results repository is out of space

by lgmorand 5. septembre 2010 01:25

Si jamais vous avez l’habitude de mettre en place une plateforme de test de charge et que vous avez industrialisé ces tests pour les faire tourner à chaque nouvelle version d’une application, vous êtes peut-être déjà tombé sur l’erreur indiquant que la base de données stockant les résultats de test de charge est pleine: “Error occurred running test. Result collection stopped due to the following error: The load test results repository is out  of space”.

Deux solutions s’offrent alors à vous:

  • le nettoyage par le vide
  • le nettoyage sélectif

Solution 1: le nettoyage  par le vide.

Le principe n’est pas réellement de tout supprimer mais de jeter tous les résultats de campagne ayant plus de N jours. Avec cette solution, nous gagnons “rapidement” beaucoup de place dans notre base de données pour ne garder que les toutes dernières campagnes. Cette solution se fait tout simplement par l’exécution d’un script SQL que vous trouverez un peu partout sur le net (notamment sur le blog de Bill Barnett) et qui peut être personnalisé sur le nombre de jours de résultats à gagner.

 

-- This script deletes all load test run older than two weeks
-- To change the timeframe, change the number of days from 14 to the desired number

USE LoadTest
DECLARE @LoadTestRunId int
DECLARE OldLoadTestsCursor CURSOR FOR
    SELECT LoadTestRunId FROM LoadTestRun WHERE datediff(dd, StartTime, getdate()) > 14

OPEN OldLoadTestsCursor
FETCH NEXT FROM OldLoadTestsCursor INTO @LoadTestRunId

WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC Prc_DeleteLoadTestRun @LoadTestRunId
    FETCH NEXT FROM OldLoadTestsCursor INTO @LoadTestRunId
END

CLOSE OldLoadTestsCursor
DEALLOCATE OldLoadTestsCursor

/!\ A noter que ce script est très lent et peut prendre plusieurs heures!

Solution 2: le nettoyage sélectif

Si la première solution permet de répondre à un gain de place, elle a pour problématique majeure de ne pas permettre de la sélection des éléments que l’on supprime. La seule chose qu’il nous faudrait c’est donc une simple IHM permettant de visualiser les résultats de campagnes et pourquoi gérer certains d’entre eux pour soit les supprimer, soit les exporter.

Et par le plus grand des hasards, c’est exactement ce que nous propose Visual Studio! Puis y accéder, ouvrez un test de charge (fichier loadtest) et à l’aide du bouton droit, choisissez Open and Manage Results dans le menu contextuel.

cleanDb2

Une fenêtre s’ouvre à vous permettant de filtrer tout d’abord par contrôleur (si vous en avez un), puis par test de charge. Ceci vous affiche alors toutes les campagnes terminées ou non, et vous permet d’agir sur chacune d’entre elles. Dans notre cas il suffit de sélectionner les campagnes à supprimer (ctrl + clic) puis de cliquer sur Remove. Comme le script plus haut, plus la campagne a enregistré d’information, plus la suppression est longue.

cleanDb1

 

Ce process est encore plus lent que la première solution mais permet réellement de ne garder que ce que l’on souhaite.

Ces deux solutions permettent de corriger de façon temporaire notre problème de place disponible mais si vous voulez exécuter des campagnes de façon pérenne et éviter que l’erreur ne se déclenche en plein de milieu de campagne (vous obligeant à recommencer de zéro), pensez à revoir le sizing de la base de données. Par défaut, Visual Studio s’installe avec SQL Express qui limite la taille des bases de données à 4Go. Envisagez-donc d’utiliser SQL Server.

Tags:

Visual Studio | Team test

Mettre en place du code coverage avec Visual Studio 2010

by Louis-Guillaume Morand 8. juin 2010 09:02

Lors d'un bon cycle ALM, il est important de s'intéresser à la couverture de code pour voir si notre stratégie de tests est bien configurée et si l'on se protège d'éventuels bugs qui auraient pu être détéctés au plus tôt.

C'est donc cette optique que certains de mes projets persos ont été inclus au sein de mon serveur TFS pour passer en intégration continue. Si tout se passait merveillement bien sur le serveur TFS (compilation, testing, coverage), il n'en n'était pas la même chose en local sur mon poste de développement. En effet, l'onglet Code Coverage m'indiquait un magnifique "Cannot find any coverage data (.coverage or .coveragexml) files."

la première raison fut que je n'avais pas configuré le code coverage pour mon projet. Pour cela, quelques étapes sont nécessaires:

1- Double-cliquez sur le fichier Local.testsettings situé au niveau de votre solution. (ou créez-le s'il est manquant)

2- Dans la partie gauche, cliquez "Data and diagnostics"

3- Cochez la case "Code Coverage"

4- Cliquez une fois sur la ligne Code Coverage afin d'activer le bouton "Configure" situé au dessus de la liste

5- Cliquez alors sur le bouton "Configure" afin d'ouvrir la liste des assemblies à tester

6- Cochez les assemblies de votre choix. Fermer tout en sauvegardant votre projet

7- Lancez les tests unitaires via le menu Test > Run > Tests in Current Context

8- Les résultats apparaissent alors dans la fenêtre Test > Windows > Code Coverage Results

 

SAUF QUE, parfois cela ne suffit pas et le message indiquant qu'aucun fichier de coverage n'est présent est toujours affiché. Et c'est là le problème car Visual Studio n'est alors d'aucune aide pour trouver l'origine du problème. L'indice se trouve en effet dans le journal des événements. Au sein de ce dernier, plusieurs erreurs liées à Visual dont une avec un message intriguant "The web.config file for the site http://localhost:0/ contains information from a previous run" et une seconde indiquant que l'accès au fichier web.config est refusé. Pour ce dernier, rien de plus simple, il suffit d'enlever le mode read-only du fichier mais pour le second, il faut enquêter.

Il semblerait que lors de l'ajout du projet à TFS, certains attributs soient ajoutés au fichier de configuration et que ceux-ci dérangent Visual Studio. Solution simple: les retirer.

il s'agit des lignes suivantes:

<appSettings>
   
<add key="microsoft.visualstudio.teamsystems.aspnetdevserver:/" value="3311;True;3204;1" />
   
<add key="microsoft.visualstudio.teamsystems.backupinfo" value="1;web.config.backup" />
</appSettings>

 

Supprimez-les donc, sauvegardez et relancez les tests unitaires

 

Et voilà, le code coverage est pleinement fonctionnel!!!

 

 

Tags: , , , ,

.Net | Visual Studio

Toutes les nouveautés de Visual Studio 2010

by Louis-Guillaume Morand 5. novembre 2009 03:22

Ca fait un moment que je fais mumuz avec VS 2010 beta 1 puis maintenant beta 2 (avec parfois de mauvaises surprises) mais il n'en reste pas que l'éditeur est vraiment une tuerie. Quand me remémore mon utilisation de Visual Studio 6 (pas si vieux pourtant), je vois que bien des choses ont changé.

Quoi qu'il en soit, cette nouvelle mouture de l'éditeur apporte un très grand nombre de nouveautés et deux potes, Jérome Lambert et Philippe Vialiatte ont rédigé un article quasi exhaustif sur les nouveautés de Visual Studio 2010.

 

Je vous encourage à le lire, c'est par ici

Tags:

Visual Studio

Theme creator pour Visual Studio

by Louis-Guillaume Morand 3. octobre 2009 07:11

S'il y a bien une chose que l'on ne peut discuter, c'est bien les goûts et les couleurs, et en parlant de couleurs, nous parlerons ici des couleurs de l'éditeur de code de Visual Studio.

Je pense qu'une majorité des développeurs utilisent les couleurs par défaut de Visual Studio, et certains doivent peut-être changer deux trois paramètres, simplement pour retrouver les habitudes qu'ils auraient eu avec un autre éditeur. Les rares personnes (dont moi) qui ont essayé de pousser la personnalisation un peu plus loin, se sont souvent mordu les dents en obtenant un résultat soit non esthétique, soit tout simplement à l'origine de magnifique migraines.

 

Aujourd'hui, je vous partage un petit outil que j'avais déjà trouvé il y a de cela plusieurs mois et qui se propose de générer en un seul clic des thèmes entiers de couleurs complémentaires.

Cet outil en ligne et gratuit se trouve à l'adresse suivante: Visual Studio Theme Generator

Voici le résultat d'un thème de base. On aime ou on aime pas mais personnellement, je m'y suis habitué rapidement, et je trouve ce thème moins fatiguant pour les yeux qu'un thème à fond blanc.

 

Libre à vous d'essayer :)

Tags: , ,

Visual Studio

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen