Você está na página 1de 20

10/11/2015

DevMediaVersoparaimpresso

DevMediaVersoparaimpresso

Desenvolvimentogil
Entendaarelaoentredesenvolvimentogiletestesunitrios

Doquetrataoartigo
Esteartigoexplicaoquedesenvolvimentogileensinacomocriarumprojetoseguindoo
princpiodedesenvolvimentodirigidoportestes.Atofinaldoartigovocaprendercomo
executartestesunitrioscomDUnitecomousaroDiscoverparasaberquantodoseucdigo
aindanofoitestado,almdeentenderquaissoastcnicasmaisinteressantesparatestar
umsoftware.
Paraqueserve
Odesenvolvimentodirigidoportestesajudaacodificarmaisrpido,programasquetero
menosfalhas.Umprogramaquefoidesenvolvidocommetodologiasgeisnormalmenteso
maisclaroseflexveisdiantedasmudanasdodiaadia.
Emquesituaootematil
Executartestesumatarefaimprescindvelparaodesenvolvimentodeumbomsoftware.
QuandoelessoaplicadosjuntamentecomousodaferramentaDiscover,vocpodechegar
ater100%detodasaslinhasdoseucdigotestadas.Istocomcertezafarseuprojeto
amadurecer.
ResumodoDevMan
Ostestesautomatizadosajudammanteroprojetoestvelmesmoapsgrandesmudanas.
Esteartigoexplicaoquesotestesunitriosequeelestmavercomprogramaogilalm
deensinarcomocriartestesautomatizadoscomoDUnit,quevemintegradoaoDelphidesde
averso2005.Nofinaldetudo,vocaprendercomousaroDiscoverparasaberseos
testesdeixaramescaparalgumbug.

RafaelStavarengo
LinkedIn:http://linkedin.com/in/stavarengo

Antesdetudoprecisosaberquenoimportaseotesteserfeitocomtcnicas
automatizadasouno,oimportanteetestar.Existemoutrasmaneirasdetestarosoftware,
comoporexemplo,contratarpessoasespecialmenteparaestafuno.Estaprovavelmente
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

1/20

10/11/2015

DevMediaVersoparaimpresso

noamelhoralternativa,maspossveledevetrazerbonsresultados.Oimportante
executarostestesnoimportaseelesseroautomatizadosouno.Poroutrolado,almde
tornarosoftwaremaisbarato,quandovocautomatizaostestesvoctambmcodificamais
rpidoequandotiverquefazermodificaespoderfazlasmaisfacilmenteecommais
segurana:vocnoestarpreocupadosesualtimaalteraoestragououtraspartesdo
sistema.comumqueaspessoasseassustemquandocomeamaestudarsobreteste
unitrio,poisexistemmuitostermostcnicossobreoassuntocomocaixabranca,testesde
regresso,fasesdetestes,entreoutras.Issoosuficienteparaassustaralgumque
provavelmentenovaimaisnemquererouvirfalaremtcnicasdetestes.Todosestestermos
fazemostestespareceremcomplicados,masnoso.Vouexplicaroporqu.

Porqueostestessosimples
Existeumasequncianaturalparaoprocessodedesenvolvimentodeumprojetoeostestes
estonestaseqncia.
Quandovoccomeaacriarumprogramaouumanovapartedele,naturalmenteaprimeira
coisaquevocprecisasaberoqueestanovafunodevefazer,sendoassimostestes
devemsercriadosparavalidarseanovaopofazoquedeveriafazer.
Depoisqueostestespassaremosistemaestarfazendooqueprecisa:aprximaetapa
garantirqueelefazdojeitocerto.Paraistooutrostestesseroexecutados,sejaporvoc
mesmoouporoutraspessoas.Nestaetapaserotestadositenscomodesempenhoem
situaesextremas,facilidadedeuso,clarezadasmensagens,padronizaodastelas,
funcionalidadeentreoutrascoisas:oobjetivorefinaraopo.Existeumtipodetestequese
adaptamelhorparacadatipoderefinamento,porestemotivoexistemtantostermos
tcnicos.Noseconcentredemaiscomonomedecadafase(refinamento):tenhaemmente
quecadaopodevepassarporvriasfasesdetestesparamelhoraraqualidade.
Todoesteprocessonatural.Primeiroosistemacodificadoparafazeroqueprecisafazer.
Depoisumasriedeprocedimentossoexecutadospararefinaroprogramaegarantirque
elefazoquedevefazerdojeitocerto.Vocpoderiafazerissosemestudarnadasobre
testes,masseriamaisdifcil.Astcnicasdetestesexistemparafacilitarotrabalhode
refinamentoeaumentaraqualidadedosoftware.

Testedesoftware:oque?
Testedesoftwarequalquerprocedimentocomoobjetivodeprovarqueosoftwareno
funcionacorretamente.
Estesprocedimentospodemserexecutadosporumapessoaoupodemserautomatizados
empilhasdetestesqueficaramcadavezmaiscompletasmedidaqueoprojetomadurece.
Adiferenamaisevidenteentreumprojetodesenvolvidoorientadoatesteseoutrono
orientadoatestesestnoprocessodedesenvolvimento.
Enquantoqueumcomeaapartirdotesteautomatizadoescriadoonecessrioparao
testepassar,ooutrosimplesmenteconstrudoeemalgummomentonofuturoostestes
seroexecutadosporumhumano.Porseremexecutadosporhumanosnohgarantiade
queostestesserofielmenterepetidossemprequealgomudar.
comumpensarquecriarclassesdetestesaumentaotempodedesenvolvimentodo
softwaretornandoomaiscaroeatmesmoinvivel.
Esteumpensamentoequivocado,poisdemodogeralprogramasdesenvolvidoscombase
emtestessomaissimplesefazemsomenteoquedevemfazerumavezqueserescrito
somenteonecessrioparaotestepassar.Dificilmenteotempodesperdiadocomalgoque
nosejarealmentenecessrio.
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

2/20

10/11/2015

DevMediaVersoparaimpresso

Quemprogramacombasesnostestesquecria,ganhatempoquandoprecisaencontrarum
erro,poisraramentesernecessriodebugaroprogramaparaencontrarumerro:basta
rodarotesteeeleapontaondeexatamenteestoproblema.Algumasmetodologiasde
desenvolvimentodesoftwarenoslevamacriarclassesdetestesantesmesmodecriara
opoemsi:esteameuverocenrioideal.Nodecorrerdesteartigovocvercomofazer
isso.
Escrevertestesparatodasasclassesquevoccriardeveserumarealidadenoseudiaa
dia.AlmdeserumrequisitodomodeloISOdequalidadedesoftware,ostesteslevaroo
seuprojetoparaoutronveldequalidade.claroqueaqualidadedostestes,e
consequentementedoprodutofinal,dependediretamentedapessoaenvolvida,masmesmo
assimumprogramadesenvolvidoorientadoatestesnormalmenteconsegueatingiroobjetivo
commaisclarezaeemmenostempo.

Testedesoftware:oqueNO?
Testarumsoftwarenodebugar.Aocontrriodafasedecodificao,cujoobjetivo
construirosoftware,otesteumprocessoquevisadesmontloparaprovarqueeleno
funcionaouquetemerros.
Ostestesdevemserescritoscomosequemosescrevetivessesidodesafiadoaprovarque
oprogramatemfalhas,comosejsoubessequeasfalhasexistemeencontrlasapenas
umaquestodetempo.
difcilgarantirqueumsoftwarenotemerros,vistoquenormalmenteexistemmuitas
variveisparaavaliar,oqueaumentaacomplexidade.
Umsoftwarepodefalharporvriosmotivos,como:problemasdehardware,errosde
codificao,requisitoserrados,mensagenspoucoclaras,entreoutrosmotivos.
Aquantidadedepessoasenvolvidasnoprojetoequalificaodecadaumatambm
influenciadiretamentenaqualidadedoprodutofinal.
Almdissotudo,aindatemofatodequeasalteraessoconstantesenormalmente
muitasaomesmotempo:pareceumambientecaticoparaquemnoconhece.
Aindahojeexistempessoasquepensamnostestescomoumatarefasecundria,pormh
muitotempoescrevertestespassouaserumafasedodesenvolvimentoassimcomoa
anliseeimplantao.
Ostestesforneceminformaespreciosassobreonveldequalidadedesoftwareem
relaoaocontextoqueelepertence.

Modelodequalidade
Existeummodelobasedequalidade,ouseja,existemdocumentosquedescrevemcomo
umprogramadevesecomportarparaserconsideradodeboaqualidade.OmodeloISOde
qualidadedesoftwareconsideraquatrocategoriasdiferentesparaasfalhasdeumsoftware,
soelas:processodedesenvolvimento,qualidadeinterna,qualidadeexternaequalidade
percebidapelousurio.Estascategoriasenglobampelomenosseiscaractersticasqueno
podemfaltaremumsoftware:usabilidade,funcionalidade,confiabilidade,eficincia,
portabilidadeemanutenibilidade.
Alcanarosnveismaiselevadosdequalidadedefinidospelosrgosresponsveisno
umatarefamuitosimples.Parafacilitarestetrabalhoostestesforamdivididosemfases
diferentes,cadaumadelasfocadaemtestarumdeterminadoaspectodosistema.sobre
estasfasesquevocveraseguir.

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

3/20

10/11/2015

DevMediaVersoparaimpresso

Fasesdeteste
Sevoctestaoseuprojeto,entoprovavelmentejexecutatestesparaamaioriadasfases
quecitoaseguir,mesmosemsaberqueelasexistem.
Istoaconteceporqueoprocessodetestealgonaturalevocnoprecisaconheceras
fasesparapoderexecutlo,emboraconheclasfacilitaotrabalhoeaumentao
profissionalismo.afasedetestequeoprojetoseencontraquedizqualoobjetivodoteste
quedeveserexecutadoeapartirdapossvelsaberqualtcnicadetesteamais
apropriadaparaotalobjetivo.Aseguireucitoalgumasfasesdetesteseposteriormenteas
tcnicasmaisinteressantes.Existeumafasechamadatestedeunidade.Elaaconteceao
mesmotempoemqueasopesestosendocriadas.Oobjetivotestarunidadepor
unidadedoprograma:cadaclasse/arquivodeveterpelomenosoutraclassedeteste
especialmenteparaela.Astcnicasdecaixabrancaecaixapretasoexcelentesexemplos
detcnicasparaestafase,poisparatestarasunidadesotestadorprecisanecessariamente
teracessoaocdigofontedoprojeto.Equipesquetrabalhamcomdesenvolvimentogil
normalmentecriaramestestestesantesdecomearacodificaraopopropriamentedita.
Outrafaseatestedeintegrao.Nestafaseoobjetivogarantirqueacomunicao
estejafluindobementreoscomponentes(oumdulos,comopreferir),dosistema.Maisuma
vezdeveexistirumasriedeclassesdetestesparagarantir,porexemplo,queumavenda
noserfeitaemquantoumbalanoestiveremexecuo.
Estetestetambmpodeserexecutadoporumhumanointeragindocomainterfacedo
programa,emboratambmexistammaneirasdeautomatizartestesqueinteragemcoma
interfacecomosefossemusurios.Ostestesdacategorianofuncionaissoexecutadosnas
fasesTestesdedesempenhoetestesdecarga.Comooprprionomediz,nestasfaseso
objetivodescobrirqualolimitedeinformaoqueosistemaconsegueprocessaratque
seudesempenhosejaconsideradoinaceitvel.Depoisdestafasesermaisfcilidentificar
quaisosrequisitosmnimosparaosoftware.Existemaindaoutrasfasescomo,porexemplo,
testesdesistemaetestesdeaceitao.Duranteafasetestesdesistemaostestesso
executadosporalgumquerealmenteentendecomoousurioirtrabalharnodiaadia,pois
nestafaseosistemadeveserusadocomodefatoserusadoquandoestiveremproduo.
Posteriormentevemafasedostestesdeaceitao.Estestestesdevemserexecutadospor
umgruposeletodeusurioquediroseoprogramaaceitvelparaarealidade.

Tcnicasdetestes
Vocviuqueparafacilitarotrabalhodetestarumprojetoforamcriadasfasesdetestescada
umacomoobjetivodedescobrirfalhasdecategoriasdiferentes.
Almdasfases,tambmexistemtcnicasdetestes.Algumasdastcnicasmaispopulares
so:caixabranca,caixapreta,eregresso.Cadaumadestastcnicasfuncionamelhorpara
encontrarfalhasdeumaoumaiscategorias.
Enquantoafasedotestedizqualotipodefalhadeveserprocurada,astcnicasajudama
encontrarasfalhaspropriamenteditas.Porexemplo,duranteafasedetestededesempenho
oobjetivoencontrarfalhasqueocorremquandoosoftwareestivernolimitede
processamentoeatcnicadetestesnofuncionaisamelhorparaencontrarfalhasdesta
categoria.
Astcnicasefasesexistemparafacilitarotrabalhodetestarumsoftwaresemdeixarde
testarnenhumacaracterstica.comosetodasestasfasesetcnicasjuntasformassemum
protocolodetestes,quequandoseguidogarantemumselodequalidadesuperior.
Aseguirvocverumpoucosobreastcnicasdetestesmaispopulares.Estastcnicas
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

4/20

10/11/2015

DevMediaVersoparaimpresso

podemserusadasparaencontrarfalhasdemaisdeumacategoria.

CaixaBranca
Testesdecaixabrancasocriadospelapessoaquetemacessoaocdigofonte,porisso
ficaacargodoprprioprogramadorquecriouaopo.
Esteumtipodetestebemdifundidoentreosdesenvolvedores.Nestetesteoprogramador
devecriarumaclassedetesteparagarantirqueocomportamentointernodeoutraclasse
estejacorreto.Oobjetivogarantirqueaclassetestadafaaoquedevefazersemerros.O
testedecaixabrancatambmconhecidocomotestesorientadosalgica,jqueo
programadorprecisaconhecercomoaclasseasertestadafuncionainternamente.O
resultadodeveserumtestequevalidetodososcaminhospossveistodososifsecases
opcionaiscomestatcnicadetestequeoprogramadorgaranteobomfluxode
informaesdaclassetestada.FrameworkscomoJUniteDUnit,entreoutros,soexemplos
deferramentasparacriartestesdotipocaixabranca.Estesframeworksfacilitamavidado
programador,poisamaioriadotrabalhosujonecessrioparacriarclassesdetestesjest
pronto,restandoparaoprogramadorsimplesmentecriarosmtodosdetestes.ODUnitvem
integradoaoDelphidesdeaverso2005.Maisadiantevoltareiafalarsobreele.Porhora
vejaumexemplodetestecaixabrancafeitocomDUnit,naListagem1.

CaixaPreta
Otestecaixapreta,tambmconhecidocomotestefuncionalocomplementodotestecaixa
brancaeviceversa.
Enquantootestecaixabrancaconcentrasenocomportamentointernodaclasse,oteste
caixapretaconcentrasenocomportamentoexterno.Elessousadosparademonstrarque
asfunesdosoftwaresooperacionais.
Demodogrosseiro,paraexecutarestetipodetestedeveselevantartodasasentradas
possveisparaentopasslasparaosoftwarequevaiprocessaredevolveroresultadoque
sercomparadocomovalorqueseesperaparacadaparmetrodeentrada.
Asentradasvariamdeacordocomaestruturadoprogramaepodemserinfinitas
dependendodocontexto:imaginequantasentradasdiferentesexistemparaumprograma
queaceitaumpontoflutuantecomoparmetro.
Oidealsempretestartodasasentradasexistentes,masquandoistosetornainvivelo
testadordeveescolherumconjuntodeentradasquegarantaumtestemaiscompleto
possvel.
Otestadorquenoprecisasernecessariamenteoprogramadordevegarantirquea
sadadedadosestdeacordocomoesperadoparacadaentrada.Estestestesgeralmente
identificamerrosdecategoriasbemespecficas,como:errodeinicializao,errodeinterface,
errodeconexocomobancodedados,errodeestruturadedados,entreoutros.
Reparequetodosesteserrossoreferentesaocomportamentoexternodoprograma,onde
atcnicacaixapretaatua.

TestesCaixaCinzaenofuncionais
Ostestesdecaixabrancaecaixapretacomplementamumaooutro,poissozinhosnoso
capazesdeidentificartodososerroseriscosqueenvolvemumprograma.Otestecaixacinza
ajunodestesdoistestes.Atcnicadetestesnofuncionaisvisagarantirqueosoftware
funcionamesmoemsituaesextremas.Soostestesnofuncionaisquegarantemobom
comportamentodosistemaquando,porexemplo,aconexocomobancodedadoscair
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

5/20

10/11/2015

DevMediaVersoparaimpresso

inesperadamente.Paraexecutarostestesnofuncionaistambmcomumusarumagrande
quantidadededadosparadescobrirqualolimitedosistema.Apspassarporumaboasrie
detestesnofuncionaisosoftwareprovavelmentesercapazdemanterocontroleda
situaoecontinuarfuncionandomesmoquandoalgoinesperadosairerrado.
Listagem1.Exemplodeumaclassedetestecaixabranca
1unitTestPedidoDao
2interface
3uses
4TestFramework,PedidoDao,Generics.Collections,Pedido
5type
6TestTPedidoDao=class(TTestCase)
7strictprivate
8FPedidoDao:TPedidoDao
9public
10procedureSetUpoverride
11procedureTearDownoverride
12published
13procedureTestPost
14end
15implementation
16procedureTestTPedidoDao.SetUp
17begin
18FPedidoDao:=TPedidoDao.Create
19end
20procedureTestTPedidoDao.TearDown
21begin
22FPedidoDao.Free
23FPedidoDao:=nil
24end
25procedureTestTPedidoDao.TestPost
26var
27Pedido:TPedido
28begin
29CheckEquals(0,FPedidoDao.Count,Abasedeveestarvazia)
30Pedido:=TPedido.Create
31Pedido.Id:=1
32FPedidoDao.Post(Pedido)
33CheckEquals(1,FPedidoDao.Count,Nosalvouoprimeiropedido)
34FPedidoDao.Post(Pedido)
35CheckEquals(1,FPedidoDao.Count,Adicionouduasvezesomesmopedido)
36Pedido:=TPedido.Create
37Pedido.Id:=2
38FPedidoDao.Post(Pedido)
39CheckEquals(2,FPedidoDao.Count,Noadicinouosegundopedido)
40end
41initialization
42RegisterTest(TestTPedidoDao.Suite)
43end.

TestesdeRegresso
Normalmentevocaplicatodosostestesparacadanovaopooualteraodoprojetoe
quandochegaraofinaldeumaverso,todosostestesdevemserexecutadosnovamente
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

6/20

10/11/2015

DevMediaVersoparaimpresso

paragarantirquenenhumaoutraparteparoudefuncionarporcontadasmodificaesfeitas
duranteodesenvolvimentodaverso.
Executartodosostestescriadosdesdeaprimeiraversoumatcnicachamadadeteste
deregresso.
Quandosecriatestesautomatizadosvoctemaopodeexecutlostodosdeumaveza
qualquermomento,paragarantirqueasalteraesnoinfluenciaramoqueestava
funcionando:estamaisuma(enorme),vantagemdostestesunitrios.
Imaginealterargrandespedaosdoprojetoetercertezadequeasoutraspartesnoforam
danificadastestesunitriostornamosoftwaremaismaduroedeixamoprogramadormais
segurodoquefaz.
Testederegressosignificaquetodosostestesjcriadosdesdeaprimeiraversodo
projetoseroexecutadosnovamenteparagarantirquetudosaiucomoesperadoesteum
testenecessrioparagarantirqueasmodificaesnocausaramnovoserros.
Estatcnicanormalmenteusadanofinaldecadaciclodedesenvolvimento.

MetodologiasdeDesenvolvimentogil
Algocomumhojeemdiaencontrarvagasparadesenvolvedorescujoumdosrequisitos
terparticipadodealgumaequipequetrabalhecomdesenvolvimentogil.Metodologiagil
umconceitoquevisatrazerumasriedevantagensparaaequipediminuindoosriscosque
envolvemproduzirumsoftwareetemcomocaractersticaavelocidadecomquenovas
funessoimplementadasquandocomparadacomametodologiaconvencional:semanas
aoinvsdemeses.Umaequipededesenvolvimentogilnormalmentetemcomunicaoem
temporealtantoentreosintegrantesdaequipequantoentreaequipeeaspessoasque
conhecemadefiniodoprogramaporexemplo,osclientes.Paratornaroprocessomais
gilestacomunicaodeveserpreferencialmentefeitafrenteafrenteaoinvsdeusar
documentostalvezporissoabaixadocumentaosejaconsideradaumadesvantagemdas
metodologiasgeis.Umdosprincpiosdosmtodosgeisquetodaalteraodevetrazer
umanovafunoeparaconseguiristoodesenvolvimentodividoempequenosciclos,como
secadaciclofosseumpequenoprojetodentrodoprojetoverdadeiroumnovociclo
iniciadosemprequealgumafunonovaprecisarserimplementadaouumaantigaprecise
seralterada.
Estesciclosenvolvempassosprdeterminados,quemudamdeacordocomametodologia.
Existemdiversosmtodosdedesenvolvimentogileorgoresponsvelporpromoverestes
mtodosoTheAgileAlliance.SegundoositedoTheAgileAlliance,elespromovemos
princpiosdedesenvolvimentogilporqueacreditamqueestasmetodologiastornamo
softwaremaisprodutivohumanoesustentvel.Umadascoisasqueestergofazmantero
TheAgileManifesto(OManifestogil),ondeestdescritoquaissoosvaloreseprincpios
dodesenvolvimentogil.NasessoLinksdoartigoestumlinkparaositedoTheAgile
Alliance,ondeexiste,entreoutrascoisas,oTheAgileManifesto.Comodisse,existemaisde
ummtododedesenvolvimentogil,comoporexemplo:Scrum,DynamicSystem
DevelopmentMethod,FeatureDrivenDevelopment,ExtremeProgramingeTestDriven
Development,entreoutros.AseguirvoufalarumpoucosobreomtodoTestDriven
DevelopmentedepoismostrareioDUnitcomoumaalternativaparacriartestes
automatizados.

TDDTestDrivenDevelopment
TestDrivenDevelopmentquesetraduzcomoDesenvolvimentoOrientadoaTestesou
simplesmenteTDD,assimcomoqualquermetodologiadedesenvolvimentogilcomposta
porpequenosciclosdedesenvolvimentos.
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

7/20

10/11/2015

DevMediaVersoparaimpresso

porpequenosciclosdedesenvolvimentos.
Estesciclossoformadosporcincopassos:1)Criarumteste2)Executaronovoteste3)
Criaranovafuno4)Executarostestesnovamente5)Refatorarocdigo.
Aprimeiracoisaquedeveserfeitaparacomearalteraroucriarqualqueropodentrode
umsoftwareseguindoomtodoorientadoportestes,obviamentecriarumteste.Este
primeirotestedevesercriadoantesdaopoemsi,porestemotivoquandootestefor
executadoaprimeiravezelefalhaobrigatoriamente,jqueaopoaindanoexiste.Depois
distoaopocomeaaserdesenvolvidacomoobjetivodefazerostestespassarem.
Quandotudoestivercertoeotestenofalharmais,chegaahoraderefatorarocdigopara
tornaroprojetomaisflexvelereutilizveldepoisdarefatoraovocpodeexecutaros
testesnovamenteparagarantirqueaopodesenvolvidanoparoudefuncionar.
Esteciclonopodesermuitodemoradonodevepassardequatrosemanaseoideal
seriaumasemana.Seociclodemoramuitoparaterminarostestesdosoutrosintegrantesda
equipecomeamafalharporcontadaopoqueaindanoestconcluda.Estemtodode
desenvolvimentofocadonosrequisitosdosoftware,poisoprogramadorcomea
escrevendotestesvalidandosomenteoquepedeorequisito.Consequentementeaopo
desenvolvidaserbemenxutaeobjetiva,jqueoprogramadorescreveapenasocdigo
necessrioparafazerostestespassarem.
SemperceberoprogramadoracabaseguindoprincpioscomoKISS(KeepItSimpleStupid)
eYouAintGonnaNeedIt(noadicionarfuncionalidadeatquesejanecessrio).

DUnit
Desdeaverso2005oDelphitrazintegradoaoIDEoDUnit.Esteframeworkimplementa
tudooquevocprecisaparacomearaescreverclassesdetestesunitriossemprecisar
configurarnada,poistodoonecessriojestimplementadopeloframework.Asclassesde
testescriadascomDUnitsobemsimples,comodeveriaser.Basicamentetodosostestes
unitriossocriadoscomapenasdoispassos:1)Voccriaoambiente2)Vocexecutaos
testes.
Ostestesunitriosdevemserindependentesentresi,istosignificaquetodosostestes
devemsercapazesderodarsozinhosemqueoutrotestepreciseserexecutadoantes.Alm
disto,ostestesdevemrodarsempresobreasmesmascircunstncias,oquesignificaqueo
testenopodeserinfluenciadoporvariveisexternascomo,porexemplo,umbancode
dadosbagunado.Seforassim,umtestequefuncionahojeporqueobancoestlimpinho,
podenofuncionaramanhquandobancoestiverpovoadoporoutrostestes:poristoobanco
dedadosdevesempreestarlimpoquandootestecomear.Normalmenteoprprioteste
limpaobancodedadosantesdecomear.

comumquecadatesteconfigureoambienteantesdeserexecutado,comoporexemplo,
criaraconexoelimparobancodedadosastarefasnecessriasparacriaroambiente
geralmentesorepetitivasentreostestes.Paraentendermelhoroquesignificaconfiguraro
ambientedeteste,imaginequevocvaitestaroCRUD(cadastro)declientes.
Cadaclientedeveestarnecessariamenteligadoemumaempresa,logoparapodertestaro
CRUDdeclientesnecessrioqueexistapelomenosumaempresacadastrada,poreste
motivo,cadastrarpelomenosumaempresaumexemplodetarefanecessriaparacriaro
ambientedeteste.
Depoisdeconfiguraroambientehoradecriarotestepropriamentedito:istoquevoc
veraseguir.
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

8/20

10/11/2015

DevMediaVersoparaimpresso

Nota
Ogerenciamentodeinformaesdeumcadastrosalvar,buscar,atualizar,excluir
tambmconhecidocomoCRUD.CRUDumacrnimodaumaexpressoinglesa,cujas
letrassignificam:Create(salvar),Retrieve(buscar),Update(atualizar)eDelete(excluir).

PraticandoDesenvolvimentogil
Chegouomomentodejuntartudoquevocviuatagora,paraistovousimularo
desenvolvimentodoCRUDdeclientes.
OsrequisitosdestafunoforamdefinidosnaListagem2.Comosrequisitosdefinidos,resta
apenascomearacodificarcomosetratadeumprojetodesenvolvidobaseadoemtestes,a
codificaosemprecomeapelostesteseoobjetivodotestesempregarantirqueest
sendofeitotudoqueosrequisitosmandam.
NaFigura1estodiagramadeclassescomasentidadesnecessriasparacriaroCRUD.
Comcerteza,possvelcriarumdesignmelhorparaestaaplicao,implementando
padrescomoCommandouTableDataGateway.
Istoprovavelmentetornariaoexemplomaisempolgante,pormserianecessrioexplicar
muitosobrecoisasqueapesardesereminteressantesnosorelevantesparaofocodo
artigo.
ParacriaroCRUDdeclientessomenteduasclassesserocriadas:TClienteeTClienteDao
todasasoutrasclasses,comoporexemplo,TEntidade,TEmpresaeTDaojexistemno
projeto.AclasseTDaoumaclasseabstrataqueimplementaasoperaesbsicaspara
manipularumatabela:Salvar,Buscar,ExcluireListar.
Almdistotambmdeclara(masnoimplementa),doisoutrosmtodos,soeles:
AntesDeSalvarparavalidarasinformaesqueserosalvaseAntesDeExcluirparaverificar
seumregistrorealmentepodeserexcludo.
TDaonoimplementaestesmtodosporqueelanopodeprevertodosostiposde
informaesqueserosalvas:TCliente,TEmpresa,entreoutras.
Mesmoquepudessepreverseriaumcaostestartudodentrodamesmaclasse,poristo
TDaoabstrata.
Sendoassim,deveexistirumasubclassedeTDaoparacadatipodeinformao.
Porexemplo,paramanipularatabeladeclientevaiexistirumasubclassechamada
TClienteDaoeparaatabeladeempresavaiexistirTEmpresaDao.
SoassubclassesdeTDaoqueimplementamosmtodosAntesDeSalvareAntesDeExcluir.
AclasseTDaosempreinvocaomtodoAntesDeSalvarantesdesalvarumregistroe
AntesDeExcluirantesdeexcluirumregistro.
Estesmtodosporsuavezdevemgerarumaexceocasoarespectivaoperaono
puderserexecutada.
Porexemplo,omtodoAntesDeSalvardaclasseTClienteDaodevegerarumaexceoseo
clienteestiversemrazosocial.

Agoraquevocjestfamiliarizadocomasclassesdoprojeto,estnahoradeimplementar
oCRUDdeclientes,paraistoprimeiroostestesdevemsercriados.
VejaaseguircomocriarumaclassedetesteunitriocomDUniteentendacomoela
funciona.
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

9/20

10/11/2015

DevMediaVersoparaimpresso

Listagem2.RequisitosparaoCRUDdeclientes
1.Oclientedeveestarligadoaumaempresa
2.NopodemexistirdoisclientescomomesmoCPFparaamesmaempresa
3.Ousuriopreencheapenasonomeeendereodocliente.

[abririmagememjanela]

Figura1.ClassesenvolvidasnoproblemaCRUDdeclientes

Primeiroostestes
TodotestebaseadopuramentenalistaderequisitosefoilendoosrequisitosdaListagem
2quedescobriquesernecessriocriarduasnovasclasses:TClienteeTClienteDao.Como
setratadeumprojetoorientadoatestes,ostestesdevemsercriadosantesmesmodecriar
asclassesenvolvidasnoproblema:poristoaprimeiraversodostestesvaifalhar
obrigatoriamente.
Mascomoescreverumtesteparaumaclassequenoexiste?Existemduasalternativas.A
primeiraseriacriarostesteseimplantarumafalhapropositalmenteparaindicarqueas
classesaindanoforamcriadas(vejaexemplonaListagem3).Asegundaalternativacriar
asclassesqueserotestadas,masnoimplementarnenhumalgica,ouseja,voccriaas
classesedeclaraosmtodos,masnoimplementanenhumdeles.destaformaquemostro
aseguir.
ParacomearvoucriarasclassesTClienteDaoeTCliente,pormnovouimplementar
nenhumalgica.Issogarantequeotestevaicompilar,jqueaclasseTClienteDaoetodos
seusmtodosforamdeclarados,pormotestevaifalhar,poisnoimplementeinenhumdos
mtodosdaclasse.VejanaListagem4aclasseTClienteenaListagem5aclasse
TClienteDao.
Agoraqueasclassesnecessriasexistem,possvelcriaroteste.Paraexecutarostestes
necessrioqueexistaumainterfaceparamostraroresultadodostestesexecutados.Esta
interfacejestprontaeparauslavocsprecisacriarumnovoprojetoespecficopara
executartestes.ParacriarumprojetodetestesnoDelphi2010vocdeveescolheraopo
TestProjectnajanelaNewItems,comoaparecenaFigura2.AoclicaremOk,apareceum
pequenoassistentecomdoispassos:noprimeiropassovocpoderescolheronomeeo
localondeoprojetodetestesersalvoenosegundopassoapenascliqueFinish.Voc
podesalvaroprojetodetesteemqualquerlocal,masnormalmenteelesalvodentrodeuma
pastachamadaTestnodiretriodoprojetoverdadeiro(aquelequesertestado).
Listagem3.Exemplodeumaclassedetestevazia
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

10/20

10/11/2015

DevMediaVersoparaimpresso
1unitTestClienteDao
2interface
3uses
4TestFramework
5type
6TestTClienteDao=class(TTestCase)
7published
8procedureTestVazio()
9end
10implementation
11procedureTestTClienteDao.TestVazio
12begin
13Fail(AclasseTClienteDaoprecisasercriada)
14end
15initialization
16RegisterTest(TestTClienteDao.Suite)
17end.

Listagem4.AclasseTCliente
1unitCliente
2interface
3usesEmpresa,Entidade
4type
5TCliente=class(TEntidade)
6public
7Empresa:TEmpresa
8RazaoSocial:string
9Cpf:string
10Endereco:string
11end
12implementation
13end.

Listagem5.OesqueletodaclasseTClienteDao
1unitClienteDao
2interface
3usesDao
4type
5TClienteDao=class(TDao)
6end
7implementation
8end.

[abririmagememjanela]

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

11/20

10/11/2015

DevMediaVersoparaimpresso

Figura2.Criandoumprojetodetestes

Aoexecutaroprojetodeteste(criadonopargrafoanterior),oformulriodaFigura3vai
aparecer.EstaainterfacedoDUnit:nesteformulrioqueostestessoexecutadoseos
resultadosseroexibidos.Vocnoprecisamudarouconfigurarmaisnada,tudojest
pronto,portanto,voucriaraprimeiraclassedetesteunitrio.

EstendendoTTestCase
Paraescreverostesteseudevovoltaraosrequisitos(Listagem2),eemumafolhadepapel
euescrevotodosostestesnecessriosparagarantirquenenhumrequisitoseresquecido.
VejanaListagem6quaissoostestesqueeuencontreiparaalistaderequisitosda
Listagem2.
Depoisdedefinirostestespodemsercodificados.ODelphipossuiummodeloparaclasses
detesteseparausarestemodelobastacriarumTestCase,queaparecenaFigura2.
QuandopedirparacriarumTestCase,oDelphimostrarumassistente,comdoispassos:
noprimeiropassovocescolheaunitondeestaclassequedesejatestarenosegundo
passovocsimplesmenteclicaemFinish.
NesteexemplooarquivoClienteDao.passertestado,poisoobjetivotestaraclasse
TClienteDaoqueexistedentrodele.FinalizandooassistenteoDelphimostraanovaaclasse
detesteTestTClienteDaoestaaclassedetesteunitrioquevaitestaraclasse
TClienteDao.
VejanaListagem7comoaclasseTestTClienteDaoapareceassimqueoassistentepara
adicionarumTestCaseconcludo.
Notenalinha6queaclasseTestTClienteDaoestendedeTTestCase.Estaumaclassedo
frameworkDUnittodososseustestesunitriosdevemestenderdelaparapoderfuncionar.
Naverdadeestaclassefazmuitomaisdoquesimplesmentepermitirqueostestes
funcionem.AclasseTTestCasetemamaioria(senotodos)osmtodosquevocprecisa
paracriarumteste.
OsdoisprimeiromtodosdaclasseTTestCasequevocprecisaconhecerso:SetUpe
TearDown.OmtodoSetUpexecutadoantesdecadatesteeomtodoTearDowndepois
decadatesteessacaractersticatornaestesmtodosideaisparaconfiguraroambientede
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

12/20

10/11/2015

DevMediaVersoparaimpresso

testecomocitadonotpicoDUnit.
ReparequeoDelphisugeriuumaimplementaoparaestedoismtodos:noSetUpcriada
umainstnciadaclasseTClienteDao(classequesertestada),enoTearDownainstncia
destruda.
Sefossenecessriocriaralgumaconexocomobancooufazeralgumaconfiguraoextra
antesdeexecutarostestes,nestemtodoqueestasaesdevemserexecutadas.

Listagem6.TestesparaosrequisitosdaListagem2
1.Nopodeexistirumclientesemempresa
2.NopodemexistirdoisclientescomomesmoCPFparaamesmaempresa
3.Ocamporazosocialobrigatrio.
4.Ocampoendereoobrigatrio.

Listagem7.TesteunitarioparaTClienteDaocriadapeloDelphi
1unitTestClienteDao
2interface
3uses
4TestFramework,Cliente,Dao,ClienteDao
5type
6TestTClienteDao=class(TTestCase)
7strictprivate
8FClienteDao:TClienteDao
9public
10procedureSetUpoverride
11procedureTearDownoverride
12end
13implementation
14procedureTestTClienteDao.SetUp
15begin
16FClienteDao:=TClienteDao.Create
17end
18procedureTestTClienteDao.TearDown
19begin
20FClienteDao.Free
21FClienteDao:=nil
22end
23initialization
24RegisterTest(TestTClienteDao.Suite)
25end.

[abririmagememjanela]

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

13/20

10/11/2015

DevMediaVersoparaimpresso

Figura3.AinterfacedoDUnitparaexecutartestes

Paracomearcomaimplementaodostesteseuvouconfigurarmelhoromeuambiente
deteste,poristo,voualteraraimplementaodomtodoSetUp(vejaanovaimplementao
naListagem8).AssimcomonaimplementaosugeridapeloDelphi,umainstnciade
TClienteDaocontinuasendocriada,maseuadicioneialgumasinstruesmaisinteressantes.
Vejanalinha4,queomtodoCheckEqualsexecutadoparagarantirnoexistenenhum
clientecadastrado,poisistopoderiaatrapalharoteste.
OmtodoCheckEqualsmaisumdosmtodosdaclasseTTestCase.Estemtodovai
checarseovalordoprimeiroparmetroigualaovalordosegundoparmetro:seelesforem
diferentesotestefalhalogovocvercomoidentificarseumtestefalhououno.Oterceiro
parmetrodestemtodoqueopcionalindicaqualamensagemqueserexibidacasoa
checagemfalhe,ouseja,casooprimeiroparmetrosejadiferentedosegundoparmetro.A
classeTTestCasedisponibilizavriosmtodosquecomeamcomCheck,cadaumdeles
temumobjetivodiferente:dumaolhadanaclasseTTestCaseparavertodososmtodosde
checagemexistentenosomuitos.
DepoisdeinstanciarTClienteDaoecertificardequenoexistemclientescadastrados,a
vezdeinstanciarumobjetodeTEmpresaDaoecadastrarumaempresaqueserusada
duranteostestes.
MasumavezusoCheckEquals,pormdestavezeleusadoparacertificarqueanova
empresarealmentefoicadastradanotequeagoraoterceiroparmetronoestsendo
usado.OltimodetalheantesdecriarostestessobreomtodoNovaEmpresa.Cadastrar
empresaumatarefaquepodeserrepetidavriasvezesaolongodostesteseomtodo
NovaEmpresadevefacilitaristoreparequeelejfoiusadoumaveznalinha6.

Nota
Todaclassedeveriateroutraclassedetestesespecficaparaela,masnesteexemploeu
crieiumtesteapenasparaclasseTClienteDao.FizistoporqueaclasseTClienteapenas
declaraatributosenotemnadaqueprecisesertestado.Navidareal,emumprojeto
maisrobusto,tambmserianecessriocriarumaclassedetestesparaTCliente.

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

14/20

10/11/2015

DevMediaVersoparaimpresso

Revisocomochegamosataqui?
PrimeirohouveanecessidadedecriaroCRUDdeclientesparaumprojetoquejexistia.Os
requisitosparaesteCRUDforamdefinidoseemseguidafoicriadooesqueletodasclasses
necessriasparatalfuno.Oesqueletoeraasclassescomadeclaraodosmtodossem
aimplementao:omnimonecessrioparapoderexecutarostestessemcriarerrosde
compilao.
Apartirdalistaderequisitosfoicriadaoutralista:alistadetestes.
Nestalistaforamescritostodosostestesnecessriosparagarantirqueaclasse
TClienteDaofuncionedeacordocomosrequisitos.
Qualquertestequenoestejavalidandoumrequisitodesperdciodetempo.
Osegundopassofoicriaroprojetodetestes.Normalmente,paraumprojetoemandamento
oprojetodetestesjestariacriado,masfizquestodeexplicarcomocrilo.
Comoprojetodetestescriado,foiadicionadoumTestCaseparaaclasseTClienteDao.
DepoisoambientedetestefoiconfiguradomodificandoosmtodosSetUpeTearDown.
Agoravemapartemaisinteressante:criarosmtodosdetestespropriamentedito.
Existirotantosmtodosdetestequantosforamostestesdefinidosparavalidaros
requisitos.Vejaaseguircomocriareexecutarostestes.

Listagem8.OmtodoSetUpdefinitivo
1procedureTestTClienteDao.SetUp
2begin
3FClienteDao:=TClienteDao.Create
4CheckEquals(0,FClienteDao.Listar.Count,Esperasequeatabelade
clientesestejavazia.)
5FEmpresaDao:=TEmpresaDao.Create
6FEmpresa:=NovaEmpresa(1,Empresa1)
7FEmpresaDao.Salvar(FEmpresa)
8CheckEquals(1,FEmpresaDao.Listar.Count)
9end
10functionTestTClienteDao.NovaEmpresa(Id:IntegerNome:string):TEmpresa
11begin
12Result:=TEmpresa.Create
13Result.Id:=Id
14Result.RazaoSocial:=Nome
15end

Criandomtodosdeteste
DeacordocomaListagem6devemexistirquatromtodosdetestes.VejanaListagem9
comootestenmero3daListagem6foitransformandoemmtododetesteparaaclasse
TestTClienteDao:foicriadoomtodoTestCampoRazaoSocialEhObrigatorio.
recomendadoqueostestestenhamumnomequedeixebemclarooqueeleesttestando,
poristoumnometogrande.
Osmtodosdetestessobemsimplesdeentender:vocexecutaalgumacoisaeem
seguidaexecutaummtodoCheckparagarantirqueoquevocexecutourealmente
funcionou.Porexemplo,entreaslinhas6e10tentasecadastrarumclientesemrazosocial.
Ocomportamentoesperadoqueoclientenosejacadastrado,poristonalinha11um
CheckEqualsexecutadoparagarantirquenenhumclientefoicadastrado.
Esteprimeirotestetentacadastrarumclientesemrazosocialeistoprovavelmentedeve
gerarumaexceo.Poristootry..exceptentreaslinhas7e10.Estetry..exceptesconde
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

15/20

10/11/2015

DevMediaVersoparaimpresso

qualquerexceoquepossivelmentevaiexistirquandoumclientesemrazosocialtentarser
cadastrado.
Depoisdegarantirqueumclientesemrazosocialnopodesercadastrado,chegouahora
degarantirqueumclientecomrazosocialpoder.
Istoacontecenaslinhas13e14notequedestaveznofoiusadotry..except.Nalinha15
umnovoCheckEqualsexecutadoparagarantirqueexisteumnovoclientecadastrado.
Antesdeexecutaroteste,necessriodestacarqueagoraexistemdoisprojetosque
funcionamemparalelo:umprojetoaaplicaodeverdadeeoutroprojetoserveapenas
paraexecutarosteste.Estesegundoprojetoaquelequeexpliqueicomocriarnotpico
Primeiroostestes.Umavezqueexistemdoisprojetos,vocdeveadicionarmanualmente
noprojetodetestetodasasunitsnecessriasparafazlocompilar.Nesteexemplo,foi
necessrioadicionarasunitsTDao,TEmpresaDao,TEmpresaeTEntidade(vejadiagramana
Figura1).AsclassesTClienteDaoeTClienteforamadicionadasautomaticamentequando
crieiaTestCasenotpicoEstendendoTTestCase.
Feitaestaobservao,vocestpontoparasaberquesprecisapressionarF9para
executaraaplicaodetesteseapartirdela,executarotestecriadonaListagem9.Vejana
Figura4aimagemdaaplicaodetesteapsexecutarostestes.Existemalgumas
observaesimportantessobreasinformaesqueaparecemnoformulriodaFigura4.
AprimeiracoisaquesomenteomtodoTestCampoRazaoSocialEhObrigatoriofoi
reconhecidocomosendoummtododeteste.

Osoutrosmtodoscomo,porexemplo,NovaEmpresaeNovoClientenoforam.Isto
aconteceporqueosmtodosdetestedevemestardeclaradosnasessopublished.Todos
osmtodosnestasessoseroreconhecidoscomomtodosdetestes.
Listagem9.Seuprimeiromtododeteste
1procedureTestTClienteDao.TestCampoRazaoSocialEhObrigatorio
2var
3Cliente:TCliente
4begin
5{Tentasalvarumclientesemnome.}
6Cliente:=novoCliente(1,,11111111111,RuaX,FEmpresa)
7try
8FClienteDao.Salvar(Cliente)
9except
10end
11CheckEquals(0,FClienteDao.Listar.Count,Salvouclientesemnome)
12{Salvaclientecomumnomevlido}
13Cliente:=novoCliente(1,Miguel,11111111111,RuaX,FEmpresa)
14FClienteDao.Salvar(Cliente)
15CheckEquals(1,FClienteDao.Listar.Count,Nosalvouclientecomnome
vlido.)
16end
17functionTestTClienteDao.NovoCliente(Id:IntegerNome,Cpf,Endereco:
string
18Empresa:TEmpresa):TCliente
19begin
20Result:=TCliente.Create
21Result.Id:=Id
22Result.RazaoSocial:=Nome
23Result.Cpf:=Cpf

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

16/20

10/11/2015

DevMediaVersoparaimpresso
24Result.Endereco:=Endereco
25Result.Empresa:=Empresa
26end

[abririmagememjanela]

Figura4.Executandoostestes

Outrainformaoimportantequetodosostestesfalharam(nestecasosexisteum).Mas
istojeraesperado,poisaindanoexistenenhumalgicanaclasseTClienteDao.Repare
queamensagemSalvouclientesemnomeaparecenapartedestacadadaimagem.Para
resolveresteproblemaeudevoirataclasseTClienteDaoeimplementaromtodo
AntesDeSalvarparatestarseoclientepossuiounopossuirazosocial.Vejaestaalterao
naListagem10.
DepoisdealteraraclasseTClienteDao,otestedevepassarporm,antesdeexecutlo
maisumavezparagarantiristo,euvoudeclararosdemaismtodosdetestedefinidosna
Listagem6.VejaadeclaraodestesmtodosnaListagem11.Parapouparespaoeuno
vouimplementarestesmtodosdeteste,vouapenasfazeradeclaraoeforarafalhadeles
comumamensagemindicandoqueelesaindanoforamimplementados.Agoraaoexecutar
ostestesnovamente,oresultadoseroqueaparecenaFigura5.
possvelnotarnestafiguraqueaalteraofeitanaclasseTClienteDaoteveumefeito
positivo,poisotesteTestCampoRazaoSocialEhObrigatorioparoudefalhar.Poroutrolado
osdemaistestesestofalhandopropositalmenteporqueaindanoforamimplementados.
Implementarestesmtodosumbomexerccioparacolocaremprticaoqueesteartigo
ensina:baixeoarquivodesteartigoeimplementeosmtodosdetestesqueestofalhando.

Coberturadecdigo
Coberturadecdigoumatcnicausadaparaverificarseostestesquevoccriou
deixaramalgumacoisasemtestarparatrs,ouseja,umatcnicaparadescobrirquantas
linhasdecdigosnoforamcobertaspelostestesescritos.Discoverumprogramaopen
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

17/20

10/11/2015

DevMediaVersoparaimpresso

sourceusadoparamedirquantaslinhasdecdigofaltamsercobertas.Elenoprecisaser
instalado,bastaexecutloparapoderusar.
ParausaroDiscovervocprecisadoarquivodedetalhamentodoprojetocujopercentualde
coberturasercalculado.EstearquivocriadoquandoaopoMapfiledoDelphiest
habilitada.ParaconfiguraroDelphiparacriaroarquivodedetalhamentovocdeveabriro
projetonoDelphiedentrodeProject+OptionsvocdeveescolherDetailedparaoitem
MapfiledasessoLinkingVejanaFigura6.
Listagem10.AlterandoTClienteDaoparafazerotestepassar
1procedureTClienteDao.AntesDeSalvar(Obj:TEntidade)
2begin
3ifTrim((ObjasTCliente).RazaoSocial)=then
4raiseException.Create(onomedoclienteobrigatrio.)
5end

Listagem11.Osdemaismtodosdeteste
1procedure
TestTClienteDao.TestNaoPodeExistirDoisClienteComOMesmoCpfNaMesmaEmpresa
2begin
3Fail(Precisaimplementarestemtodo)
4end
5procedureTestTClienteDao.TestNaoPodeExistirUmClienteSemEmpresa
6begin
7Fail(Precisaimplementarestemtodo)
8end
9procedureTestTClienteDao.TestCampoEnderecoEhObrigatorio
10begin
11Fail(Precisaimplementarestemtodo)
12end

[abririmagememjanela]

Figura5.Executandoostestesnovamente

[abririmagememjanela]

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

18/20

10/11/2015

DevMediaVersoparaimpresso

Figura6.ConfigurandooDelphiparageraroarquivo.map

Estaconfiguraodeveserfeitanoprojetodetestesenonoprojetoverdadeiro.Depoisde
configuraroMapFile,sernecessrioexecutaroprojetoumavezparaqueoarquivo.map
sejacriado.Apsexecutlo,oDelphinosermaisnecessrioesepreferirpoderfechlo.
AgoraotrabalhorestantefeitonoDiscover.Paradescobriropercentualdecdigoainda
nocobertopelostestes,executeoDiscover,cliquenomenuProject+Loadeselecioneo
arquivo.dprdoprojetodetestes(aquelequefoiconfiguradooarquivo.map).Depoisde
carregaroprojetoparaoDiscover,jpossvelexecutaraaplicaoescolhendoomenu
Application+RundoDiscover.Quandooprojetodetestesforiniciarbastaexcutalo
normalmentecomofoifeitonotpicoCriandomtodosdeteste.Depoisdeexecutaros
testesoDiscovermostraropercentualdecdigocoberto.Aseguirvocvaiaprenderaler
asinformaesqueoDiscovergerou.DentrodaguiaRoutines(Figura7)doDiscover,estar
onomedetodasasrotinasdoprogramaeopercentualdecoberturadecadaumao
percentualdecoberturaaparecesomentedepoisquevocexecutaraaplicao,como
expliqueinosdoisltimospargrafos.
Aoclicarnonomedeumadasrotinasserexibidodoladodireitoocdigofonte,comum
Xaoladodalinhaquenofoiexecutadoainda.
AguiaOverview(Figura8)apresentaoutropontodevistadocdigo.Estaguiamostraa
aplicaodeumpontodevistaglobal.

[abririmagememjanela]

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

19/20

10/11/2015

DevMediaVersoparaimpresso

Figura7.AguiaRoutinesdoDiscover

Todasasrotinassorepresentadasporumpequenoquadradoqueaparecenopainel
esquerdo.
Cadaquadradoterumacorindicandoopercentualdecobertura:ovalorpercentualque
cadacorrepresentaaparecenaparteinferirdopainelesquerdo.Clicandoemumdos
guardados,aparecenopaineldireitoapartedocdigofontequeelerepresenta.

[abririmagememjanela]

Figura8.AguiaOverviewdoDiscover

Concluso
Testarpartedodesenvolvimentodesoftwaretoimportantequantocodificar.As
tcnicasapresentadasnesteartigosoapenasalgumasdasexistentes.Paraaquelesque
pretendemseaprofundarnapartetericadoassuntoeurecomendoaleituradeumbomlivro
paraterconhecimentodetodasasdemaistcnicasefasesexistentes.

http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=3&artigo=3150&revista=impressao_125#a3150

20/20