Professional Documents
Culture Documents
15/12/2007
Agenda
Conceito de Testes de Unidade Junit EasyMock DbUnit Desenvolvimento Guiado por Testes - TDD
Testes de So t!are
" um t#pico importante e vital no desenvolvimento de so t!are Todo mundo sabe $ue testes precisam ser eitos E%iste uma $uantidade enorme de aspectos $ue precisam ser testados em um sistema
Testes de So t!are
& sistema deve passar por diversos tipos de teste antes de entrar em produ'(o
Testes de So t!are
Atividade comple%a Manipula uma grande $uantidade de elementos abstratos )nclus-es de novas uncionalidades podem in luenciar nas ,. e%istentes Muitas ve/es 0 di +cil ter certe/a $ue o c#digo est. totalmente correto at0 $ue ele se,a e%ecutado Geralmente os desenvolvedores do pro,eto possuem di erentes n+veis de 1abilidades
Testes de So t!are
Mesmo tendo recon1ecida import2ncia no desenvolvimento de so t!are3 os teste costumam ser vistos como uma atividade c1ata e repetitiva
Testes de So t!are
Muitos pro,etos assumem $ue o c#digo desenvolvido est. livre de erros e postergam os testes para as ases inais do desenvolvimento
6re erem remediar do $ue prevenir 4Est. tudo pronto3 s# alta testar5
Como ter certe/a de $ue o c#digo escrito a/ o $ue deveria a/er e n(o cont0m erros7 Abordagens comumente usadas
Escreve-se um m0todo main $ue c1ama o m0todo escrito e veri ica-se o retorno Espera-se $ue a uncionalidade este,a pronta e reali/ase um teste uncional manual 8(o 0 poss+vel a reali/a'(o de testes de regress(o
8(o s(o gerados relat#rios sobre a e%ecu'(o dos testes Testes n(o s(o e%ecutados de maneira isolada
Testes de Unidade
Unidades de trabal1o s(o testadas de maneira isolada 6ossuem nature/a di erente dos testes de integra'(o e de aceita'(o
&b,etivos
:eri icar se um peda'o de c#digo a/ o $ue o desenvolvedor ac1a $ue ele a/ :eri icar se um peda'o de c#digo SEM6;E a/ o $ue o desenvolvedor ac1a $ue ele a/ )denti icar bugs prematuramente 6ermitir $ue novas uncionalidades se,am adicionadas sem comprometer as ,. e%istentes Diminuir o impacto das re atora'-es de c#digo
6ermite uma grande cobertura dos testes 6ode acilmente simular condi'-es de erro Mel1ora o trabal1o em e$uipe
6ermite ao desenvolvedor entregar c#digo de $ualidade <testado= sem esperar $ue outras partes este,am prontas 4Algu0m5 assistindo a altera'(o>inclus(o de novas uncionalidades
:antagens
?uando 1. algum erro3 te di/ o m0todo $ue al1ou e o motivo da al1a Testes de unidade s(o os primeiros 4clientes5 do c#digo Aprendi/agem por e%emplos
Mel1ora a implementa'(o
:antagens
S(o acilmente incorporados na )ntegra'(o Cont+nua ;elat#rios sobre a corretude do c#digo e a cobertura dos testes s(o gerados de maneira autom.tica
Junit
*rame!ork de teste criado por Eric1 Gamma e @ent Aeck 6ossui uma api bastante .cil e simples ;apidamente se tornou o rame!ork padr(o para testes em Java 6ossui suporte para diversas erramentasB Eclipse3 Maven3 Ant3 etcCCCC
Junit
*oram desenvolvidas diversas e%tens-es para acilitar os testes de partes espec+ icas de um pro,eto
Escrevendo os Testes
public class Calculadora { public int somar(int op1, int op2) { return op1 + op2; } }
Escrevendo os Testes
import static org.junit.Assert.*; import org.junit. est; public class estCalculadora {
! est public "oid test#omar() { Calculadora calc $ ne% Calculadora(); int resultado $ calc.somar(2, &); assertEquals(', resultado); } }
&utros Asserts
"oid assert()uals(*bject e+pected, *bject actual) "oid assert rue(boolean condition) "oid assert,alse(boolean condition) "oid -ail() "oid assertArra.()uals(*bject/0 e+pecteds, *bject/0 actuals) "oid assert1ull(*bject object) "oid assert1ot1ull(*bject object) "oid assert()uals(#tring message, *bject e+pected, *bject actual)
Aoas 6r.ticas
Cada classe do sistema deve ter sua pr#pria classe testadora Cada m0todo do sistema deve ter seu pr#prio m0todo testador & nome das classes testadoras devem seguir o padr(o Test8omeClasseTestada
Aoas 6r.ticas
6adr(o do Maven
Classe Usuario
public class 2suario { pri"ate #tring nome; pri"ate 3nteger idade; 44get e set... }
:alida'(o de um Usu.rio
public boolean "alidar2suario(2suario usr) { i- (usr.get3dade() 5 6 77 usr.get1ome().lengt8() 5 2) { return true; } return -alse; }
Testando a :alida'(o
! est public "oid test9alidar2suario() { 2suario usuario $ ne% 2suario(); usuario.set3dade(1:); usuario.set1ome(;Cejug;); boolean resultado $ ne% 2suario<anager()."alidar2suario(usuario); assertTrue(resultado); }
Testando a :alida'(o
! est public "oid test9alidar3n"alido() { 2suario usuario $ ne% 2suario(); usuario.set3dade(1:); usuario.set1ome(;;); boolean resultado $ ne% 2suario<anager()."alidar2suario(usuario); assertFalse(resultado); }
A maioria dos m0todos de um sistema possui dependDncias e%ternas E classe Umas das principais caracter+sticas dos testes de unidade 0 o isolamento das unidades testadas
As dependDncias n(o precisam estar prontas para $ue o m0todo se,a testado
6ara isolar os m0todos testados3 as dependDncias devem ser substitu+das por dependDncias 4 alsas5
&b,etos Mock
8a reali/a'(o dos testes <em tempo de e%ecu'(o=3 as dependDncias s(o substitu+das por ob,etos Mock
)n,e'(o de dependDncia
EasyMock
Aiblioteca para gera'(o din2mica de Mocks Gera ob,etos mock $ue implementam $ual$uer inter ace da aplica'(o
EasyMock
?uais os argumentos $ue o mock deve receber do m0todo testado ?ual deve ser o retorno do m0todo c1amado Se a c1amada deve lan'ar alguma e%ce'(o
Utili/ando Mocks
FCCriar o mock da inter ace a ser simulada GCCon igurar o comportamento do mock HC*a/er com $ue a unidade testada utili/e o ob,eto mock ao inv0s da dependDncia original
FC)n,etar o Mock
ICC1amar a unidade a ser testada JC:eri icar o valor retornado KC:eri icar se a unidade testada colaborou corretamente com o mock
Utili/ando Mocks
44 1. criando o moc> 2suario=A* moc> $ (as.<oc>.createMock(2suario=A*.class);
Utili/ando Mocks
44 2. con-igurando o comportamento do 44 moc> 2suario usuario $ ne% 2suario(); usuario.set3dade(2'); usuario.set1ome(;Ca-? com apioca;); moc>.inserir2suario(usuario); (as.<oc>.replay(moc>);
Utili/ando Mocks
44 &. 3njetando o <oc> 2suario<anager manager $ ne% 2suario<anager(); manager.set2suario=A*(moc>); 44 @. c8amando o m?todo a ser 44 testado manager.inserir2suario(usuario);
Utili/ando Mocks
44 '. 9eri-icando o comportamento do 44 m?todo assertNotNull(usuario.get=ataCadastro()); 44 A. 9eri-icando se o m?todo 44 usuario=ao.inserir() -oi c8amado com o 44 usuBrio passado (as.<oc>.verify(moc>);
Sempre utili/e in,e'(o de dependDncias em suas classes Acesse as dependDncias atrav0s de suas )nter aces e n(o atrav0s da implementa'(o Ten1a bem de inido $ual o comportamento de seus m0todos nas intera'-es com as dependDncias
Como ter certe/a de $ue seu c#digo de acesso a dados est. lendo e escrevendo corretamente na base de dados7 " necess.ria uma integra'(o com o banco de dados na reali/a'(o dos testes
?uando eita de orma n(o autom.tica3 a veri ica'(o depende da inspe'(o visual do conte9do da base de dados
6ara automati/ar os testes duas condi'-es tem $ue ser satis eitas
& conte9do da base de dados tem ser con1ecido no in+cio de cada teste Deve ser poss+vel veri icar o conte9do da base de dados ap#s cada teste
DbUnit
E%tens(o do Junit especiali/ada em testes integrados ao banco de dados 6ermite o controle do conte9do arma/enado na base de dados
& conte9do da base de dados 0 con igurado atrav0s de DataSet no ormato MMN 6or de ault3 antes de cada teste a base de dados 0 esva/iada e re-populada com o conte9do do DataSet
Cdataset5 C2suario codigo$;D1; nome$;jose-ino; idade$;26; 45 C2suario codigo$;D2; nome$;maria; idade$;@6; 45 C2suario codigo$;D&; nome$;jose; idade$;@6; 45 C4dataset5
)DatabaseConnection getConnection<=
;etorna uma cone%(o com a base de dados ;etorna o DataSet para o povoamento da base de dados
)DataSet getDataSet<=
;eali/ando o Teste
Montar o<s= par2metro<s= para a busca Criar o retorno esperado de acordo com o DataSet de povoamento da base de dados ;eali/ar a busca :eri icar se o resultado da busca 0 igual ao resultado esperado
! est public "oid test#elecionar2suarios() { #tring parametroIusca $ ;jose;; FistC2suario5 esperado $ ne% Arra.FistC2suario5(); esperado.add(ne% 2suario(D&F)); esperado.add(ne% 2suario(D1F)); FistC2suario5 retorno usuario=A*. selecionar2suarios(parametroIusca); } assertEquals(esperado, retorno);
A escrita de testes a,uda na mel1oria do design do c#digo Ao se perceber os bene +cios dos testes3 a tendDncia 0 escreve-los o $uanto antes Com o alcance da maturidade3 durante a implementa'(o de um m0todo o desenvolvedor ,. imagina como ir. testa-lo
TDD
?uanto mais cedo os testes s(o implementados3 maiores s(o os bene +cios
Evita $ue bugs se espal1em pela aplica'(o e os tornam mais .ceis de ser corrigidos
TDD
A regra b.sica do TDD 0 somente escrever c#digo se e%istir algum teste al1ando
Somente o c#digo estritamente necess.rio para a/er o teste passar deve ser escrito
:antagens do TDD
Antes mesmo de come'ar a implementar o m0todo3 o desenvolvedor ,. tem de inido $ual ser. seu comportamento & c#digo ,. nasce sem v+cios de design Evita $ue bugs se,am adicionados ao c#digo
:antagens do TDD
Duvidas777
Contato
abricioClemosOgmailCcom discussaoOce,ugCdevC,avaCnet
;e erDncias
:incent Massol
E%treme 6rogramming