Procedura: creare condizioni di test per la finestra di progettazione degli unit test del database
Le informazioni contenute in questo argomento sono valide per:
Visual Studio Ultimate |
Visual Studio Premium |
Visual Studio 2010 Professional |
Visual Studio Express |
---|---|---|---|
È possibile utilizzare la classe TestCondition estensibile per creare nuove condizioni di test. Ad esempio, è possibile creare una nuova condizione di test che verifica il numero di colonne o i valori in un set di risultati.
Nella procedura seguente viene illustrato come creare una condizione di test da visualizzare nella finestra di progettazione degli unit test del database.
Per creare una condizione di test
In Visual Studio creare un progetto Libreria di classi.
Scegliere Aggiungi riferimento dal menu Progetto.
Fare clic sulla scheda .NET.
Nell'elenco Nome componente selezionare Microsoft.Data.Schema.UnitTesting e Microsoft.Data.Schema, quindi fare clic su OK.
Derivare la classe dalla classe TestCondition.
Firmare l'assembly con un nome sicuro. Per ulteriori informazioni, vedere Procedura: firmare un assembly con un nome sicuro.
Compilare la libreria di classi.
Prima di poter utilizzare la nuova condizione di test, è necessario copiare l'assembly firmato nella cartella %Programmi%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomExtensions, dove CustomExtensions è il nome della cartella creata dall'utente o dall'amministratore del computer per contenere i file XML delle estensioni di funzionalità.
Registrare la condizione di test. Per ulteriori informazioni, vedere Procedura: registrare e gestire estensioni di funzionalità.
Esempio
In questo esempio si creerà una condizione di test semplice per verificare che il numero di colonne restituito nel gruppo di risultati sia quello previsto. È possibile utilizzare questa condizione di test semplice per assicurarsi che il contratto per una stored procedure sia corretto.
using System;
using System.Collections.Generic;
using TestTools = Microsoft.VisualStudio.TestTools.UnitTesting;
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 TeamSystem.Data.Samples.DBUnitTesting
{
[DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.Any)]
[DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.None)]
[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
}
}
La classe per la condizione di test personalizzata eredita dalla classe base condizione di test. Per via delle proprietà aggiuntive della condizione di test personalizzata gli utenti possono, una volta registrata la condizione, configurarla nella finestra Proprietà.
In questo esempio, vengono aggiunte due proprietà. Gli utenti della condizione di test personalizzata possono utilizzare la proprietà ResultSet per specificare per quale gruppo di risultati il numero delle colonne deve essere verificato. Gli utenti possono quindi utilizzare la proprietà Count per specificare il numero di colonne previsto.
Per ogni proprietà vengono aggiunti tre attributi:
Il nome della categoria, che consente di organizzare le proprietà.
Il nome visualizzato della proprietà.
Una descrizione della proprietà.
Una convalida di base viene eseguita sulle proprietà per verificare che il valore della proprietà ResultSet non sia minore di uno e che il valore della proprietà Count sia maggiore di zero.
Il metodo Assert esegue l'attività principale della condizione di test. Il metodo Assert viene sottoposto a override per verificare che la condizione prevista sia stata soddisfatta. Questo metodo fornisce due parametri:
Il primo parametro è la connessione al database utilizzata per convalidare la condizione di test.
Il secondo e più importante parametro è la matrice dei risultati, che restituisce un singolo elemento di matrice per ogni batch eseguito.
Per ogni script di test è supportato un unico batch. Pertanto, le condizioni di test esamineranno sempre il primo elemento di matrice. L'elemento di matrice contiene un DataSet che, a sua volta, contiene i gruppi di risultati restituiti per lo script di test. In questo esempio, il codice verifica che la tabella dati nel DataSet contenga il numero appropriato di colonne. Per ulteriori informazioni, vedere DataSet.
È necessario impostare la libreria di classi che contiene la condizione di test da firmare. Tale operazione può essere eseguita nella scheda Firma delle proprietà del progetto.
Vedere anche
Attività
Procedura: registrare e gestire estensioni di funzionalità
Concetti
Definire condizioni personalizzate per gli unit test del database