Ricerca 
it-ITen-US
Registrazione
Accedi
 
Autore:  Sabrina Cosolo
Pubblicato il:  2008/03/09

Unit testing del codice (parte 2)
Generiamo alcuni unit test per la libreria Helper base ADO.NET

Questo articolo, pubblicato in parallelo all'articoloADO.Net Nozioni di base (parte 1) mostra come generare alcuni Unit Test per verificare il corretto funzionamento dei metodi della libreria che si occupa di utilizzare comandi SQL in modo diretto su Database.

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 .

 

 

E'necessario essere un utente registrato per il download del codice allegato all'articolo


       
Articoli|Webcast|Risorse|Utility
© 2007-2010 by DotNetWork  .:.  Condizioni d'uso  .:.  Privacy  .:.  Accedi  .:.