Compartir a través de


Tutorial: Utilizar una condición de prueba personalizada para comprobar los resultados de un procedimiento almacenado

En este tutorial referente a la extensión de características, creará una condición de prueba y comprobará su funcionalidad mediante la creación de una prueba unitaria de base de datos. El proceso incluye la creación, la firma y el registro de un proyecto de biblioteca de clases para la condición de prueba. Si ya tiene una condición de prueba que desea actualizar, vea Cómo: Actualizar una condición de prueba personalizada de una versión anterior.

En este tutorial se muestran las tareas siguientes:

  1. Cómo crear una condición de prueba.

  2. Cómo firmar el ensamblado con un nombre seguro.

  3. Cómo agregar las referencias necesarias al proyecto.

  4. Cómo compilar una extensión de características.

  5. Cómo registrar la nueva extensión de características.

  6. Cómo probar la nueva extensión de características.

Requisitos previos

Para poder completar este tutorial, debe tener instalado Visual Studio Premium o Visual Studio Ultimate.

Crear una condición de prueba personalizada

En primer lugar, creará una biblioteca de clases.

Para crear una biblioteca de clases

  1. En el menú Archivo, haga clic en Nuevo y, a continuación, haga clic en Proyecto.

  2. En el cuadro de diálogo Nuevo proyecto, en Tipos de proyecto, haga clic en Visual C#.

  3. En Plantillas, seleccione Biblioteca de clases.

  4. En el cuadro de texto Nombre, escriba ColumnCountCondition y, a continuación, haga clic en Aceptar.

A continuación, firmará el proyecto.

Para firmar el proyecto

  1. En el menú Proyecto, haga clic en Propiedades de ColumnCountCondition.

  2. En la ficha Firma, active la casilla Firmar el ensamblado.

  3. En el cuadro Elija un archivo de clave de nombre seguro, haga clic en <Nuevo...>.

    Aparecerá el cuadro de diálogo Crear clave de nombre seguro.

  4. En el cuadro Nombre del archivo de clave, escriba SampleKey.

  5. Escriba y confirme una contraseña y, a continuación, haga clic en Aceptar.

    Al generar la solución, se usa el archivo de clave para firmar el ensamblado.

  6. En el menú Archivo, haga clic en Guardar todo.

  7. En el menú Generar, haga clic en Generar solución.

A continuación, agregará las referencias necesarias al proyecto.

Para agregar las referencias aplicables al proyecto

  1. En el Explorador de soluciones, seleccione el proyecto ColumnCountCondition.

  2. Haga clic en la opción Agregar referencia del menú Proyecto.

    Se abrirá el cuadro de diálogo Agregar referencia.

  3. Seleccione la pestaña .NET.

  4. En la columna Nombre de componente, busque los componentes siguientes:

    SugerenciaSugerencia

    Presione CTRL haciendo clic para seleccionar varios componentes.

  5. Haga clic en Aceptar una vez seleccionados todos los componentes necesarios.

    Las referencias seleccionadas aparecerán bajo el nodo Referencias del proyecto en el Explorador de soluciones.

Crear la clase ResultSetColumnCountCondition

A continuación, cambiará el nombre Class1 a ResultSetColumnCountCondition y derivará la clase de TestCondition. La clase ResultSetColumnCountCondition es una condición de prueba simple que comprueba que el número de columnas devueltas en el conjunto de resultados es el número esperado. Puede utilizar esta condición para asegurarse de que el contrato para un procedimiento almacenado es correcto.

Para crear una clase de condición de prueba

  1. En el Explorador de soluciones, haga clic con el botón secundario en Class1.cs, haga clic en Cambiar nombre y escriba ResultSetColumnCountCondition.cs.

  2. Haga clic en para confirmar el cambio de nombre de todas las referencias a Class1.

  3. Abra el archivo ResultSetColumnCountCondition.cs y agregue las siguientes instrucciones using:

    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. Derive la clase de TestCondition:

        public class ResultSetColumnCountCondition : TestCondition
    
  5. Agregue el atributo DatabaseSchemaProviderCompatibilityAttribute. Para obtener más información, vea Generar datos de pruebas especializados con un generador de datos personalizado.

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

    La condición de prueba tiene ambos atributos de compatibilidad de modo que:

    • La condición se carga cuando está presente cualquier proveedor de esquemas de base de datos que herede de DatabaseSchemaProvider. Esto controla la situación cuando el diseñador de prueba unitaria de base de datos tiene un contexto de proveedor de esquemas de base de datos. Si deseara que su condición de prueba fuera específica de SQL Server, podría especificar SqlDatabaseSchemaProvider en su lugar.

    • La condición de prueba se carga cuando no hay proveedor de esquemas de base de datos. Esto ocurre cuando las pruebas unitarias de base de datos cargan extensiones sin un proveedor de esquemas de base de datos.

  6. Agregue el atributo DisplayName:

        [DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
            [DatabaseSchemaProviderCompatibility(null)]
        [DisplayName("ResultSet Column Count")]
        public class ResultSetColumnCountCondition : TestCondition
    
  7. Cree las variables miembro:

        {
            private int _resultSet;
            private int _count;
            private int _batch;
     
    
  8. Cree el constructor:

            public ResultSetColumnCountCondition()
            {
                _resultSet = 1;
                _count = 0;
                _batch = 1;
            }
     
    
  9. Reemplace el método Assert. El método incluye los argumentos de IDbConnection, que representa la conexión a la base de datos, y ExecutionResult. El método utiliza DataSchemaException para el control de errores.

            //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. Agregue el siguiente método, que reemplaza al método 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. Agregue las siguientes propiedades de condición de prueba mediante los atributos CategoryAttribute, DescriptionAttribute y DisplayNameAttribute:

            //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
        }
    }
    

El código final debe aparecer de la siguiente manera:

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
    }
}

A continuación, compilará el proyecto.

Para compilar el proyecto

  • En el menú Generar, haga clic en Generar solución.

A continuación, recopilará la información del ensamblado generada en el proyecto, incluidas la versión, referencia cultural y PublicKeyToken.

Para recopilar información del ensamblado

  1. En el menú Ver, haga clic en Otras ventanas y, a continuación, haga clic en Ventana Comandos para abrir la ventana Comandos.

  2. En la ventana Comando, escriba el código siguiente. En FilePath, sustituya la ruta de acceso y el nombre de archivo por la ruta y el nombre de su archivo .dll compilado. Debe escribir la ruta de acceso y el nombre de archivo entre comillas.

    Nota

    De forma predeterminada, la ruta de acceso del archivo .dll compilado es rutaDeAccesoDeSolución\bin\Debug o rutaDeAccesoDeSolución\bin\Release.

    ? System.Reflection.Assembly.LoadFrom(@"FilePath").FullName
    
  3. Presione Entrar. La línea debe tener un aspecto similar al siguiente con el PublicKeyToken concreto:

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

    Anote o copie esta información de ensamblado; se usará en el procedimiento siguiente.

A continuación, creará un archivo XML utilizando la información del ensamblado que recopiló en el procedimiento anterior.

Para crear el archivo XML

  1. En el Explorador de soluciones, seleccione el proyecto ColumnCountCondition.

  2. En el menú Proyecto, seleccione Agregar nuevo elemento.

  3. En el recuadro Plantillas, busque y seleccione el elemento Archivo XML.

  4. En el cuadro de texto Nombre, escriba ColumnCountCondition.Extensions.xml y haga clic en el botón Agregar.

    Se agrega el archivo ColumnCountCondition.Extensions.xml al proyecto en el Explorador de soluciones.

  5. Abra el archivo ColumnCountCondition.Extensions.xml y actualícelo para que coincida con el XML siguiente. Reemplace la versión, la referencia cultural y PublicKeyToken que recuperó en el procedimiento anterior.

    <?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. Haga clic en la opción Guardar del menú Archivo.

A continuación, copiará la información del ensamblado y el archivo XML en el directorio Extensions. Cuando Visual Studio se inicie, identificará todas las extensiones del directorio %Archivos de programa%\Microsoft Visual Studio 10.0\VSTSDB\Extensions y sus subdirectorios, y las registrará para su uso en la sesión.

Para copiar la información del ensamblado y el archivo XML en el directorio Extensions

  1. Cree una nueva carpeta denominada CustomConditions en el directorio %Archivos de programa%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\.

  2. Copie el archivo de ensamblado ColumnCountCondition.dll del directorio de salida predeterminado Mis documentos\Visual Studio 2010\Projects\CustomConditions\CustomConditions\bin\Debug\) en el directorio %Archivos de programa%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomConditions que creó.

  3. Copie el archivo ColumnCountCondition.Extensions.xml (se encuentra de forma predeterminada en el directorio Mis documentos\Visual Studio 2010\Projects\CustomConditions\CustomConditions\) en el directorio %Archivos de programa%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomConditions que creó.

    SugerenciaSugerencia

    Se recomienda colocar los ensamblados de extensión en una carpeta del directorio %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions. Esto le ayudará a identificar qué extensiones se incluían con el producto, y cuáles son creaciones personalizadas suyas. Se recomienda el uso de carpetas para organizar las extensiones por categorías específicas.

A continuación, iniciará una nueva sesión de Visual Studio y creará un proyecto de base de datos.

Para iniciar una nueva sesión de Visual Studio y crear un proyecto de base de datos

  1. Inicie una segunda sesión de Visual Studio.

  2. En el menú Archivo, haga clic en Nuevo y, a continuación, haga clic en Proyecto.

  3. En el cuadro de diálogo Nuevo proyecto, en la lista de Plantillas instaladas, expanda el nodo Base de datos y, a continuación, haga clic en SQL Server.

  4. En el recuadro de detalles, haga clic en Proyecto de base de datos de SQL Server 2008.

  5. En el cuadro de texto Nombre, escriba SampleConditionDB y, a continuación, haga clic en Aceptar.

A continuación, creará una prueba unitaria.

Para crear una nueva prueba unitaria de base de datos en una nueva clase de prueba

  1. En el menú Prueba, haga clic en Nueva prueba.

    Nota

    Asimismo, puede abrir el Explorador de soluciones, hacer clic con el botón secundario en un proyecto de prueba, elegir Agregar y, a continuación, hacer clic en Nueva prueba.

    Aparecerá el cuadro de diálogo Agregar nueva prueba.

  2. En la lista Plantillas, haga clic en Prueba unitaria de base de datos.

  3. En Nombre de la prueba, escriba SampleUnitTest.

  4. En Agregar a proyecto de prueba, haga clic en Crear un nuevo proyecto de prueba de Visual C#.

  5. Haga clic en Aceptar.

    Aparecerá el cuadro de diálogo Nuevo proyecto de prueba.

  6. Escriba SampleUnitTest como nombre del proyecto.

  7. Haga clic en Cancelar para crear la prueba unitaria sin configurar el proyecto de prueba para que use una conexión de base de datos.

    Nota

    Para obtener más información sobre cómo crear y configurar pruebas unitarias de base de datos con conexiones de base de datos, vea Cómo: Crear una prueba unitaria de base de datos vacía.

    La prueba en blanco aparece en el Diseñador de pruebas unitarias de base de datos. Se agrega un archivo de código fuente de Visual C# al proyecto de prueba.

  8. Haga clic en Haga clic aquí para crear para finalizar la creación de la prueba unitaria.

Finalmente, verá la nueva condición en el proyecto de SQL Server.

Para ver la nueva condición

  1. En el Diseñador de pruebas unitarias de base de datos, bajo Condiciones de prueba, bajo la columna Nombre, haga clic en la prueba inconclusiveCondition1.

  2. Haga clic en el botón Eliminar condición de prueba de la barra de herramientas para quitar la prueba inconclusiveCondition1.

  3. Haga clic en la lista desplegable Condiciones de prueba y seleccione ResultSet Column Count.

  4. Haga clic en el botón Agregar condición de prueba de la barra de herramientas para agregar la condición de prueba personalizada.

  5. En la ventana Propiedades, configure las propiedades Count, Enabled y ResultSet.

    Para obtener más información, vea Cómo: Agregar condiciones de prueba a pruebas unitarias de base de datos.

Vea también

Tareas

Cómo: Crear condiciones de prueba para el Diseñador de pruebas unitarias de base de datos

Cómo: Registrar y administrar las extensiones de características

Conceptos

Crear y definir pruebas unitarias de base de datos

Otros recursos

Administrar la firma de ensamblados y manifiestos

Historial de cambios

Fecha

Historial

Motivo

Diciembre de 2010

Se realizaron pequeñas correcciones (atributos) en el código final para resolver problemas identificados por los clientes.

Comentarios de los clientes.