Procedura dettagliata: Utilizzo di una condizione di test personalizzata per verificare i risultati di una stored procedure
In questa procedura dettagliata dell'estensione di funzionalità verrà creata una condizione di test di cui ne verrà verificata la funzionalità tramite la creazione di uno unit test di SQL Server.Il processo include la creazione di un progetto libreria di classi per la condizione di test, nonché la firma e l'installazione della condizione di test.Se si dispone di una condizione di test da aggiornare, vedere l'argomento Procedura: Aggiornare una condizione di test personalizzata di Visual Studio 2010 da una versione precedente a SQL Server Data Tools.
Vengono illustrate le attività seguenti:
Creazione di una condizione di test.
Firma dell'assembly con un nome sicuro.
Aggiunta dei riferimenti necessari al progetto.
Compilazione di una condizione di test.
Installazione della nuova condizione di test.
Test della nuova condizione di test.
Per completare questa procedura dettagliata è necessario Visual Studio 2010 o Visual Studio 2012 con l'ultima versione di SQL Server Data Tools.Per ulteriori informazioni, vedere Installare SQL Server Data Tools.
Creazione di una condizione di test personalizzata
Creare per prima cosa una libreria di classi.
Nel menu File fare clic su Nuovo e scegliere Progetto.
Nella finestra di dialogo Nuovo progetto fare clic su Visual C# in Tipi di progetto.
In Modelli selezionare Libreria di classi.
Nella casella di testo Nome digitare ColumnCountCondition e fare clic su OK.
Nella prossima esercitazione verrà illustrato come firmare il progetto.
Scegliere Proprietà di ColumnCountCondition dal menu Progetto.
Nella scheda Firma, selezionare la casella di controllo Firma assembly.
Nella casella Scegli un file chiave con nome sicuro fare clic su <Nuovo...>.
Verrà visualizzata la finestra di dialogo Crea chiave con nome sicuro.
Nella casella Nome file di chiave digitare SampleKey.
Digitare e confermare una password, quindi fare clic su OK.Quando si compila la soluzione, il file di chiave viene utilizzato per firmare l'assembly.
Scegliere Salva tutti dal menu File.
Scegliere Compila soluzione dal menu Compila.
Nella prossima esercitazione verrà illustrato come aggiungere i riferimenti necessari al progetto.
In Esplora soluzioni selezionare il progetto ColumnCountCondition.
Scegliere Aggiungi riferimento dal menu Progetto per visualizzare la finestra di dialogo Aggiungi riferimento.
Fare clic sulla scheda .NET.
Nella colonna Nome componente individuare e selezionare il componente System.ComponentModel.Composition.Fare clic su OK dopo aver selezionato il componente.
Aggiungere i riferimenti di assembly necessari.Fare clic con il pulsante destro del mouse sul nodo del progetto e scegliere Aggiungi riferimento.Fare clic su Sfoglia e passare alla cartella C:\Programmi (x86)\MicrosoftSQL Server\110\DAC\Bin.Scegliere Microsoft.Data.Tools.Schema.Sql.dll e fare clic su Aggiungi, quindi fare clic su OK.
Scegliere Scarica progetto dal menu Progetto.
Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e scegliere Modifica .csproj.
Aggiungere la seguente istruzione Import dopo l'importazione di Microsoft.CSharp.targets:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\SSDT\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="'$(VisualStudioVersion)' == ''" /> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="'$(VisualStudioVersion)' != ''" />
Salvare il file e chiuderlo.Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e scegliere Ricarica progetto.
I riferimenti necessari vengono visualizzati sotto il nodo Riferimenti del progetto in Esplora soluzioni.
Creazione della classe ResultSetColumnCountCondition
A questo punto, si rinomina Class1 in ResultSetColumnCountCondition e lo si fa derivare da TestCondition.La classe ResultSetColumnCountCondition è una condizione di test semplice che verifica il numero delle colonne restituite in ResultSet.È possibile utilizzare questa condizione per essere certi che il contratto per una stored procedure sia corretto.
In Esplora soluzioni fare clic con il pulsante destro del mouse su Class1.cs, scegliere Rinomina e digitare ResultSetColumnCountCondition.cs.
Fare clic su Sì e confermare la volontà di rinominare tutti i riferimenti a Class1.
Aprire il file ResultSetColumnCountCondition.cs e aggiungere al file le istruzioni Using seguenti:
using System; using System.ComponentModel; using System.Data; using System.Data.Common; using Microsoft.Data.Tools.Schema.Sql.UnitTesting; using Microsoft.Data.Tools.Schema.Sql.UnitTesting.Conditions; namespace ColumnCountCondition { public class ResultSetColumnCountCondition
Derivare la classe da TestCondition:
public class ResultSetColumnCountCondition : TestCondition
Aggiungere ExportTestConditionAttribute.Per ulteriori informazioni su Procedura: Creare condizioni di test per la finestra di progettazione unit test di SQL Server, vedere ExportTestConditionAttribute.
[ExportTestCondition("ResultSet Column Count", typeof(ResultSetColumnCountCondition))] public class ResultSetColumnCountCondition : TestCondition
Creare le variabili membro e il costruttore:
private int _resultSet; private int _count; private int _batch; public ResultSetColumnCountCondition() { _resultSet = 1; _count = 0; _batch = 1; }
Eseguire l'override del metodo Assert.Il metodo include gli argomenti per IDbConnection, che rappresentano la connessione al database, e SqlExecutionResult.Il metodo utilizza DataSchemaException per la gestione degli errori:
//method you need to override //to perform the condition verification public override void Assert(DbConnection validationConnection, SqlExecutionResult[] 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)); SqlExecutionResult 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)); } Add the following method, which overrides the ToString method: C# //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); }
Aggiungere le seguenti proprietà della condizione di test utilizzando gli attributi CategoryAttribute, DisplayNameAttribute e 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
Di seguito viene riportato il codice finale:
using System;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using Microsoft.Data.Tools.Schema.Sql.UnitTesting;
using Microsoft.Data.Tools.Schema.Sql.UnitTesting.Conditions;
namespace ColumnCountCondition
{
[ExportTestCondition("ResultSet Column Count", typeof(ResultSetColumnCountCondition))]
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, SqlExecutionResult[] 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));
SqlExecutionResult 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
}
}
Nella prossima esercitazione verrà illustrato come compilare il progetto.
Compilazione del progetto e installazione della condizione di test
Scegliere Compila soluzione dal menu Compila.
Nella prossima esercitazione verrà illustrato come copiare le informazioni sull'assembly nella directory Estensioni.Quando si avvia Visual Studio, il programma identifica tutte le estensioni presenti nella directory %Programmi%\Microsoft Visual Studio \Common7\IDE\Extensions\Microsoft\SQLDB\TestConditions e nelle relative sottodirectory rendendole disponibili per l'uso:
Copiare il file di assembly ColumnCountCondition.dll dalla directory di output nella directory %Programmi%\Microsoft Visual Studio \Common7\IDE\Extensions\Microsoft\SQLDB\TestConditions.
Per impostazione predefinita, il percorso del file con estensione dll compilato è PercorsoSoluzione\PercorsoProgetto\bin\Debug o PercorsoSoluzione\PercorsoProgetto\bin\Release.
Nella prossima esercitazione verrà illustrato come avviare una nuova sessione di Visual Studio e creare un progetto di database.Per avviare una nuova sessione di Visual Studio e creare un progetto di database:
Avviare una seconda sessione di Visual Studio.
Nel menu File fare clic su Nuovo e scegliere Progetto.
Nella finestra di dialogo Nuovo progetto, selezionare il nodo SQL Server nell'elenco dei modelli installati.
Nel riquadro dei dettagli fare clic su Progetto di database SQL Server.
Nella casella di testo Nome digitare SampleConditionDB e fare clic su OK.
Nella prossima esercitazione verrà illustrato come creare uno unit test.Per creare uno unit test di SQL Server all'interno di una nuova classe di test:
Scegliere Nuovo test dal menu Test per visualizzare la finestra di dialogo Aggiungi nuovo test.
È anche possibile aprire Esplora soluzioni, fare clic con il pulsante destro del mouse su un progetto di test, scegliere Aggiungi, quindi fare clic su Nuovo test.
Nell'elenco dei modelli fare clic su Unit test di SQL Server.
In Nome test digitare SampleUnitTest.
In Aggiungi a progetto di test fare clic su Crea nuovo progetto di test Visual C#.Fare clic su OK per visualizzare la finestra di dialogo Nuovo progetto di test.
Digitare SampleUnitTest per il nome del progetto.
Fare clic su Annulla per creare lo unit test senza configurare il progetto di test per l'uso di una connessione del database.Il test vuoto viene visualizzato nella Finestra di progettazione unit test di SQL Server.Viene aggiunto un file di codice sorgente Visual C# al progetto di test.
Per ulteriori informazioni sulla creazione e sulla configurazione degli unit test del database con connessioni del database, vedere Procedura: Creare uno unit test di SQL Server vuoto.
Fare clic su Fare clic qui per creare per completare la creazione dello unit test.Verrà visualizzata la nuova condizione di test nel progetto SQL Server.
Nota
Per utilizzare la condizione di test personalizzata con i progetti di unit test esistenti, è necessario creare almeno una nuova classe di unit test di SQL Server.Il riferimento necessario all'assembly della condizione di test viene aggiunto al progetto di test durante la creazione della classe di test.
Per visualizzare la nuova condizione di test:
Nella Finestra di progettazione unit test di SQL Server scegliere Condizioni di test, quindi fare clic sul test inconclusiveCondition1 nella colonna Nome.
Fare clic sul pulsante Elimina condizione di test nella barra degli strumenti per rimuovere il test inconclusiveCondition1.
Fare clic sull'elenco a discesa Condizioni di test e selezionare Totale colonne ResultSet.
Fare clic sul pulsante Aggiungi condizione di test nella barra degli strumenti per aggiungere la condizione di test personalizzata.
Nella finestra Proprietà configurare le proprietà Count, Enabled e ResultSet.
Per ulteriori informazioni, vedere Procedura: Aggiungere condizioni di test a unit test di SQL Server.
Vedere anche
Condizioni di test personalizzate per unit test di SQL Server