Você está na página 1de 6

Testes Unitrios

Veja nesse artigo de Paulo Quicoli, como trabahar com testes unitrios, utilizando o framework DUnit.
0

Os testes unitrios visam realizar testes automatizados para suas classes. Esses testes por serem automatizados do segurana para que se faam alteraes sem aquele medo de ter quebrado algo no sistema. Quem aqui nunca fez uma alterao que arrumou uma coisa e sem querer estragou outra? Os testes unitrios atuam justamente nesse ponto, se voc faz algo que causa alguma conseqncia inesperada em alguma outra parte do sistema, que as vezes voc nem se lembra, os testes vo pegar a falha.

Ferramentas de apoio
Quando participei em 2004 da conferncia Extreme Programming Brasil eu era um dos poucos desenvolvedores Delphi l. Porm os conceitos e provas de conceito apresentados podem ser aplicados a qualquer equipe de desenvolvimento independente de linguagem utilizada. Sobre testes unitrios foi provado que:

Do segurana, apoio, para que alteraes seja realizadas de forma mais dinmica Do coragem ao desenvolvedor para encarar as alteraes solicitadas Do base para entrega de um sistema sem bugs

As ferramentas que do suporte a esse tipo de teste inicialmente surgiram para o Java e posteriormente foram traduzidas para outras linguagens e ambientes populares como Delphi e .NET. Se em Java temos o JUnit, para Delphi win32 temos o DUnit e para .NET temos o NUnit.

DUnit
Vamos focar o artigo de hoje no DUnit com Delphi 7, visto que a maioria do desenvolvimento em Delphi ainda feito sobre win32 e com a verso 7 do Delphi. O framework pode ser baixado em http://dunit.sourceforge.net/.

A instalao simples. Descompacte a o contedo do arquivo para alguma pasta e adicione no library path do Delphi o caminho <pasta instalao>\DUnit\Source

Exemplo
Os mais puristas em desenvolvimento TDD (Test Driven Development), desenvolvimento diridigo por testes, e XP (Extreme Programming) pregam que primeiramente devemos construir os testes para determinada classe e rod-lo. Dessa forma nos certificamos que os testes daro errado no inicio e s ento se inicia o desenvolvimento da classe a ser testada. Bem, para quem vem de uma cultura onde arrastar e soltar a melhor coisa do mundo, pra dar um n na cabea no ? Como vou testar algo que no est pronto. Bem, eu no sou purista e sou da opinio que devemos tirar o que h de melhor nisso e particularmente primeiro fao a classe e depois a testo. Inicie um novo projeto no delphi e adicione uma unit. Nessa unit insira a classe da Listagem 1. Listagem 1: Classe a ser testada

1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7

TNotas = class private FNota1: integer; FNota2: integer; FNota3: integer; FNota4: integer; procedure SetNota1(const Value: integer); procedure SetNota2(const Value: integer); procedure SetNota3(const Value: integer); procedure SetNota4(const Value: integer); public property Nota1: integer read FNota1 write property Nota2: integer read FNota2 write property Nota3: integer read FNota3 write property Nota4: integer read FNota4 write function Media: Real; end;

SetNota1; SetNota2; SetNota3; SetNota4;

Implemente o mtodo Media conforme a Listagem 2. Listagem 2: Mtodo Media

1function TNotas.Media: Real; 2begin 3 Result := (Nota1 + Nota2 + Nota3 + Nota4)/4; 4end;

Testando a Classe
Feche a aplicao e inicie um novo projeto, removendo deste o Form1, se criado. Acesse Project -> View Source e ajuste o cdigo do projeto de acordo com a Listagem 3. Listagem 3 Preparando para utilizar DUnit

1 2 3 4 5 6 7 8 9 1 0 1 1

uses Forms, TestFrameWork, GuiTestRunner; {$R *.res} begin Application.Initialize; GUITestRunner.RunRegisteredTests; end.

Salve o projeto e adicione uma nova Unit, nela vamos escrever o teste necessrio, conforme a Listagem 4. Listagem 4 Testes

1 uses TestFramework, Model; 2 3 type TNotasTestes = class(TTestCase) 4 private 5 FNotas: TNotas; protected 6 procedure SetUp; override; 7 procedure TearDown; override; 8 published 9 procedure TestMedia; 1 end; 0 1 1

1 2
Observe que para testar uma classe, criamos outra de teste. Embora possa parecer trabalhoso e custoso, os benefcios oferecidos so compensadores. Toda classe de teste deve derivar de TTestCase, que apresenta dois mtodos que podem ser sobrecarregados e so muito teis. O SetUp e o TearDown. O Setup ser chamado antes de cada teste publicado ser executado. Assim, podemos preparar os testes com informaes necessrias antes de sua execuo. O TearDown, chamado depois que o teste realizado, podendo ser utilizado para liberar recursos alocados pelo teste. Pensando em nosso teste vemos que precisaremos de uma instncia de TNotas seja criada e aos o teste seja liberada. Utilizaremos ento o SetUp e TearDown para isso. Implemente o mtodo TestMedia conforme a Listagem 5. Listagem 5: Codificando o teste

1 procedure TNotasTestes.TestMedia; 2begin 3 FNotas.Nota1 := 10; 4 FNotas.Nota2 := 10; 5 FNotas.Nota3 := 10; 6 FNotas.Nota4 := 10; CheckEquals(10,FNotas.Media); 7end; 8
O framework DUnit oferece vrios mtodos que utilizamos para realizar testes, em nosso exemplo utilizamos o CheckEquals. CheckEquals vai verificar a igualdade dos valores passados, havendo diferena o teste identificado como falho. Antes de executarmos, preciso registrar o teste no framework, isso feito na seo initialization, veja a Listagem 6. Listagem 6: Registrando o teste

1initialization 2 TestFramework.RegisterTest('Tests Suite', TNotasTestes.Suite);


Execute a aplicao, e d um ENTER, o teste ser executado, veja figura 1.

Figura 1: Testes em execuo

Cometendo um erro
Digamos que precisamos alterar nossa classe de Notas, aumentar mais uma nota, de 4 para 5. E na correria apenas acrescentamos mais uma propriedade Nota5, esquecendo de ajustar a rotina do calculo. Ento ajustamos o teste para a nova situao, conforme a Listagem 7. Listagem 7: Novo teste

1 2procedure TNotasTestes.TestMedia; begin 3 FNotas.Nota1 := 10; 4 FNotas.Nota2 := 10; 5 FNotas.Nota3 := 10; 6 FNotas.Nota4 := 10; FNotas.Nota5 := 5; 7 CheckEquals(9,FNotas.Media); 8end; 9

Execute o teste, o mesmo ir falhar. Ao detectarmos a falha, podemos ento arrumar o clculo e executar novamente o teste, ento ele passar.

Concluso
Imagine em um sistema complexo como que os testes podem facilitar nossa vida, pegando as falhas que podemos causar. No fcil deixar o jeito de fazer as coisas como fazemos e partir para um novo modelo de desenvolvimento, mas com dedicao e boa vontade conseguimos resultados que nunca esperamos. At mais !

Leia mais em: Testes Unitrios http://www.devmedia.com.br/testesunitarios/2739#ixzz2BSOkZw3f

Você também pode gostar