Você está na página 1de 5

HOME FÓRUM CADASTRE-SE SOBRE Buscar no Site

PARA QUEM GOSTA DE DELPHI voltar

Show Delphi » Artigos, Dicas, Object Pascal e Strings » Refatorando padrões. Um exemplo de TDD codificado em Delphi. Artigo 01, o básico.

Patrocinado

Refatorando padrões. Um exemplo de TDD codificado em Delphi.


Artigo 01, o básico.
Artigo originalmente escrito por Yanniel em inglês, veja a referencia ao final da página.

O objetivo deste artigo não é discutir os prós e contras de TDD, teste unitário ou qualquer. O objetivo
é apenas dar alguns exemplos.
Colchão Pró-Saúde Confortável
Se necessário, para uma rápida compreensão do que é TDD ou Teste de Unidade , consulte os
R$ 449,00 - Ortobom
seguintes links.
Sponsored Links by Taboola
Veja mais sobre TDD
Veja mais sobre DUnit

No TDD você não escreve o código da aplicação primeiro, em vez disso você deve começar Navegue pelo site
escrevendo os casos de teste. Downloads
O ciclo TDD é o seguinte: Exemplos
No começo, você apenas escreve um teste e, mais tarde, mais testes podem ser adicionados.
Apostilas
Certifique-se de que o teste inicial falhe; isso validará o chicote de teste. Componentes

Escreva algum código para passar no teste. Dicas


Importante: não exagere no código. Formulários

Adicione apenas o código necessário para passar no teste. O código não precisa ser elegante neste Data e Hora
momento. Object Pascal e Strings

Execute o teste: se falhar, você terá que voltar para a etapa 3 e corrigir seu código para passar no Validação
teste. Windows
Quando você tiver sucesso, passe para a etapa 5.
Banco de Dados
Melhore e otimize seu código: torne-o elegante, mais eficiente, Imagens
evite duplicações, etc, etc. Isso é chamado de refatoração de código.
Multimédia
Ao refatorar seu código, talvez, por acidente, você pode quebrar a funcionalidade (parar de Impressão e Relatórios
funcionar).
Miscelânea
Como você pode ter certeza de que tudo está funcionando como deveria? Redes e Internet

Apenas execute novamente o teste e ele informará se a refatoração anterior apresentou uma falha RTTI
ou não. NF-e / NFC-e

Vá para a etapa 1 e adicione um novo teste, se necessário. Artigos


Notícias Privacidade - Termos
O exemplo: vamos considerar o jogo de xadrez. Iniciantes
O objetivo será implementar o código para verificar se uma peça é colocada em uma Introdução
posição válida dentro da placa.
Tipos de Dados
Nós só vamos implementar um teste: “SetPositionTest” . Linguagem Algorítmica

Vou numerar as colunas (coordenada X) de 1 a 8 começando no canto inferior esquerdo. Algoritmos Sequenciais
Do mesmo modo, numerarei as linhas (coordenada Y) de 1 a 8, iniciando no canto inferior esquerdo. Algoritmos com Vetores

8 Exercícios de algoritmos e programas sequenciais


7 Laços de Repetição
6
Exercícios de algoritmos com laços
5
4 Testes e Seleções
3 Exercícios de algoritmos com testes e seleções
2
Curso básico em Algoritmos / Pascal / Object
12345678
Pascal
Para um tutorial passo a passo de como usar, configurar e configurar o DUnit, você pode ler as Algoritmos com Matrizes e Registros
versões em inglês ou chinês do tutorial.
Vídeos
Inicialmente, o código de teste deve ficar assim: Curso POO – Módulo I

1 unit ChessPiecesTests; Firedac e Datasnap


2   Curso POO – Módulo II
3 interface
4   Tutorias
5 uses
6 TestFrameWork; Vídeos da Embarcadero
7   REST Dataware – DW
8 type
9 TPieceTest = class(TTestCase) Dicas em Vídeo
10 published
11 procedure SetPositionTest; Cursos Gratuitos
12 end;
User Control
13  
14 implementation Cursos de Delphi / Lazarus
15  
16 uses Algoritmos Ao Vivo
17 ChessPieces;
18   Ferramentas
19 { TPieceTest } Geradores
20  
21 procedure TPieceTest.SetPositionTest; Contadores
22 begin
Conversores
23 end;
24  
25 initialization
26
27
TestFramework.RegisterTest(TPieceTest.Suite);
end.
Patrocinado
Se você executar esse teste, ele será bem-sucedido porque nenhuma verificação está sendo
executada dentro do procedimento SetPositionTest .

Cada teste é composto por uma ou mais verificações. Sugiro adicionar os controles aos poucos.
Toda vez que você adiciona um cheque, você deve adicionar código da aplicação real para passar
no teste correspondente.

Agora, vamos fazer o teste falhar de propósito. Para isso, vamos adicionar uma verificação ao
procedimento SetPositionTest.

1 procedure TPieceTest.SetPositionTest;
2 begin
3 Check(True = False, '');
4 end;

Obviamente, verdadeiro nunca é falso. Então, esse teste irá falhar. Se não falhar, então algo está
errado com a sua IDE!

Agora, vamos adicionar um cheque(colocar o rei inimigo em perigo) ao nosso teste.


Veja o exemplo:

1 procedure TPieceTest.SetPositionTest;
2 var
3 Piece: TPiece;
4 begin
5 Piece:= TPiece.Create;
6 try
7 //Test trivial (normal) workflow
8 Check(Piece.SetPosition(4, 4) = True, '');
9 finally
10 Piece.Free;
11 end;
12 end;

Se você executar este teste, você receberá um erro de compilação! Sim está certo.
Você ainda não tem código comercial. Você acabou de fazer o teste.
É disso que se trata o TDD: teste primeiro, código de negócios mais tarde. Entenda a ideia?

Para evitar o erro de compilação, vamos codificar uma unidade separada ( chesspieces ) e
vamos adicioná-la à usos cláusula do nosso ChessPiecesTests unidade.

Esta unidade será utilizada como apoio nos testes.

1 unit ChessPieces; Colchão Fashion Firm


2   EU QUERO
3 interface Frete Grátis!
4  
5 type
6 TPiece = class
7 private
8 public
9 function SetPosition(aX, aY: Integer): Boolean;
10 end; Frete Grátis! Frete Grátis!
11  
12 implementation
13  
14 { TPiece }
15  
16 function TPiece.SetPosition(aX, aY: Integer): Boolean;
17 begin Frete Grátis! Frete Grátis!
18 end;
19  
20 end.

Execute o teste novamente e agora o erro de compilação desapareceu. No entanto, o teste falha
porque o Piece.SetPosition (4, 4) é avaliado como Falso . Frete Grátis! Frete Grátis!

Vamos adicionar o código comercial mínimo possível para passar este teste:

1 function TPiece.SetPosition(aX, aY: Integer): Boolean;


Patrocinado
2 begin
3 Result:= True;
4 end;

Reforçando que aqui o objetivo é passar como verdadeiro no teste com o mínimo possível de código.

OK, e agora? Bem, continuamos adicionando novas verificações ao teste e, sempre que isso
acontece,
precisamos adicionar um novo código de negócios para poder transmiti-lo. É muito importante
adicionar
verificações para testar os limites do que estamos tentando codificar. Não se vista de idade: Esses 17 itens
da moda fazem você parecer mais…
No exemplo abaixo haverá varias validações: Tip Parents
Sponsored Links by Taboola
1 procedure TPieceTest.SetPositionTest;
2 var
3 Piece: TPiece;
4 begin
5 Piece:= TPiece.Create;
6 try
7 //Test trivial (normal) workflow
8 Check(Piece.SetPosition(4, 4) = True, '');
9  
10 //Tests boundaries
11 Check(Piece.SetPosition(1, 1) = True, '');
12 Check(Piece.SetPosition(1, 8) = True, '');
13 Check(Piece.SetPosition(8, 1) = True, '');
14 Check(Piece.SetPosition(8, 8) = True, '');
15  
16 //Test beyond the boundaries
17 Check(Piece.SetPosition(3, 15) = False, '');
18 Check(Piece.SetPosition(3, -15) = False, '');
19 Check(Piece.SetPosition(15, 3) = False, '');
20 Check(Piece.SetPosition(15, 15) = False, '');
21 Check(Piece.SetPosition(15, -15) = False, '');
22 Check(Piece.SetPosition(-15, 3) = False, '');
23 Check(Piece.SetPosition(-15, 15) = False, '');
24 Check(Piece.SetPosition(-15, -15) = False, '');
25 finally
26 Piece.Free;
27 end;

O teste acima está até mesmo verificando as tentativas de posicionar uma peça fora do tabuleiro de
xadrez.
Para passar esse teste, vamos escrever algum código de negócio:

1 function TPiece.SetPosition(aX, aY: Integer): Boolean;


2 begin
3 Result:= True;
4 if (aY < 1) or (aY > 8) then Result:= False
5 else if (aX < 1) or (aX > 8) then Result:= False;
6 end;

Execute o teste e veja como ele passa.

Certo, agora vamos analisar. O código acima poderia ser refatorado ou mesmo reescrito.
Os testes permanecerão os mesmos, permitindo-nos capturar quaisquer erros introduzidos com a
alteração do código.

Uma nova forma de escrever o procedimento acima pode ser esta:

1 function TPiece.SetPosition(aX, aY: Integer): Boolean;


2 begin
3 Result:= (aX > 0) and
4 (aX < 9) and
5 (aY > 0) and
6 (aY < 9);
7 end;

Execute o teste e ele informará se essa refatoração (ou reimplementação) funciona corretamente.

É importante observar que um bom teste deve abranger todos os cenários e fluxos de trabalho
possíveis.
Preste atenção especial aos limites. Neste ponto, uma boa compreensão dos requisitos é
indispensável.

Finalmente, mais e mais testes serão necessários em uma aplicação no mundo real.
Cada teste terá suas próprias verificações.

Cada teste irá cobrir uma parte da funcionalidade, observe, é para isso que o teste unitário é
destinado.

Traduzido e adaptado de http://www.yanniel.info/2012/03/tdd-in-delphi-dunit-framework.html

Dúvidas ou sugestões? Deixe o seu comentário!

Facebook Comments Box

Giovani Da Cruz
1.938 views
0 comentários
21 de março de 2019

Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!

Deixe um comentário

Você precisa fazer o para publicar um comentário.

Posts Relacionados - Continue Aprendendo


-> Como listar todos arquivos de um diretório em Delphi?
-> Como atualizar um valor JSON?

-> Formatação de datas via código e data americana para brasileira

-> Criar um relatório no fortes report com 2 datasets ou mais

-> Como evitar o Access Violation em DLL que utilizam o Dev Express

-> Adicionar ou remover o atributo “not null” de um campo no Firebird

-> Como Remover Linhas em Branco do Memo?

-> Como trocar a extensão de um arquivo?

-> Exemplo de Cadastro de Cidades com Delphi e FireDac

-> Biblioteca DGoogleAnalytics para integração do Delphi com o Google Analytics

Sponsored Links by Taboola

Colchão Pró-Saúde Standard


R$ 429,00 - Ortobom

Colchão Pró-Saúde Confortável


R$ 449,00 - Ortobom

Colchão Fashion Firm


R$ 499,00 - Ortobom

Aqui está o que os implantes dentários de toda a boca podem custar a você em
2023
Implantes dentários | Links patrocinados

2 bilhões de dólares? A maior loteria do mundo chega no Brasil!


theLotter.com

Professor impede aluna de ir ao banheiro


Articles Vally

Ir ao topo

© 2023 Infus Soluções em Tecnologia - Todos os Direitos Reservados

Você também pode gostar