Din mai multe
motive :
1.
Pentru ca e o modalitate usoara de a releva
functionalitatile mari ale aplicatiei
2.
Pentru ca la orice modificare la care nu sunteti
sigur daca dauneaza cumva logicii aplicatiei puteti rula testele vechi si
vedeti daca ati stricat ceva sau nu(Nota : ar trebui sa adaugati un nou test
pentru cei care vin dupa voi )
3.
E mai usor de fixat bug-urile daca, pe deasupra,
rulati testele in fiecare noapte – si a doua zi dimineata vedeti ceva
stricat…
4.
Hai sa trecem la treaba:
Mai intii downloadati NUnit de la http://www.nunit.org/index.php?p=download
( eu am folosit versiunea 2.2.8 )Exista si surse si setup de instalare. Eu as
sfatui sa luati sursele sa le compilati.
Apoi la solutia noastra Book.sln adaugam un
nou proiect de tipul Class Library , numit BookTest , adaugam o referinta la nunit.framework.dll
, aflat in NUnit-2.2.8-src\src\NUnitFramework\framework\bin\Debug2005,
modificam class1.cs in TestPublisher.cs si incepem sa scriem testul.Testul cel
mai simplu este unul de CRUD – create , read, update, delete.
Avem nevoie de obiectele Publisher respective,
precum si de setari in fisierul App.Config pentru a recunoaste Baza de date,
precum si de Baza de date.
Pentru Publisher, adaugam o referinta la
BookObject in tab-ul „Projects” de la Add Reference.
Pentru App.Config, adaugam un fisier de tipul
application configuration file si copiem de la BookDos partile relevante,
astfel incit fisierul arata astfel :
<?xml version=“1.0“ encoding=“utf-8“ ?>
<configuration>
<appSettings>
<add key=“DatabaseUsed“ value=“MDB“/>
<!–
possible values : MDB, SQLServer–>
</appSettings>
<connectionStrings>
<add name=“MDB“ connectionString=“Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=|DataDirectory|\book.mdb;User Id=admin;Password=;“/>
<!– TODO :
add for asp.net application the connection string with SQL Server–>
</connectionStrings>
</configuration>
Pentru baza de date, e simplu : in Build
Events, la Post Build Command Line adaugam
copy $(ProjectDir)..\BookData\*.mdb $(TargetDir)
Acum putem incepe sa scriem testul :
using System;
using System.Collections.Generic;
using System.Text;
using NUnit.Framework;
using BookObjects;
namespace BookTest
{
[TestFixture]
//arata ca e o clasa care contine teste
public class TestPublisher
{
[Test]
//arata ca metoda care urmeaza este un test
[Category(“CRUD”)] //categoria
-de obicei, testele de CRUD ar trebui puse impreuna
public
void CRUD()
{
Publisher
p = new Publisher();
p.Name = “Amazon”;
p.Save();
//sa il
gasim
ColPublisher
cp = new ColPublisher();
cp.Load();
bool
bFound= false;
foreach
(Publisher pLoop in
cp)
{
if
(pLoop.Name == p.Name)
{
bFound = true;
break;
}
}
//daca
acea conditie(bFound) nu e true, atunci se afiseaza mesajul de eroare
Assert.IsTrue(bFound,
“Nu s-a gasit publisher cu numele “
+ p.Name + ” dupa insert”);
//sa il
modificam
p.Name = “O’Reilly”;
p.Update();
//sa il
gasim din nou
cp = new
ColPublisher();
cp.Load();
bFound = false;
foreach
(Publisher pLoop in
cp)
{
if
(pLoop.Name == p.Name)
{
bFound = true;
break;
}
}
//daca
acea conditie(bFound) nu e true, atunci se afiseaza mesajul de eroare
Assert.IsTrue(bFound,
“Nu s-a gasit publisher cu numele “
+ p.Name + ” dupa update”);
//acum
sa il stergem
p.Delete();
//si sa
vedem ca nu a fost gasit
cp = new
ColPublisher();
cp.Load();
bFound = false;
foreach
(Publisher pLoop in
cp)
{
if
(pLoop.Name == p.Name)
{
bFound = true;
break;
}
}
//daca
acea conditie(bFound) nu e false, atunci se afiseaza mesajul de eroare
Assert.IsFalse(bFound,
“S-a gasit publisher cu numele “ +
p.Name + ” dupa delete”);
}
}
}
Il compilam si sa rulam testul. Gasiti in
folderul NUnit-2.2.8-src\src\GuiRunner\nunit-gui-exe\bin\Debug2005 un nunit-gui.exe
si porniti-l.Apasati File=> Open si mergeti in C:\Book\BookTest\bin\Debug si
incarcati BookTest.dll . Ar trebui sa apara figura urmatoare
Apasati pe RUN si primul lucru pe care il
vedeti este:
Se vede clar ca e ceva prost… ne uitam in TestPublisher.cs
si vedem ca la linia 37 este
p.Update();
Ceva a mers prost la update … sa vedem linia
107 din Publisher.cs
strSQL
+= “‘” + this.Site.Replace(“‘”, “””)
+ “‘”;
Acum e clar ce s-a intimplat … Cind am facut
testul, nu am initializat Site-ul cu nimic… si atunci este null , ceea ce
inseamna ca .Replace nu poate fi aplicat
Sa modificam codul din Publisher.cs ca sa ia
in seama si acest lucru :
if
(this.Site == null)
strSQL += ” NULL “;
else
strSQL += “‘” + this.Site.Replace(“‘”,
“””) + “‘”;
Acum apare alta eroare :
Este destul de clar ca aplicatia nu a updatat
numele …
De ce ?Ne dam seama imediat : in momentul in
care aplicatia a adaugat un nou Publisher , nu a regasit ID-ul inserat … iar
cind a facut update, IDPublisher este 0 , ceea ce inseamna ca nu
a putut fi facut update corect.
Cum modificam acest lucru ? Pentru access ,
putem sa selectam maxim de ID,iar pentru SQL Server putem crea o procedura
stocata … sau sa intoarcem @@Identity
Hai sa facem pentru Access , modificand Publisher.cs,
procedura Save, adaugind la final:
if(Settings.TheDatabase == Settings.DatabaseUsed.MDB)
{
strSQL = “select max(IDPublisher) as nr from Publisher”;
using
(DbConnection dc = Settings.TheConnection)
{
dc.Open();
using(DbCommand dco =Settings.TheCommand)
{
dco.CommandType =
System.Data.CommandType.Text;
dco.CommandText =
strSQL;
dco.Connection = dc;
object o = dco.ExecuteScalar();
this.IDPublisher = int.Parse(o.ToString());
}
}
}
Acum rulam din nou testul si totul e verde ,
ceea ce e de bine :
E clar ca exemplu a fost mai degraba simplut,
iar ceea ce conteaza, de fapt, sunt regulile de business si de validare – ca
de exemplu, validarea CNP