|
Il progetto di Unit Test
Per testare il funzionamento di queste classi, utilizziamo NUnit, e se pure non creeremo tutti i possibili test, mostreremo alcuni metodi che rispondono a quanto abbiamo descritto nell'articolo dedicato agli UnitTest.
Test per ConnectionHelper
using System;
using System.Collections.Generic;
using System.Text;
using NUnit.Framework;
using System.IO;
namespace Dnw.SqlHelper
{
[TestFixture]
public class ConnectionHelperTest
{
private readonly string mClassName =
System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.Name;
private string mTrattini = new string('-', 80);
}
}
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports NUnit.Framework
Imports System.IO
Namespace Dnw.SqlHelper
_
Public Class ConnectionHelperTest
Private ReadOnly mClassName As String = _
System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.Name
Private mTrattini As New String("-"C, 80)
End Class
End Namespace
La struttura di una classe di Unit Test come possiamo vedere è uguale a quella delle normali classi fatto salvo per l'uso dell' NUnit.Framework che definiamo con la clausola using (Imports). E per l'attributo TextFixture che decora la classe. Questo attributo fornisce a NUnit l'informazione che questa è una delle sue classi di test.
[TestFixtureSetUp]
public void ClassInit()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Iniziano i test per la classe {0}", mClassName);
Console.WriteLine(mTrattini);
Console.WriteLine();
}
[SetUp]
public void Init()
{
}
[TearDown]
public void Endit()
{
}
[TestFixtureTearDown]
public void ClassEndit()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Fine dei test per la classe {0}", mClassName);
Console.WriteLine(mTrattini);
Console.WriteLine();
}
_
Public Sub ClassInit()
Console.WriteLine(mTrattini)
Console.WriteLine("Iniziano i test per la classe {0}", mClassName)
Console.WriteLine(mTrattini)
Console.WriteLine()
End Sub
_
Public Sub Init()
End Sub
_
Public Sub Endit()
End Sub
_
Public Sub ClassEndit()
Console.WriteLine(mTrattini)
Console.WriteLine("Fine dei test per la classe {0}", mClassName)
Console.WriteLine(mTrattini)
Console.WriteLine()
End Sub
I quattro metodi che abbiamo inserito in questa porzione di codice, devono essere inseriti in tutte le classi di UnitTest, l'importante anche in questo caso non è il nome del metodo ma l'attributo che lo decora. Le istruzioni che si trovano dentro ClassInit e ClassEndit, vengono eseguite prima di iniziare i test e dopo il termine dell'ultimo test, mentre le istruzioni che si trovano dentro a Init ed Endit vengono eseguite prima e dopo ciascuno dei metodi di test. Questi quattro metodi, ci permettono di effettuare dove necessario delle operazioni di inizializzazione generale per tutti i test e delle operazioni di inizializzazione per i singoli test, ad esempio i controlli sulle connessioni o comunque operazioni di setup e teardown ad esempio su strumenti collegati o risorse non condivisibili.
[Test, ExpectedException( typeof(ServerNameInvalidException))]
[Category("ConnectionHelperTestExceptions")]
public void BuildConnectionStringNoServerNull()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test eccezione x nome server nullo");
string cnString = ConnectionHelper.BuildConnectionString(null, "Goofy");
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va");
}
GetType(ServerNameInvalidException))> _
"ConnectionHelperTestExceptions")> _
Public Sub BuildConnectionStringNoServerNull()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test eccezione x nome server nullo")
Dim cnString As String = ConnectionHelper.BuildConnectionString(Nothing, "Goofy")
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va")
End Sub
Il primo test, un test che verifica che ad un dato errato sul nome del server risponda l'eccezione giusta. Faccio notare come per ottenere il corretto comportamento di NUnit, sono utilizzati gli attributi Test perché il metodo sia preso in carico dal framework ed eseguito, ed ExpectedException, che permette ad NUnit di indicare che il test è andato a buon fine grazie all'eccezione che si verificherà.
[Test, ExpectedException(typeof(ServerNameInvalidException))]
[Category("ConnectionHelperTestExceptions")]
public void BuildConnectionStringNoServerEmpty()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test eccezione x nome server vuoto");
string cnString = ConnectionHelper.BuildConnectionString(string.Empty, "Goofy");
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va");
}
GetType(ServerNameInvalidException))> _
"ConnectionHelperTestExceptions")> _
Public Sub BuildConnectionStringNoServerEmpty()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test eccezione x nome server vuoto")
Dim cnString As String = ConnectionHelper.BuildConnectionString(String.Empty, "Goofy")
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va")
End Sub
Il secondo test, simile al primo che verifica che l'eccezione voluta si verifichi anche con una stringa vuota.
[Test, ExpectedException(typeof(DbNameInvalidException))]
[Category("ConnectionHelperTestExceptions")]
public void BuildConnectionStringNoDbNull()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test eccezione x nome database nullo");
string cnString = ConnectionHelper.BuildConnectionString("local", null);
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va");
}
GetType(DbNameInvalidException))> _
"ConnectionHelperTestExceptions")> _
Public Sub BuildConnectionStringNoDbNull()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test eccezione x nome database nullo")
Dim cnString As String = ConnectionHelper.BuildConnectionString("local", Nothing)
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va")
End Sub
Il terzo test, verifica che un nome database nullo dia l'eccezione desiderata, esattamente come le precedenti.
[Test, ExpectedException(typeof(DbNameInvalidException))]
[Category("ConnectionHelperTestExceptions")]
public void BuildConnectionStringNoDbEmpty()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test eccezione x nome database vuoto");
string cnString = ConnectionHelper.BuildConnectionString("local", string.Empty);
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va");
}
GetType(DbNameInvalidException))> _
"ConnectionHelperTestExceptions")> _
Public Sub BuildConnectionStringNoDbEmpty()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test eccezione x nome database vuoto")
Dim cnString As String = ConnectionHelper.BuildConnectionString("local", String.Empty)
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va")
End Sub
Il quarto test, verifica simile alla precedente ma con il nome database vuoto anziché nullo.
[Test, ExpectedException(typeof(UserNameInvalidException))]
[Category("ConnectionHelperTestExceptions")]
public void BuildConnectionStringNoUserNull()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test eccezione x nome user nullo");
string cnString = ConnectionHelper.BuildConnectionString("local",
"master", null, string.Empty);
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va");
}
GetType(UserNameInvalidException))> _
"ConnectionHelperTestExceptions")> _
Public Sub BuildConnectionStringNoUserNull()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test eccezione x nome user nullo")
Dim cnString As String = ConnectionHelper.BuildConnectionString( _
"local", "master", Nothing, String.Empty)
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va")
End Sub
Proseguiamo i test sul metodo per la generazione di una connessione SQL quindi verifichiamo la corretta eccezione in caso di Username Null.
[Test, ExpectedException(typeof(UserNameInvalidException))]
[Category("ConnectionHelperTestExceptions")]
public void BuildConnectionStringNoUserEmpty()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test eccezione x nome user vuoto");
string cnString = ConnectionHelper.BuildConnectionString("local",
"master", string.Empty, string.Empty);
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va");
}
GetType(UserNameInvalidException))> _
"ConnectionHelperTestExceptions")> _
Public Sub BuildConnectionStringNoUserEmpty()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test eccezione x nome user vuoto")
Dim cnString As String = ConnectionHelper.BuildConnectionString( _
"local", "master", String.Empty, String.Empty)
Assert.Fail("Non deve mai arrivare qui! c'è qualcosa che non va")
End Sub
Un altro test sul nome utente, stavolta con la stringa vuota.
[Test]
[Category("ConnectionHelperTestValidData")]
public void BuildConnectionStringDataCorrectTrusted()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test Stringhe corrette per trusted connection");
string cnString = ConnectionHelper.BuildConnectionString("local", "master");
Console.WriteLine("Test: {0}", cnString);
Assert.Greater(cnString.Length,0);
}
_
"ConnectionHelperTestValidData")> _
Public Sub BuildConnectionStringDataCorrectTrusted()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test Stringhe corrette per trusted connection")
Dim cnString As String = ConnectionHelper.BuildConnectionString("local", "master")
Console.WriteLine("Test: {0}", cnString)
Assert.Greater(cnString.Length, 0)
End Sub
Proviamo ora una connection string corretta di tipo trusted sul SQL Server locale del PC.
[Test]
[Category("ConnectionHelperTestValidData")]
public void BuildConnectionStringDataCorrectSqlNoPwd()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test Stringhe corrette per sql connection");
string cnString = ConnectionHelper.BuildConnectionString("local",
"master", "sa", string.Empty);
Console.WriteLine("Test: {0}", cnString);
Assert.Greater(cnString.Length, 0);
}
_
"ConnectionHelperTestValidData")> _
Public Sub BuildConnectionStringDataCorrectSqlNoPwd()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test Stringhe corrette per sql connection")
Dim cnString As String = ConnectionHelper.BuildConnectionString( _
"local", "master", "sa", String.Empty)
Console.WriteLine("Test: {0}", cnString)
Assert.Greater(cnString.Length, 0)
End Sub
Testiamo ora una connection string corretta senza password.
[Test]
[Category("ConnectionHelperTestValidData")]
public void BuildConnectionStringDataCorrectSqlPwd()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test Stringhe corrette per sql connection");
string cnString = ConnectionHelper.BuildConnectionString("local",
"master", "sa", "testpassword");
Console.WriteLine("Test: {0}", cnString);
Assert.Greater(cnString.Length, 0);
}
_
"ConnectionHelperTestValidData")> _
Public Sub BuildConnectionStringDataCorrectSqlPwd()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test Stringhe corrette per sql connection")
Dim cnString As String = ConnectionHelper.BuildConnectionString( _
"local", "master", "sa", "testpassword")
Console.WriteLine("Test: {0}", cnString)
Assert.Greater(cnString.Length, 0)
End Sub
Ed ora una connection string corretta con username e password.
[Test]
[Category("ConnectionHelperTestConnection")]
public void TestConnectionInvalidCnStrings()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test Stringhe di connessione con dati errati");
string[] righe = File.ReadAllLines("ConnectionHelperDataCnStringTestKo.txt");
for (int i = 0; i < righe.Length; i++)
{
string[] parametri = righe[i].Split(',');
string risultato = TestaDatiConnessioneSqlBalordi(parametri[0],
parametri[1], parametri[2], parametri[3]);
Assert.Greater(risultato.Length, 0,
"Volpe hai inserito una stringa di connessione valida devono essere tutte sbagliate!");
Console.WriteLine(risultato);
}
}
_
"ConnectionHelperTestConnection")> _
Public Sub TestConnectionInvalidCnStrings()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test Stringhe di connessione con dati errati")
Dim righe As String() = File.ReadAllLines("ConnectionHelperDataCnStringTestKo.txt")
For i As Integer = 0 To righe.Length - 1
Dim parametri As String() = righe(i).Split(","C)
Dim risultato As String = TestaDatiConnessioneSqlBalordi(parametri(0), _
parametri(1), parametri(2), parametri(3))
Assert.Greater(risultato.Length, 0, _
"Volpe hai inserito una stringa di connessione valida devono essere tutte sbagliate!")
Console.WriteLine(risultato)
Next
End Sub
Questo test, utilizza un file di testo di appoggio con una serie di connection string errate per provare che in ogni caso ci sia il risultato atteso. Il numero e la forma dei dati di connessione errati possono essere arbitrariamente inseriti nel file con la forma seguente:
4unb10,paperinik,pippojunior,sopralapancalacapracampa
4unb10,paperinik,pippojunior,sopralapancalacapracampa
nessuno,paperinik,pippojunior,sopralapancalacapracampa
4unb10,noneundatabase,pippojunior,juniorpippo
4unb10,paperinik,noneunutente,sopralapancalacapracampa
Per fare questo test viene utilizzato un metodo di supporto che come vedremo fra poco, a differenza degli altri non è decorato con l'attributo Test e l'attributo Category, in modo che NUnit non lo prenda in considerazione quando esegue la serie dei test.
[Test]
[Category("ConnectionHelperTestConnection")]
public void TestConnectionValidCnStrings()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Test Stringhe di connessione con dati corretti");
string[] righe = File.ReadAllLines("ConnectionHelperDataCnStringTestOk.txt");
for (int i = 0; i < righe.Length; i++)
{
string[] parametri = righe[i].Split(',');
string cnCtring = ConnectionHelper.BuildConnectionString(
parametri[0], parametri[1], parametri[2], parametri[3]);
Console.WriteLine("Test: {0}", cnCtring);
bool okko = false;
try
{
ConnectionHelper.TestConnection(cnCtring);
okko = true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Assert.IsTrue(okko,
"I dati di connessione non sono validi volpe qui dovrebbe sempre connettersi!");
}
}
_
"ConnectionHelperTestConnection")> _
Public Sub TestConnectionValidCnStrings()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Test Stringhe di connessione con dati corretti")
Dim righe As String() = File.ReadAllLines("ConnectionHelperDataCnStringTestOk.txt")
For i As Integer = 0 To righe.Length - 1
Dim parametri As String() = righe(i).Split(","C)
Dim cnCtring As String = ConnectionHelper.BuildConnectionString( _
parametri(0), parametri(1), parametri(2), parametri(3))
Console.WriteLine("Test: {0}", cnCtring)
Dim okko As Boolean = False
Try
ConnectionHelper.TestConnection(cnCtring)
okko = True
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Assert.IsTrue(okko, _
"I dati di connessione non sono validi volpe qui dovrebbe sempre connettersi!")
Next
End Sub
Il test finale, prova una serie di connessioni valide per il nostro server, utilizzando un secondo file di testo, in modo tale che basta modificare il file di testo perché i test funzionino su qualsiasi server SQL.
private string TestaDatiConnessioneSqlBalordi( string pServer,
string pDatabase, string pUsername, string pPassword )
{
try
{
string cnString = ConnectionHelper.BuildConnectionString(
pServer, pDatabase, pUsername, pPassword);
Console.WriteLine("Test: {0}", cnString);
ConnectionHelper.TestConnection(cnString);
return string.Empty;
}
catch (Exception ex)
{
return ex.Message;
}
}
Private Function TestaDatiConnessioneSqlBalordi(ByVal pServer As String, _
ByVal pDatabase As String, ByVal pUsername As String, ByVal pPassword As String) As String
Try
Dim cnString As String = ConnectionHelper.BuildConnectionString(pServer, _
pDatabase, pUsername, pPassword)
Console.WriteLine("Test: {0}", cnString)
ConnectionHelper.TestConnection(cnString)
Return String.Empty
Catch ex As Exception
Return ex.Message
End Try
End Function
L'ultimo metodo è il metodo di appoggio per il test delle connessioni non valide, usato perché ovviamente così come è inutile duplicare codice nella scrittura di normale codice applicativo, è inutile farlo nelle funzioni di test.
Abbiamo creato molti test per una classe che sembra fare ben poco, infatti la sua funzionalità primaria è generare stringhe, se pure sono stringhe molto importanti. Per le altre due classi, non faremo un numero di test simile, per non divenire noiosi, però è opportuno valutare un numero adeguato di test per ogni classe che si costruisce in modo da testare quanto più possibile ciò che può accadere quando viene utilizzata. E' chiaro che non è opportuno scrivere troppo codice di test, perché altrimenti il nostro tempo utile per produrre sarebbe troppo basso, però è opportuno individuare almeno i test più significativi per poter essere certi di aver preso in considerazione gli aspetti d'uso più importanti. In seguito, se si verificassero errori e si trovassero Bug in una classe, per risolverlo create un test che lo riproduca e poi modificate la classe. Questo permetterà di fare in modo che eventuali modifiche successive non portino di nuovo a verificarsi problemi già risolti. Lo scopo degli Unit test è proprio questo.
Test per SqlExecHelper
[SetUp]
public void Init()
{
string[] cnData = (File.ReadAllText("CreateDbHelperCnStringData.txt")).Split(';');
mCnString = ConnectionHelper.BuildConnectionString(cnData[0], "master", cnData[1], cnData[2]);
}
Public Sub Init()
Dim cnData As String() = (File.ReadAllText("CreateDbHelperCnStringData.txt")).Split(";"C)
mCnString = ConnectionHelper.BuildConnectionString(cnData(0), "master", cnData(1), cnData(2))
End Sub
Pur non ripetendo tutta la struttura della classe, evidenzio come in questo caso abbiamo utilizzato la funzione Init della classe per comporre la connection string per la connessione al nostro server, inserendo i parametri in un file di testo in modo tale che ciascuno possa adattarli al proprio PC senza dover modificare il codice.
[Test]
[Category("SqlExecHelperTest")]
[ExpectedException( typeof(InvalidOperationException ))]
public void T10ExecSqlCommandNo()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine( "Da invalid operation exception" );
SqlExecHelper.ExecSqlCommand(string.Empty, string.Empty, System.Data.CommandType.Text, null);
Console.WriteLine();
}
_
"SqlExecHelperTest")> _
GetType(InvalidOperationException))> _
Public Sub T10ExecSqlCommandNo()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Da invalid operation exception")
SqlExecHelper.ExecSqlCommand(String.Empty, String.Empty, System.Data.CommandType.Text, Nothing)
Console.WriteLine()
End Sub
Il primo test verifica l'eccezione in caso di parametri sbagliati, a cominciare dalla Connection String.
[Test]
[Category("SqlExecHelperTest")]
[ExpectedException( typeof(InvalidOperationException ))]
public void T20ExecSqlCommandCnStringOk()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine( "Da invalid operation exception" );
SqlExecHelper.ExecSqlCommand(mCnString, string.Empty, System.Data.CommandType.Text, null);
Console.WriteLine();
}
_
"SqlExecHelperTest")> _
GetType(InvalidOperationException))> _
Public Sub T20ExecSqlCommandCnStringOk()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Da invalid operation exception")
SqlExecHelper.ExecSqlCommand(mCnString, String.Empty, System.Data.CommandType.Text, Nothing)
Console.WriteLine()
End Sub
Il secondo test, con codice SQL non impostato anche in questo caso dobbiamo ottenere una eccezione.
[Test]
[Category("SqlExecHelperTest")]
[ExpectedException(typeof(InvalidOperationException))]
public void T30ExecSqlCommandScalarNo()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Da invalid operation exception");
SqlExecHelper.ExecSqlCommandScalar(string.Empty,
string.Empty, System.Data.CommandType.Text, null);
Console.WriteLine();
}
_
"SqlExecHelperTest")> _
GetType(InvalidOperationException))> _
Public Sub T30ExecSqlCommandScalarNo()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Da invalid operation exception")
SqlExecHelper.ExecSqlCommandScalar(String.Empty, _
String.Empty, System.Data.CommandType.Text, Nothing)
Console.WriteLine()
End Sub
Questo test mostra verifica lo stesso tipo di risposta per il metodo ExecuteScalar.
[Test]
[Category("SqlExecHelperTest")]
[ExpectedException(typeof(InvalidOperationException))]
public void T40ExecSqlCommandScalarCnOk()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Da invalid operation exception");
SqlExecHelper.ExecSqlCommandScalar(mCnString,
string.Empty, System.Data.CommandType.Text, null);
Console.WriteLine();
}
_
"SqlExecHelperTest")> _
GetType(InvalidOperationException))> _
Public Sub T40ExecSqlCommandScalarCnOk()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Da invalid operation exception")
SqlExecHelper.ExecSqlCommandScalar(mCnString, _
String.Empty, System.Data.CommandType.Text, Nothing)
Console.WriteLine()
End Sub
Il secondo test sul metodo scalar.
[Test]
[Category("SqlExecHelperTest")]
public void T50ExecSqlCommandScalarGetDate()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Console.WriteLine("Get data e ora");
object val = SqlExecHelper.ExecSqlCommandScalar(mCnString,
"SELECT GetDate()", System.Data.CommandType.Text, null);
Assert.IsTrue(val.GetType() == typeof(DateTime));
Console.WriteLine(val.ToString());
Console.WriteLine();
}
_
"SqlExecHelperTest")> _
Public Sub T50ExecSqlCommandScalarGetDate()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Console.WriteLine("Get data e ora")
Dim val As Object = SqlExecHelper.ExecSqlCommandScalar(mCnString, _
"SELECT GetDate()", System.Data.CommandType.Text, Nothing)
Assert.IsTrue(val.GetType().Equals(GetType(DateTime)))
Console.WriteLine(val.ToString())
Console.WriteLine()
End Sub
L'ultimo test fa semplicemente una verifica valida richiedendo un dato che certamente esiste. Non testiamo la funzione ExecuteNonQuery perché al momento non mi viene in mente qualcosa che possiamo fare, lasciamo il test ai due metodi che testeranno la createDB e la DropDb nella classe di test dell'helper apposito.
Test per CreateDropDbHelper
[Test]
[Category("CreateDbHelperTest")]
public void Test001_ExistDb()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
Assert.IsTrue(CreateDropDbHelper.ExistDatabase(mCnString, "master"),
"Sembra che il db master non esista! Hai fatto casino sul login???");
Console.WriteLine("OK Test Exists master");
Assert.IsFalse(CreateDropDbHelper.ExistDatabase(mCnString, "moo"),
"Ma davvero hai un DB che Moo ggisce???");
Console.WriteLine("OK Test Not Exists moo");
Console.WriteLine();
}
_
"CreateDbHelperTest")> _
Public Sub Test001_ExistDb()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
Assert.IsTrue(CreateDropDbHelper.ExistDatabase(mCnString, "master"), _
"Sembra che il db master non esista! Hai fatto casino sul login???")
Console.WriteLine("OK Test Exists master")
Assert.IsFalse(CreateDropDbHelper.ExistDatabase(mCnString, "moo"), _
"Ma davvero hai un DB che Moo ggisce???")
Console.WriteLine("OK Test Not Exists moo")
Console.WriteLine()
End Sub
Il primo test, verifichiamo che il metodo che controlla l'esistenza del database con un DB che esiste certamente e un DB che moolto difficilmente esisterà.
[Test]
[Category("CreateDbHelperTest")]
public void Test002_CreateDbSimple()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
if (CreateDropDbHelper.ExistDatabase(mCnString, "CreateDropDbTest"))
{
CreateDropDbHelper.DropDatabase(mCnString, "CreateDropDbTest");
}
CreateDropDbHelper.CreateDatabase(mCnString, "CreateDropDbTest");
Assert.IsTrue( CreateDropDbHelper.ExistDatabase(mCnString, "CreateDropDbTest"));
Console.WriteLine("OK Test Create CreateDropDbTest");
Console.WriteLine();
}
_
"CreateDbHelperTest")> _
Public Sub Test002_CreateDbSimple()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
If CreateDropDbHelper.ExistDatabase(mCnString, "CreateDropDbTest") Then
CreateDropDbHelper.DropDatabase(mCnString, "CreateDropDbTest")
End If
CreateDropDbHelper.CreateDatabase(mCnString, "CreateDropDbTest")
Assert.IsTrue(CreateDropDbHelper.ExistDatabase(mCnString, "CreateDropDbTest"))
Console.WriteLine("OK Test Create CreateDropDbTest")
Console.WriteLine()
End Sub
Verifichiamo il metodo di creazione db semplice e assieme a questo verifichiamo il metodo Drop, infatti, lanciando due volte il test ovviamente il Database sarà cancellato prima di essere rigenerato.
[Test]
[Category("CreateDbHelperTest")]
public void Test003_CreateDbComplex()
{
Console.WriteLine(mTrattini);
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine(mTrattini);
if (CreateDropDbHelper.ExistDatabase(mCnString, "CreateDropDbTest"))
{
CreateDropDbHelper.DropDatabase(mCnString, "CreateDropDbTest");
}
CreateDropDbHelper.CreateDatabase(mCnString, "CreateDropDbTest", @"D:\sql.dir\data"
, "100MB", "100000MB", "10MB", "25MB", "10000MB","10%");
Assert.IsTrue( CreateDropDbHelper.ExistDatabase(mCnString, "CreateDropDbTest"));
Console.WriteLine("OK Test Create CreateDropDbTest complex");
Console.WriteLine();
}
_
"CreateDbHelperTest")> _
Public Sub Test003_CreateDbComplex()
Console.WriteLine(mTrattini)
Console.WriteLine("Metodo {0}", System.Reflection.MethodBase.GetCurrentMethod().Name)
Console.WriteLine(mTrattini)
If CreateDropDbHelper.ExistDatabase(mCnString, "CreateDropDbTest") Then
CreateDropDbHelper.DropDatabase(mCnString, "CreateDropDbTest")
End If
CreateDropDbHelper.CreateDatabase(mCnString, "CreateDropDbTest", _
"D:\sql.dir\data", "100MB", "100000MB", "10MB", _
"25MB", "10000MB", "10%")
Assert.IsTrue(CreateDropDbHelper.ExistDatabase(mCnString, "CreateDropDbTest"))
Console.WriteLine("OK Test Create CreateDropDbTest complex")
Console.WriteLine()
End Sub
Il secondo test, con la creazione del database con tutte le opzioni, anche in questo caso usiamo sia la create che la drop database. Questi test ovviamente testano anche le classi di appoggio che utilizzano per il loro funzionamento.
Articoli collegati:
Per qualsiasi Feedback, Ulteriore domanda, Chiarimento, oppure se trovate qualche errore usate direttamente il form dei commenti in calce a questo articolo oppure scrivete all'autrice .
|