Testes Unitários
Começando a escrever testes no seu dia-a-dia
Alex Tercete
alex.matos@chemtech.com.br
27 de abril de 2011
Espera aí...
Você já falou disso!
O que mudou?
• Chemtech Coding Dojo
• Uso na prática
– SIMONS, ONS (Importação Automática)
– Viva 2.0, Coca-Cola (Aplicativo do Twitter)
– GERCAD, ONS (*)
Escrever código
Como desenvolvemos atualmente
Camada de
apresentação
(Web, UI)
Camada de
Serviço
Camada de
Lógica
Camada de
Acesso a Dados
“Clicar no botão”
Funcionou? DEBUG
Não
Comemorar!
Sim
Debug-Driven
Development
(DDD)
Uma nova forma de pensar
Camada X
Escrever teste
Implementar
funcionalidade
Terminou?
Não
Fim
Sim
Camada Y
Escrever teste
Implementar
funcionalidade
Terminou?
Não
Fim
Sim
Camada Z
Escrever teste
Implementar
funcionalidade
Terminou?
Não
Fim
Sim
Test-Driven
Development
(TDD)
Mas isso não é
trabalho dobrado?
Uma análise do tempo gasto no DDD
• “Clicar no botão”
– Levantar servidor de desenvolvimento
– Compilar páginas .aspx, .jsf, etc.
– Acessar manualmente a página e realizar os passos
para execução da funcionalidade
– Executar query no banco
• Debug
– Adicionar/remover breakpoints e watches
– Depurar o código linha a linha
• Paciência
• Atenção
Os benefícios do TDD
• Código desacoplado e com bom design
• Robustez
• Evita problemas de regressão
• Aumenta a confiança do desenvolvedor
Por que ainda não
estou fazendo isso?
Escrever testes unitários é fácil
[Fact]
public void TesteDePotenciacao()
{
// Arrange
var calculadora = new Calculadora();
// Act
var resultado = calculadora.Eleva(3, 4);
// Assert
Assert.Equal(81, resultado);
}
O desafio é escrever
código testável
Escrever código testável é difícil
• Quebra de hábitos antigos
• Aprender nova forma de pensar/trabalhar
• Algumas tecnologias são naturalmente mais
difíceis de testar
– Interface Gráfica
– Stored Procedures
– Componentes de terceiros
– etc.
A mudança não é instantânea
• No início você vai escrever código “mais ou
menos” testável
• Você vai errar
• Você vai desejar ter feito as coisas de forma
diferente
• Você vai evoluir
• Você não vai mais conseguir desenvolver de
outra maneira
Tá, mas eu quero
ver um exemplo
disso na prática!
Um exemplo
• Ideias?!
Organizando seu Projeto
• Separar o projeto/pacote contendo os testes
– <NomeDoProjeto>
– <NomeDoProjeto>.Testes
• Acessando métodos internos
– Properties/AssemblyInfo.cs
[assembly: InternalsVisibleTo("<NomeDoProjeto>.Testes")]
Test Doubles
• Dummy
– Nunca é usado
• Fake
– Implementação do objeto real, mas com “atalhos”
• Stubs
– Não fazem nada
• Spies
– Stubs que registram informações sobre as chamadas
• Mocks
– Imitações do objeto real, para chamadas específicas
Depurando os testes unitários
• GUI Runner
• Debug > Attach to Process...
• Rodar testes
Como começar?
O que você pode fazer
• Just Do It!
• Estime o tempo das suas tarefas levando em
conta os testes unitários
• Comece testando o que for mais fácil
• Dê prioridade à lógica principal da aplicação
• Mostre aos seus colegas os benefícios que os
testes unitários podem trazer
• Pesquise, estude e peça ajuda
Vivemos na era da informação
Referências
• http://elegantcode.com/2008/05/20/get-started-
writing-testable-code/
• http://www.martinfowler.com/bliki/TestDouble.html
• http://googletesting.blogspot.com/2008/11/clean-
code-talks-unit-testing.html
• http://misko.hevery.com/attachments/Guide-
Writing%20Testable%20Code.pdf
• http://googletesting.blogspot.com/2008/08/by-miko-
hevery-so-you-decided-to.html
• http://hashbucket.wordpress.com/2009/01/12/unit-
testing-internal-methods/
Dúvidas?

Testes Unitários: Começando a escrever testes no seu dia-a-dia

  • 1.
    Testes Unitários Começando aescrever testes no seu dia-a-dia Alex Tercete alex.matos@chemtech.com.br 27 de abril de 2011
  • 2.
  • 3.
    O que mudou? •Chemtech Coding Dojo • Uso na prática – SIMONS, ONS (Importação Automática) – Viva 2.0, Coca-Cola (Aplicativo do Twitter) – GERCAD, ONS (*)
  • 4.
    Escrever código Como desenvolvemosatualmente Camada de apresentação (Web, UI) Camada de Serviço Camada de Lógica Camada de Acesso a Dados “Clicar no botão” Funcionou? DEBUG Não Comemorar! Sim
  • 5.
  • 6.
    Uma nova formade pensar Camada X Escrever teste Implementar funcionalidade Terminou? Não Fim Sim Camada Y Escrever teste Implementar funcionalidade Terminou? Não Fim Sim Camada Z Escrever teste Implementar funcionalidade Terminou? Não Fim Sim
  • 7.
  • 8.
    Mas isso nãoé trabalho dobrado?
  • 9.
    Uma análise dotempo gasto no DDD • “Clicar no botão” – Levantar servidor de desenvolvimento – Compilar páginas .aspx, .jsf, etc. – Acessar manualmente a página e realizar os passos para execução da funcionalidade – Executar query no banco • Debug – Adicionar/remover breakpoints e watches – Depurar o código linha a linha • Paciência • Atenção
  • 10.
    Os benefícios doTDD • Código desacoplado e com bom design • Robustez • Evita problemas de regressão • Aumenta a confiança do desenvolvedor
  • 11.
    Por que aindanão estou fazendo isso?
  • 12.
    Escrever testes unitáriosé fácil [Fact] public void TesteDePotenciacao() { // Arrange var calculadora = new Calculadora(); // Act var resultado = calculadora.Eleva(3, 4); // Assert Assert.Equal(81, resultado); }
  • 13.
    O desafio éescrever código testável
  • 14.
    Escrever código testávelé difícil • Quebra de hábitos antigos • Aprender nova forma de pensar/trabalhar • Algumas tecnologias são naturalmente mais difíceis de testar – Interface Gráfica – Stored Procedures – Componentes de terceiros – etc.
  • 15.
    A mudança nãoé instantânea • No início você vai escrever código “mais ou menos” testável • Você vai errar • Você vai desejar ter feito as coisas de forma diferente • Você vai evoluir • Você não vai mais conseguir desenvolver de outra maneira
  • 16.
    Tá, mas euquero ver um exemplo disso na prática!
  • 17.
  • 18.
    Organizando seu Projeto •Separar o projeto/pacote contendo os testes – <NomeDoProjeto> – <NomeDoProjeto>.Testes • Acessando métodos internos – Properties/AssemblyInfo.cs [assembly: InternalsVisibleTo("<NomeDoProjeto>.Testes")]
  • 19.
    Test Doubles • Dummy –Nunca é usado • Fake – Implementação do objeto real, mas com “atalhos” • Stubs – Não fazem nada • Spies – Stubs que registram informações sobre as chamadas • Mocks – Imitações do objeto real, para chamadas específicas
  • 20.
    Depurando os testesunitários • GUI Runner • Debug > Attach to Process... • Rodar testes
  • 21.
  • 22.
    O que vocêpode fazer • Just Do It! • Estime o tempo das suas tarefas levando em conta os testes unitários • Comece testando o que for mais fácil • Dê prioridade à lógica principal da aplicação • Mostre aos seus colegas os benefícios que os testes unitários podem trazer • Pesquise, estude e peça ajuda
  • 23.
    Vivemos na erada informação
  • 24.
    Referências • http://elegantcode.com/2008/05/20/get-started- writing-testable-code/ • http://www.martinfowler.com/bliki/TestDouble.html •http://googletesting.blogspot.com/2008/11/clean- code-talks-unit-testing.html • http://misko.hevery.com/attachments/Guide- Writing%20Testable%20Code.pdf • http://googletesting.blogspot.com/2008/08/by-miko- hevery-so-you-decided-to.html • http://hashbucket.wordpress.com/2009/01/12/unit- testing-internal-methods/
  • 25.