Coding Dojo .NET Architects – 30/01/2010 – São Paulo

Posted by Vinicius Quaiato | Posted in .NET, TDD | Posted on 28-01-2010-05-2008

0

Fala galera! Sábado, dia 30/01/2010 teremos um Coding Dojo, organizado pela comunidade .NET Architects.

Este Coding Dojo dará início ao grupo de Dojo do .NET Architects, que fará encontros regulares focando os dojos nas diversas linguagens e tecnologias .NET.

Local: Unip Jaguaré – São Paulo – SP
Horário: à partir das 10hs
Data: sábado, 30/01/2010

Confira o mapa do local e faça sua incrição aqui: http://dojo.dotnetarchitects.net
Totalmente gratuito!

Não existem pré-requisitos para participar, basta ter vontade e comparecer!

Saiba mais sobre Coding Dojo aqui.

Abraços, nos vemos lá!

Vinicius Quaiato – http://viniciusquaiato.com

TDD – Test-driven Development + c# – Parte II

Posted by admin | Posted in .NET, C#, TDD | Posted on 06-11-2009-05-2008

0

Original em Vinicius Quaiato: http://viniciusquaiato.com/blog/index.php/tdd-test-drive…ent-c-parte-ii/

TDD – Test-driven Development – Parte I
TDD – Test-driven Development – Parte III

Após o que foi apresentado no primeiro post da série, faremos nesta segunda parte um exemplo prático de TDD.

Para efeito didático este será um exemplo bem simples e trivial, para que possamos focar nas práticas de TDD.

Antes de começarmos gostaria de mencionar o “mantra do TDD”:

Red, green, refactoring

Ou seja, escreva um teste que falhe, na verdade um teste que nem compila (vermelho). Escreva um código que compile e faça o teste passar (verde), mesmo que seja um código ruim. Então, após o teste passar melhoramos o código, com a finalidade de deixá-lo mais claro, coeso e simples (refactoring).

Tendo isso em mente, vamos para o nosso caso de uso em C#:

Desenvolver uma aplicação bancária que controle saques, depósitos e transferências.

Como eu disse o caso de uso é simples, para que foquemos no TDD.

Vamos criar uma nova solution no Visual Studio. Aqui já começa a mudança de pensamento. Antes de criar o projeto da conta bancária, eu começo criando o projeto de testes da conta bancária. Eu gosto de pensar assim para ir me acostumando com a idéia do Test First.

TDD_criando_projeto_testes

TDD - criando projeto de testes

Agora que estamos com o projeto criado, vamos escrever nosso primeiro teste. Vocês vão perceber que a prática do TDD nos leva a pensar melhor em nossas classes. Vamos ver.

Bom, em nosso primeiro teste vamos nos assegurar de que quando uma conta seja criada ela obrigatóriamente necessite de um depósito inicial:

[TestMethod]
public void Deve_Criar_Conta_Com_Deposito_Inicial()
{
    ContaBancaria conta = new ContaBancaria(50.0m);
 
    Assert.AreEqual(50, conta.SaldoAtual);
}

Como podemos ver, este teste nem irá compilar, afinal, estamos criando o teste antes mesmo de criarmos a classe ContaBancaria.

public class ContaBancaria
{
    public decimal SaldoAtual { get; set; }
    public ContaBancaria(decimal depositoInicial) { }
}

Assi podemos executar nosso teste. Eu gosto de utilizar dois atalhos CTRL + R + T (executa o teste corrente em modo debug) ou CTRL + R + A (executa todos os testes da solution em modo debug).
Teremos o resultado como abaixo:

TDD - executando primeiro teste

TDD - executando primeiro teste

Este teste falhou. Ótimo! Obtemos um red e sabemos que estamos no caminho certo. Aconteceu que estávamos esperando um saldo de 50 e o saldo obtido foi 0.
Agora devemos voltar ao código e fazer o teste passar:

public class ContaBancaria
{
    public decimal SaldoAtual { get; set; }
    public ContaBancaria(decimal depositoInicial)
    {
        this.SaldoAtual += depositoInicial;
    }
}

Neste caso nossa mudança é bem pequena. Agora vamos executar o mesmo teste e ver o que acontece:

TDD - executando primeiro teste verde

TDD - executando primeiro teste verde

Pronto! Obtivemos um verde, e isso quer dizer que podemos prosseguir, escrevendo os próximos testes. Antes disso acontecer, devemos lembrar do próximo passo: refactoring!
Vamos voltar ao nosso código e entender o que pode ser refatorado.
Me parece que a propriedade SaldoAtual não deveria ter um setter público, desta forma vamos torná-lo privado:

public class ContaBancaria
{
    public decimal SaldoAtual { get; private set; }
    public ContaBancaria(decimal depositoInicial)
    {
        this.SaldoAtual += depositoInicial;
    }
}

Agora devemos novamente executar nossos testes, para termos certeza de que não acabamos estragando nada.

Agora precisamos garantir que o depósito inicial seja um depósito válido. Ou seja, o que acontece com um depósito inicial igual a 0? E se for menor que 0?
De acordo com a regra de negócio que eu inventei, uma conta sempre deve ser criada com um depósito inicial. Quando quisermos carregar uma conta específica, utilizaremos outra notina e não o construtor público.
Assim, vamos criar um deste que garanta que o depósito inicial seja válido.

Vamos usar um atributo(attribute) do framework de testes do visual studio que nos permite testar se um determinado teste lança uma exceção – ExpectedException:

[TestMethod]
[ExpectedException(typeof(DepositoInicialInvalidoException))]
public void Deve_Lancar_Excecao_Deposito_Inicial_Invalido()
{
    ContaBancaria conta = new ContaBancaria(0);
}

Para que este teste compile, vamos criar uma Exception:

public class DepositoInicialInvalidoException : Exception
{
    public DepositoInicialInvalidoException()
        : base("Depósito inicial deve ser um valor maior que 0(Zero)!") { }
}

Agora vamos rodar nosso test. Pumba! Obtivemos um red. Afinal, não estamos validando o depósito inicial. Vamos fazer o código passar:

public ContaBancaria(decimal depositoInicial)
{
    if (depositoInicial <= 0)
        throw new DepositoInicialInvalidoException();
 
    this.SaldoAtual += depositoInicial;
}

Agora já podemos executar nossos testes (sim, devemos executar todos os testes, para ter certeza que nada quebrou no meio do caminho). Pronto, temos um verde. Vamos para o refactoring. A validação dentro do construtor não ficou muito elegante. Afinal, no futuro podemos ter outros tipos de validações, desta forma vamos refatorar:

TDD - refatorando

TDD - refatorando

Assim o visual studio criará para nós um método, e ficaremos com a seguinte estrutura:

public ContaBancaria(decimal depositoInicial)
{
    Validar(depositoInicial);
 
    this.SaldoAtual += depositoInicial;
}
private void Validar(decimal depositoInicial)
{
    if (depositoInicial <= 0)
        throw new DepositoInicialInvalidoException();
}

É importante que a cada refatoring, cada mudança de código, executemos novamente os testes. Mesmo que achemos que a mudança é pouca e pequena, isso nos fará ter o hábito de sempre executar os testes, e no futuro faremos isso para mudanças mais drásticas e severas.

Bom pessoal, nesta segunda parte espero ter mostrado o início do TDD utilizando C# + Visual Studio.

Na próxima parte deste artigo criaremos os testes para depósitos e saques.

Abraços,
Vinicius Quaiato.

TDD – Test-driven Development – Parte I

Posted by admin | Posted in .NET, TDD | Posted on 03-11-2009-05-2008

0

Bom, estive pensando sobre como começar este novo espaço e decidi que nada melhor do que a prática que mais vem me fascinando nos últimos tempos TDD – Test-Driven Development.

TDD – Test-driven Development – Parte II

TDD – Test-driven Development – Parte III

TDD não é algo novo, e nem específico para uma tecnologia. Podemos dizer que o mesmo surgiu, ou ficou conhecido, em meados de 2002, com a publicação do livro de Kent Beck, chamado Test-driven Development by Example.

Basicamente o TDD significa:

  1. Escreva um teste, antes mesmo de escrever o código que este teste consome;
  2. Faça o teste funcionar, escrevendo o código do qual o teste depende, mesmo que seja um código ruim;
  3. Refatore, eliminando duplicações de código, tanto nos testes quanto nas implementações.

Basicamente isto é TDD, simples, não?!

Você deve estar se perguntando:

Que tipo de loucura é essa de escrever testes, ainda mais antes do código?

Bem, existe uma série de fatores que podem levá-lo a querer escrever testes de unidade antes de escrever o código, vou citar aqui alguns que me fizeram repensar a forma de desenvolver:

  1. Testes asseguram que o que existe funciona, o que existia continua funcionando, e o que virá a existir funcionará;
  2. Testes de unidade nos dão confiança no código;
  3. Escrever os testes antes do código nos faz pensar em como realmente escrever aquele código do ponto de vista de quem irá utilizá-lo (ainda que sejamos nós mesmos);
  4. “Testes são documentação executável” (Giovanni Bassi aqui);
  5. Teste escrito antes do código é especificação (Giovanni Bassi aqui);
  6. TDD foca em software que SEMPRE funciona;

TDD nos leva a buscar e implementar boas práticas de programação. Para se realizar um bom teste de unidade, e antes do código estar escrito, é necessário que nossas classes sejam realmente coesas, que elas tenham um baixo acoplamento, que seus métodos sejam também coesos, com apenas uma responsabilidade. Nos faz pensar seriamente em Inversão de ControleInjeção de Dependência.

Estes itens já nos levam a considerar com muito carinho o uso de TDD.

Com TDD, sem dúvida teremos software que funciona, software fácil de testar, software fácil de alterar, e o melhor de tudo, software feito por profissionais!

Sim! Testar e garantir que funciona é obrigação de todo desenvolvedor de software.
Imagine você comprar um carro e só quando for dirigir descobrir que a primeira marcha anda de ré!? Ou então comprar uma geladeira e quando colocar água para gelar descobrir que ela na verdade ferve a água?!

Somos pagos, e muito bem pagos, para entregar software de qualidade, e quem deve garantir isso somos nós mesmos. Devemos ser profissionais. Mais do que isso, devemos ser bons profissionais!

Para finalizar esta primeira parte, encerro com uma frase do UncleBob:

“Desenvolvedor que não testa é como um médico que não lava as mãos antes de fazer uma cirurgia.”

No próximo post mostrarei como fazermos algo bem simples usando TDD + C# + Visual Studio.

Abraços galera.

Post original em: http://viniciusquaiato.com/blog/index.php/tdd-test-driven-development-c/