Por que você não escreve
Testes Unitários?
Alex Tercete
alex.tercete@vtex.com.br
Eu sei porque!
As quatro “desculpas”
Não sei do
que se trata
Não sei
como
Não tenho
tempo
Eu já
escrevo
Você provavelmente já faz testes
Clique, clique,
clique
Debug
Console
Application
Testes
automatizados
Escrever código
Como desenvolvemos atualmente
Camada de
apresentação
(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)
Código que testa o código
Classe de Produção Classe de Testes
Test Doubles
Definição
• Código que testa o código
– O código testa o teste (?)
• Um por unidade de código
– Uma classe de teste por classe de código
– Vários métodos de teste por método de código
• Não interagem com elementos externos
• Automatizados
• Reproduzíveis
Mas isso não é
trabalho dobrado?
Uma análise do tempo gasto
Código sem testes
Código com testes
t
t
Benefícios
• Os erros aparecem cedo
– Reduz o ciclo de feedback
– Quem corrige é quem gerou
• Garante o comportamento correto do sistema
– Reduz a quantidade de erros
– Aumenta a “qualidade” dos erros
Benefícios (2)
• Rede de proteção
– Evita regressão
– Aumenta a confiança do desenvolvedor
– Encoraja refatoração
• Ajuda aos outros desenvolvedores
– Código mais limpo
– Documentação sempre atualizada
– Mais segurança pra mexer no código “dos outros”
Benefícios (3)
• Melhora o design do código
– Você escreve apenas o necessário para satisfazer
os requisitos dos testes
– O teste é seu primeiro “cliente”
• Continuous Delivery
– Mais segurança no deploy
Escrever testes unitário é fácil
[Test]
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
Código testável
Teste
Código não testável
Tá, mas eu quero
ver um exemplo
disso na prática!
Test-First Development
• Escreva os testes antes de escrever o código
• Desenvolva a API que você gostaria de
consumir
• Antes de corrigir um erro, escreva um teste
que o exponha
• Nunca escreva código sem um teste falhando
Pontos de “costura”
• (Desnecessário)
• Construtor
• Propriedade
• Herde e sobrescreva
– Aumenta a legibilidade e a manutenibilidade do
teste
• Encapsule
– Reduz a manutenibilidade
O teste é mais
importante do que a
implementação
Nomenclatura
• Assembly.De.Codigo.Tests
– Vtex.Practices.ServiceModel.Tests
• ClasseDeCodigoTests
– HttpMethodResolverTests
• Metodo_de_testes_bem_descritivo
– Resolve_to_GET_when_using_HttpGet
Legibilidade
• Esconde os detalhes do Arrange
• Use somente uma linha no Act
• Não se preocupe tanto com DRY no Assert
Manutenibilidade
• Extraia a construção do objeto de teste
• Os testes não devem te atrasar
• Refatore o teste, também
Muito legal, mas por
onde eu começo?
Just Do It!
Um teste é melhor do que
nenhum
Priorize o núcleo do sistema
Comece pela parte mais fácil
• Métodos com entrada e saída bem definidas
• Métodos com poucas dependências
Erre bastante
• Pesquise
• Peça ajuda
• Aprenda
• Evolua
Ao estimar suas tarefas,
leve em conta o tempo
necessário para escrever os
testes
Mensagem final
Obrigado!
DÚVIDAS?
Referências
• http://elegantcode.com/2008/05/20/get-started-
writing-testable-code/
• http://www.martinfowler.com/bliki/TestDouble.h
tml
• 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/u
nit-testing-internal-methods/
Livros

Por que você não escreve Testes Unitários?