Partager via


Procédure pas à pas : utilisation d'une condition de test personnalisée pour vérifier les résultats d'une procédure stockée

Dans cette procédure relative à l'extension de fonctionnalité, vous définirez une condition de test et vérifierez si elle fonctionne en créant un test unitaire de base de données. Cela implique de créer un projet de bibliothèque de classes pour la condition de test, de le signer et de l'enregistrer. Si vous disposez déjà d'une condition de test que vous souhaitez mettre à jour, consultez Comment : mettre à niveau une condition de test personnalisée d'une version antérieure.

Cette procédure pas à pas décrit les tâches suivantes :

  1. Comment créer une condition de test.

  2. Comment signer un assembly avec un nom fort.

  3. Comment ajouter les références nécessaires au projet.

  4. Comment générer une extension de fonctionnalité.

  5. Comment enregistrer la nouvelle extension de fonctionnalité.

  6. Comment tester la nouvelle extension de fonctionnalité.

Composants requis

Pour effectuer cette procédure, il est indispensable d'installer Visual Studio Premium ou Visual Studio Ultimate.

Création d'une condition de test personnalisée

La première étape consiste à créer une bibliothèque de classes.

Pour créer une bibliothèque de classes

  1. Dans le menu Fichier, cliquez sur Nouveau, puis sur Projet.

  2. Dans le volet Types de projets de la boîte de dialogue Nouveau projet, sélectionnez Visual C#.

  3. Sous Modèles, sélectionnez Bibliothèque de classes.

  4. Dans la zone de texte Nom, tapez ColumnCountCondition, puis cliquez sur OK.

Il convient ensuite de signer le projet.

Pour signer le projet

  1. Dans le menu Projet, cliquez sur Propriétés de ColumnCountCondition.

  2. Sous l'onglet Signature, activez la case à cocher Signer l'assembly.

  3. Dans la zone Choisir un fichier de clé de nom fort, cliquez sur <Nouveau...>.

    La boîte de dialogue Créer une clé de nom fort s'affiche.

  4. Dans la zone Nom du fichier de clé, tapez ExempleClé.

  5. Saisissez et confirmez le mot de passe, puis cliquez sur OK.

    Lorsque vous générez votre solution, le fichier de clé est utilisé pour signer l'assembly.

  6. Dans le menu Fichier, cliquez sur Enregistrer tout.

  7. Dans le menu Générer, cliquez sur Générer la solution.

Vous allez, à présent, ajouter les références nécessaires à ce projet.

Pour ajouter les références applicables au projet

  1. Dans l'Explorateur de solutions, sélectionnez le projet ColumnCountCondition.

  2. Dans le menu Projet, cliquez sur Ajouter une référence.

    La boîte de dialogue Ajouter une référence s'ouvre.

  3. Sélectionnez l'onglet .NET.

  4. Dans la colonne Nom du composant, repérez les composants suivants :

    Conseil

    Appuyez sur CTRL tout en cliquant pour sélectionner plusieurs composants.

  5. Cliquez sur OK lorsque vous avez sélectionné tous les composants requis.

    Les références sélectionnées s'afficheront sous le nœud Références du projet dans l'Explorateur de solutions.

Création de la classe ResultSetColumnCountCondition

Changez le nom Class1 et remplacez-le par ResultSetColumnCountCondition, puis dérivez la classe de TestCondition. La classe ResultSetColumnCountCondition est une simple condition de test qui vérifie si le nombre de colonnes retourné dans le jeu de résultats est conforme à ce que vous attendez. Vous pouvez utiliser cette condition pour vous assurer que le contrat relatif à une procédure stockée est correct.

Pour créer une classe de condition de test

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Class1.cs, sélectionnez Renommer dans le menu contextuel et tapez ResultSetColumnCountCondition.cs.

  2. Cliquez sur Oui pour confirmer le changement de nom de toutes les références par Class1.

  3. Ouvrez le fichier ResultSetColumnCountCondition.cs et ajoutez les instructions d'utilisation suivantes au fichier :

    using System;
    using System.Collections.Generic;
    using Microsoft.Data.Schema.UnitTesting;
    using Microsoft.Data.Schema.UnitTesting.Conditions;
    using Microsoft.Data.Schema.Extensibility;
    using System.ComponentModel;
    using System.Data;
    using System.Data.Common;
    using Microsoft.Data.Schema;
    
     
    namespace ColumnCountCondition
    {
        public class ResultSetColumnCountCondition
    
  4. Dérivez la classe de TestCondition:

        public class ResultSetColumnCountCondition : TestCondition
    
  5. Ajoutez l'attribut DatabaseSchemaProviderCompatibilityAttribute. Pour plus d'informations, consultez Générer des données de test spécialisées à l'aide d'un générateur de données personnalisé.

    [DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
       [DatabaseSchemaProviderCompatibility(null)]
        [DisplayName("ResultSet Column Count")]
        public class ResultSetColumnCountCondition : TestCondition
    

    La condition de test possède les deux attributs de compatibilité de sorte que :

    • La condition est chargée lorsque tout fournisseur de schémas de base de données qui hérite de DatabaseSchemaProvider est présent. La situation dans laquelle le concepteur de test unitaire de base de données a un contexte de fournisseur de schémas de base de données est ainsi prise en charge. Si vous souhaitez que votre condition de test soit spécifique à SQL Server, vous pouvez à la place spécifier SqlDatabaseSchemaProvider.

    • La condition de test est chargée lorsqu'il n'y a aucun fournisseur de schémas de base de données. Cela se produit lorsque le test unitaire de base de données charge des extensions sans fournisseur de schémas de base de données.

  6. Ajoutez l'attribut DisplayName :

        [DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
            [DatabaseSchemaProviderCompatibility(null)]
        [DisplayName("ResultSet Column Count")]
        public class ResultSetColumnCountCondition : TestCondition
    
  7. Créez les variables membres :

        {
            private int _resultSet;
            private int _count;
            private int _batch;
     
    
  8. Créez le constructeur :

            public ResultSetColumnCountCondition()
            {
                _resultSet = 1;
                _count = 0;
                _batch = 1;
            }
     
    
  9. Substituez la méthode Assert. La méthode contient des arguments pour IDbConnection, qui représente la connexion à la base de données, et ExecutionResult. La méthode a recours à DataSchemaException pour la gestion des erreurs.

            //method you need to override
            //to perform the condition verification
            public override void Assert(DbConnection validationConnection, ExecutionResult[] results)
            {
                //call base for parameter validation
                base.Assert(validationConnection, results);
     
                //verify batch exists
                if (results.Length < _batch)
                    throw new DataSchemaException(String.Format("Batch {0} does not exist", _batch));
     
                ExecutionResult result = results[_batch - 1];
     
                //verify resultset exists
                if (result.DataSet.Tables.Count < ResultSet)
                    throw new DataSchemaException(String.Format("ResultSet {0} does not exist", ResultSet));
     
                DataTable table = result.DataSet.Tables[ResultSet - 1];
     
                //actual condition verification
                //verify resultset column count matches expected
                if (table.Columns.Count != Count)
                    throw new DataSchemaException(String.Format(
                        "ResultSet {0}: {1} columns did not match the {2} columns expected",
                        ResultSet, table.Columns.Count, Count));
            }
     
    
  10. Ajoutez la méthode suivante qui se substitue à la méthode ToString :

            //this method is called to provide the string shown in the
            //test conditions panel grid describing what the condition tests
            public override string ToString()
            {
                return String.Format(
                    "Condition fails if ResultSet {0} does not contain {1} columns",
                    ResultSet, Count);
            }
     
    
  11. Ajoutez les propriétés de condition de test suivantes à l'aide des attributs CategoryAttribute, DisplayNameAttribute et DescriptionAttribute :

            //below are the test condition properties
            //that are exposed to the user in the property browser
            #region Properties
     
            //property specifying the resultset for which
            //you want to check the column count
            [Category("Test Condition")]
            [DisplayName("ResultSet")]
            [Description("ResultSet Number")]
            public int ResultSet
            {
                get { return _resultSet; }
     
                set
                {
                    //basic validation
                    if (value < 1)
                        throw new ArgumentException("ResultSet cannot be less than 1");
     
                    _resultSet = value;
                }
            }
     
            //property specifying
            //expected column count
            [Category("Test Condition")]
            [DisplayName("Count")]
            [Description("Column Count")]
            public int Count
            {
                get { return _count; }
     
                set
                {
                    //basic validation
                    if (value < 0)
                        throw new ArgumentException("Count cannot be less than 0");
     
                    _count = value;
                }
            }
     
            #endregion
        }
    }
    

Le code final doit s'afficher comme suit :

using System;
using System.Collections.Generic;
using Microsoft.Data.Schema.UnitTesting;
using Microsoft.Data.Schema.UnitTesting.Conditions;
using Microsoft.Data.Schema.Extensibility;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using Microsoft.Data.Schema;

namespace ColumnCountCondition
{
DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
        [DatabaseSchemaProviderCompatibility(null)]

    [DisplayName("ResultSet Column Count")]
    public class ResultSetColumnCountCondition : TestCondition
    {
        private int _resultSet; 
        private int _count; 
        private int _batch; 

        public ResultSetColumnCountCondition()
        {
            _resultSet = 1; 
            _count = 0; 
            _batch = 1; 
        }

        //method you need to override
        //to perform the condition verification
        public override void Assert(DbConnection validationConnection, ExecutionResult[] results) 
        {
            //call base for parameter validation
            base.Assert(validationConnection, results); 

            //verify batch exists
            if (results.Length < _batch) 
                throw new DataException(String.Format("Batch {0} does not exist", _batch)); 

            ExecutionResult result = results[_batch - 1]; 

            //verify resultset exists
            if (result.DataSet.Tables.Count < ResultSet) 
                throw new DataException(String.Format("ResultSet {0} does not exist", ResultSet)); 

            DataTable table = result.DataSet.Tables[ResultSet - 1]; 

            //actual condition verification
            //verify resultset column count matches expected
            if (table.Columns.Count != Count) 
                throw new DataException(String.Format(
                    "ResultSet {0}: {1} columns did not match the {2} columns expected",
                    ResultSet, table.Columns.Count, Count)); 
        }
        //this method is called to provide the string shown in the
        //test conditions panel grid describing what the condition tests
        public override string ToString()
        {
            return String.Format(
                "Condition fails if ResultSet {0} does not contain {1} columns",
                ResultSet, Count); 
        }
         //below are the test condition properties
        //that are exposed to the user in the property browser
        #region Properties

        //property specifying the resultset for which
        //you want to check the column count
        [Category("Test Condition")]
        [DisplayName("ResultSet")]
        [Description("ResultSet Number")]
        public int ResultSet
        {
            get { return _resultSet; }
 
            set
            {
                //basic validation
                if (value < 1) 
                    throw new ArgumentException("ResultSet cannot be less than 1");
 
                _resultSet = value; 
            }
        }
 
        //property specifying
        //expected column count
        [Category("Test Condition")]
        [DisplayName("Count")]
        [Description("Column Count")]
        public int Count
        {
            get { return _count; }
 
            set
            {
                //basic validation
                if (value < 0) 
                    throw new ArgumentException("Count cannot be less than 0");
 
                _count = value; 
            }
        }
 
        #endregion
    }
}

Il est temps à présent de générer le projet.

Pour générer le projet

  • Dans le menu Générer, cliquez sur Générer la solution.

Vous allez, à présent, collecter les informations de l'assembly générées dans le projet, notamment la version, la culture et PublicKeyToken.

Pour collecter des informations de l'assembly

  1. Dans le menu Affichage, cliquez sur Autres fenêtres, puis cliquez sur Fenêtre Commande pour ouvrir la fenêtre Commande.

  2. Dans la fenêtre Commande, tapez le code suivant. Pour FilePath, substituez le chemin d'accès et le nom de votre fichier .dll compilé. Placez le chemin d'accès et le nom de fichier entre guillemets.

    Notes

    Par défaut, le chemin d'accès de votre fichier .dll compilé est CheminVotreSolution\bin\Debug ou CheminVotreSolution\bin\Release.

    ? System.Reflection.Assembly.LoadFrom(@"FilePath").FullName
    
  3. Appuyez sur Entrée. La ligne doit ressembler à ce qui suit avec votre PublicKeyToken spécifique :

    "ColumnCountCondition, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn"
    

    Notez ou copiez les informations de cet assembly, car elles seront utilisées dans la procédure suivante.

Ensuite, vous créez un fichier XML en utilisant les informations d'assembly collectées lors de la procédure précédente.

Pour créer le fichier XML

  1. Dans l'Explorateur de solutions, sélectionnez le projet ColumnCountCondition.

  2. Dans le menu Projet, cliquez sur Ajouter un nouvel élément.

  3. Dans le volet Modèles, recherchez et sélectionnez l'élément Fichier XML.

  4. Dans la zone de texte Nom, tapez ColumnCountCondition.Extensions.xml, puis cliquez sur le bouton Ajouter.

    Le fichier ColumnCountCondition.Extensions.xml est ajouté au projet dans l'Explorateur de solutions.

  5. Ouvrez le fichier ColumnCountCondition.Extensions.xml et mettez-le à jour pour qu'il corresponde au code XML suivant. Remplacez les données (version, culture et PublicKeyToken) que vous avez extraites au cours de la procédure précédente.

    <?xml version="1.0" encoding="utf-8"?>
    <extensions assembly=""
                version="1" xmlns="urn:Microsoft.Data.Schema.Extensions"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="urn:Microsoft.Data.Schema.Extensions Microsoft.Data.Schema.Extensions.xsd">
    
      <extension type="ColumnCountCondition.ResultSetColumnCountCondition" assembly="ColumnCountCondition, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn" enabled="true"/>
    </extensions>
    
  6. Dans le menu Fichier, cliquez sur Enregistrer.

L'étape suivante vous invite à copier les informations de l'assembly et le fichier XML dans le répertoire Extensions. Au démarrage de Visual Studio , celui-ci se charge d'identifier les extensions à l'intérieur du répertoire et des sous-répertoires %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions et de les enregistrer en vue de les utiliser au cours de la session.

Pour copier les informations de l'assembly et le fichier XML dans le répertoire Extensions

  1. Créez un dossier nommé ConditionsPersonnalisées dans le répertoire %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\.

  2. Copiez le fichier assembly ColumnCountCondition.dll du répertoire de sortie, par défaut, Mes documents\Visual Studio 2010\Projects\CustomConditions\CustomConditions\bin\Debug\), vers le répertoire %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ConditionsPersonnalisées que vous avez créé.

  3. Copiez le fichier ColumnCountCondition.Extensions.xml (situé par défaut dans le répertoire Mes documents\Visual Studio 2010\Projects\CustomConditions\CustomConditions\) vers le répertoire %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ConditionsPersonnalisées que vous avez créé.

    Conseil

    Il est recommandé de placer vos assemblys d'extension dans un même dossier au sein du répertoire %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions. Ceci vous aidera à identifier les extensions incluses dans le produit et celles qui correspondent à vos créations personnalisées. Il est également recommandé d'utiliser des dossiers pour organiser vos extensions en catégories spécifiques.

Il convient ensuite de démarrer une nouvelle session Visual Studio et de créer un projet de base de données.

Pour démarrer une nouvelle session Visual Studio et créer un projet de base de données

  1. Démarrez une deuxième session Visual Studio.

  2. Dans le menu Fichier, cliquez sur Nouveau, puis sur Projet.

  3. Dans la boîte de dialogue Nouveau projet, dans la liste Modèles installés, développez le nœud Base de données, puis cliquez sur SQL Server.

  4. Dans le volet d'informations, cliquez sur Projet de base de données SQL Server 2008.

  5. Dans la zone de texte Nom, tapez SampleConditionDB, puis cliquez sur OK.

Préparez-vous maintenant à créer un test unitaire.

Pour créer un test unitaire de base de données à l'intérieur d'une nouvelle classe de test

  1. Dans le menu Test, cliquez sur Nouveau test.

    Notes

    Vous pouvez également ouvrir l'Explorateur de solutions, cliquer avec le bouton droit sur un projet de test, pointer sur Ajouter, puis cliquer sur Nouveau test.

    La boîte de dialogue Ajouter un nouveau test s'affiche.

  2. Dans la liste Modèles, cliquez sur Test unitaire de base de données.

  3. Dans Nom du test, tapez SampleUnitTest.

  4. Dans Ajouter au projet de test, cliquez sur Créer un nouveau projet de test Visual C#.

  5. Cliquez sur OK.

    La boîte de dialogue Nouveau projet de test s'affiche.

  6. Nommez le projet ExempleTestUnitaire.

  7. Cliquez sur Annuler pour créer le test unitaire sans configurer le projet de test en vue d'utiliser une connexion de base de données.

    Notes

    Pour plus d'informations sur la création et la configuration de tests unitaires de base de données avec des connexions de base de données, consultez Comment : créer un test unitaire de base de données vide.

    Votre test vide apparaît dans le Concepteur de test unitaire de base de données. Un fichier de code source Visual C# est ajouté au projet de test.

  8. Cliquez sur Cliquer ici pour créer pour finaliser le test unitaire.

Vérifiez enfin si la nouvelle condition figure bien dans le projet SQL Server.

Pour consulter la nouvelle condition

  1. Dans le Concepteur de test unitaire de base de données, sous Conditions de test, dans la colonne Nom, cliquez sur le test inconclusiveCondition1.

  2. Cliquez sur le bouton Supprimer la condition de test dans la barre d'outils pour retirer le test inconclusiveCondition1.

  3. Cliquez sur la liste déroulante Conditions de test et sélectionnez Nombre de colonnes ResultSet.

  4. Cliquez sur le bouton Ajouter une condition de test dans la barre d'outils pour ajouter votre propre condition de test.

  5. Dans la fenêtre Propriétés, configurez les propriétés Count, Enabled et ResultSet.

    Pour plus d'informations, consultez Comment : ajouter des conditions de test aux tests unitaires de base de données.

Voir aussi

Tâches

Comment : créer des conditions de test pour le concepteur de test unitaire de base de données

Comment : inscrire et gérer des extensions de fonctionnalité

Concepts

Création et définition de tests unitaires de base de données

Autres ressources

Gestion d'assembly et signature de manifeste

Historique des modifications

Date

Historique

Motif

Décembre 2010

Corrections mineures (attributs) apportées au code final, en réponse à des commentaires client.

Commentaires client.