Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Workshop sobre Testes Unitários (TDD) com Java

Opensanca
October 17, 2015

Workshop sobre Testes Unitários (TDD) com Java

André Willik Valenti abordando sobre TDD, segue um resumo do que foi o workshop:

Você gosta de testar software? Muitas vezes, testes são associados a estresse. E o estresse, muitas vezes, está ligado a mudanças. O Desenvolvimento Guiado por Testes (TDD) é uma técnica de programação que propicia uma experiência única para o desenvolvedor. Em vez de deixar o teste (manual) para o final, escrevem-se testes (automatizados) desde o início. Esses testes são executados facilmente e com muita frequência, fornecendo uma resposta rápida à clássica pergunta: o sistema funciona? Neste minicurso, você aprenderá a dar os primeiros passos com o TDD, iniciando uma revolução na sua forma de encarar o desenvolvimento de software.

Opensanca

October 17, 2015
Tweet

More Decks by Opensanca

Other Decks in Programming

Transcript

  1. Minicurso de TDD: Test-Driven Development (Open Sanca) Prof. André Willik

    Valenti - 17/10/2015 Minicurso de TDD: Test-Driven Development (Open Sanca) de André Willik Valenti está licenciado com uma Licença Creative Commons - Atribuição 4.0 Internacional.
  2. Sobre mim André Valenti Bacharel em Ciência da Computação pela

    UFSCar (2007) Mestre em Ciência da Computação pela UNICAMP (2011)
  3. Sobre mim • Desenvolvedor desde 2007 • Principais experiências: ◦

    Java ◦ JavaScript / Node.js / CoffeeScript ◦ Jogos HTML5 ◦ Groovy / Grails ◦ PostgreSQL ◦ Maven
  4. Sobre mim • Professor no IFSP ◦ 07/2013 - 02/2014:

    São Carlos ◦ 03/2014 - atual: Campinas • Principais conteúdos ministrados: ◦ Java ◦ C# ◦ Desenvolvimento Web ◦ Arquitetura de Software ◦ UML
  5. • Perguntas a serem respondidas: ◦ O que é TDD?

    ◦ Como começar a estudar TDD? ◦ Como avançar nos estudos de TDD? Sobre o minicurso
  6. • Veremos: ◦ Mecânica ◦ Conceitos básicos ◦ Referências para

    estudos futuros ◦ Exercício, exercício, exercício, exercício… Sobre o minicurso
  7. O que é TDD? • Test-Driven Development ◦ Desenvolvimento guiado

    por testes (automatizados) ◦ Técnica ágil proposta por Kent Beck
  8. O que é TDD? • Test-Driven Development ◦ São os

    testes que guiam o desenvolvimento ◦ Você vai do concreto ao abstrato ◦ Você vai da solução específica à solução geral
  9. • TDD é... ◦ ...uma técnica bem estabelecida ◦ ...muito

    bem embasada ◦ ...difícil: exige muita adaptação O que é TDD?
  10. O que é TDD? • TDD não é... ◦ ...novidade

    (já tem mais de 10 anos) ◦ ...uma “técnica de teste de sistemas” ◦ ...compreendido bem pela maioria das pessoas
  11. O que é TDD? • Livro inaugural, de 2003: ◦

    Test-Driven Development By Example (Kent Beck)
  12. Problemas do desenv. tradicional • Desenvolvedor não sabe direito o

    que está funcionando e o que não está • Resultados demoram muito para aparecer
  13. Metodologias Ágeis • Filosofia descrita no Manifesto Ágil: ◦ http://www.agilemanifesto.org/iso/ptbr/

    ◦ "Mesmo havendo valor nos itens à direita, valorizamos mais os itens à esquerda."
  14. Manifesto para Desenvolvimento Ágil de Software Indivíduos e interações mais

    que processos e ferramentas Software em funcionamento mais que documentação abrangente Colaboração com o cliente mais que negociação de contratos Responder a mudanças mais que seguir um plano
  15. O que é TDD? • Consequências da aplicação de TDD:

    ◦ Aumenta o foco ◦ Reduz quantidade de defeitos ◦ Promove comunicação ◦ Promove aprendizado ◦ Promove mudança de cultura
  16. Como estudar TDD? • Exercício, exercício, exercício, exercício, exercício, exercício,

    exercício, exercício, exercício, exercício, exercício, exercício, exercício, exercício, exercício, exercício!
  17. Como começar a estudar? • Aprender TDD é um processo

    • É tão antinatural quanto aprender a programar • Com a maioria das pessoas, ocorrem as seguintes etapas:
  18. Como começar a estudar? • Os cinco "nossas" do aprendizado

    do TDD: 1º. Nossa, não entendi nada! 2º. Nossa, que negócio esquisito! 3º. Nossa, até que é legalzinho… 4º. Nossa, que negócio interessante! 5º. Nossa, que sensacional, quero usar em TUDO!
  19. Como começar a estudar? • Tenha muita disciplina! ◦ TDD

    é uma mudança de paradigma muito grande ◦ É necessário tempo e esforço para que o novo paradigma entre na cabeça ◦ Algumas coisas vão parecer estranhas. É assim mesmo. O entendimento dos porquês demora. ◦ A boa notícia é que basta seguir as regras e você conseguirá se virar bem
  20. Mecânica do TDD (resumida) 1. Escrever teste para funcionalidade (antes

    de ela existir) 2. Implementar funcionalidade 3. Melhorar implementação
  21. Mecânica do TDD (expandida) 1. Escrever novo teste 2. Ver

    novo teste falhar 3. Escrever o código de produção mais simples e rápido que conseguir (em geral, estará incompleto) 4. Ver teste passar 5. Refatorar
  22. Mecânica • Escreve novo teste → vermelho • Implementa o

    mínimo → verde • Refatora → verde • Escreve novo teste → vermelho • Implementa o mínimo → verde • Refatora → verde • ...
  23. Como começar a estudar? • Seguir as regras: ◦ Ciclo

    vermelho-verde-refatora ◦ Passe o máximo de tempo no verde ◦ Passe o mínimo de tempo no vermelho ◦ Funcionalidade nova, só com teste novo falhando ◦ Refatoração, só com todos os testes passando ◦ Quando se perder, volte tudo até ficar verde
  24. Configuração de ambiente • Para escrever testes em Java usando

    JUnit: ◦ Criar uma classe ◦ Acrescentar os imports ◦ Anotar métodos de teste com @Test ◦ Usar métodos assert*, como o assertThat
  25. Configuração de ambiente • Ou, no Eclipse: ◦ New >

    JUnit Test Case ◦ E ele já deixa tudo configuradinho para você
  26. Configuração de ambiente import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.is; import

    org.junit.Test; public class MinhaClasseTest { @Test public void deveFazerTalCoisa() { MinhaClasse mc = new MinhaClasse(); assertThat(mc.metodo(), is("um valor")); } }
  27. Configuração de ambiente • Para rodar testes no Eclipse: ◦

    Botão direito no projeto ◦ Run As ◦ JUnit test
  28. Exercícios 1. Soma usando string 2. FizzBuzz 3. Fraseador de

    itens 4. Lista MRU 5. Calculadora usando string 6. Avaliador de senhas 7. Busca incremental 8. Pilha desfazer/refazer 9. Intervalo
  29. Soma usando string Faça um programa que receba dois números

    inteiros em forma de string e dê como resultado a soma deles. Caso uma string contenha um texto que não seja um número, deve-se considerar valor zero para aquela string.
  30. FizzBuzz Faça um programa que, dado um número inteiro de

    1 a 100, produza como saída uma string de acordo com estas regras: • No geral, o número em forma de string ◦ 1 → "1"; 2 → "2" etc. • Se o número for divisível por 3: "Fizz" • Se o número for divisível por 5: "Buzz" • Se for divisível por 3 e por 5: "FizzBuzz"
  31. Fraseador de itens Quando escrevemos em língua natural uma lista

    de itens, seguimos algumas regras. Para um item, escrevemos: "Isto". Para dois itens, "Isto e aquilo". Para três itens, "Isto, aquilo1 e aquilo2". Há regras para o uso de vírgulas e conjunções 'e'. Faça uma classe Fraseador com um método que receba uma lista e gere uma string que fraseie os itens em língua natural de acordo com essas regras. Inicie a frase com letra maiúscula.
  32. Lista MRU (mais recentem. usados) • No começo, a lista

    está vazia • Ao abrir um arquivo, vai para o topo da lista • Se um arquivo anteriormente aberto for aberto de novo, ele é movido para o topo • Se a lista ficar cheia, o item mais antigo é descartado
  33. Avaliador de senhas Faça um programa que receba uma senha

    em formato de string e determine a força da senha. Escolha os critérios que considerar adequados.
  34. Busca incremental Agendas de celular permitem consultar nomes pelas primeiras

    letras. Exemplo: "Jo" → ["Joana", "Joao", "Jose"]. Faça uma classe com um método de buscar nomes de uma lista pelas primeiras letras. Faça com que os nomes mais recentemente buscados sejam mostrados primeiro.
  35. Desfazer/refazer • Comando 1, Comando 2 ◦ Ações possíveis: [desfazer

    c2] • Se você desfizer c2: ◦ Ações possíveis: [desfazer c1, refazer c2] • Se você desfizer c1: ◦ Ações possíveis: [refazer c1] • Se você fizer c3: ◦ Ações possíveis: [desfazer c3]
  36. Desfazer/refazer • Faça uma classe que represente uma pilha de

    ações com operações desfazer/refazer • Ao desfazer uma ação, é possível refazê-la • desfazer() e refazer() devem retornar a ação que foi desfeita ou refeita • Se não houver ação a ser desfeita/refeita, deve-se disparar uma exceção
  37. Intervalos • Permita criar objetos representando intervalos abertos ou fechados.

    Cada intervalo representa um conjunto de números inteiros: ◦ [-1, 3] → { -1, 0, 1, 2, 3 } ◦ [5, 8) → { 5, 6, 7 } ◦ (5, 8) → { 6, 7 } • Operações: ◦ Verificar se um número pertence ao intervalo ◦ Calcular união entre dois intervalos ◦ Calcular interseção entre dois intervalos
  38. Como avançar nos estudos de TDD? • Faça muitos exercícios

    • Estude mocking • Estude outras ferramentas • Estude padrões de teste • Leia muito sobre TDD
  39. Como avançar nos estudos de TDD? • Katá ◦ Ideia

    inspirada nas artes marciais ◦ Resolver um problema mais de uma vez ◦ Buscar diversas soluções para o mesmo problema • codekata.com ◦ "Porque experiência é a única professora"
  40. Como avançar nos estudos de TDD? • Origem de vários

    exercícios que foram usados neste minicurso: ◦ https://sites.google.com/site/tddproblems/all-problems-1 • Exercício usando Tetris: ◦ https://github.com/orfjackal/tdd-tetris-tutorial • Discussão sobre exercícios de TDD: ◦ http://stackoverflow.com/questions/5321211/tdd- assignment-for-beginners
  41. Como avançar nos estudos de TDD? • Outras ferramentas para

    Java além do JUnit ◦ Maven ◦ Hamcrest ◦ Mockito • Guia de configuração de ambiente aqui
  42. Como avançar nos estudos de TDD? • TDD em outras

    linguagens: ◦ Ruby: RSpec ◦ JavaScript: Jasmine, QUnit ◦ PHP: PHPUnit, SimpleTest ◦ Groovy: Spock • (essas são apenas algumas das opções)
  43. Como avançar nos estudos de TDD? • BDD: Behavior-Driven Development

    ◦ Reinterpretação do TDD ◦ Testes como especificações do sistema ◦ Em essência, é a mesma coisa • Artigos ◦ http://dannorth.net/introducing-bdd ◦ http://en.wikipedia.org/wiki/Behavior-driven_development
  44. Como avançar nos estudos de TDD? • Mock ◦ Também

    chamado de dublê ◦ Isola um objeto de seus colaboradores ◦ Colaboradores são as dependências
  45. Como avançar nos estudos de TDD? • Exemplo: jogo de

    cartas ◦ Partida depende de Rodada ◦ Baralho depende de Carta • Rodada e Carta são colaboradores
  46. Como avançar nos estudos de TDD? • Exemplo: aplicação web

    ◦ Serviço depende de DAO ◦ DAO depende de EntityManager • DAO e EntityManager são colaboradores
  47. Como avançar nos estudos de TDD? • Mocks ajudam a

    testar na presença de: ◦ Banco de dados ◦ Conexões de rede ◦ Sistema de arquivos ◦ Aleatoriedade
  48. Como avançar nos estudos de TDD? • Alguns frameworks de

    mocking: ◦ Java: Mockito ◦ JavaScript: Sinon.JS • Discussão sobre os diversos tipos (dummy, fake, stub, spy, mock): ◦ Artigo do Martin Fowler (em inglês) ◦ Mesmo artigo, traduzido
  49. Conclusões • TDD é uma técnica ágil de desenvolvimento •

    Testes vêm antes do código • Vantagens ◦ Respostas rápidas ◦ Rastreabilidade ◦ Confiança ◦ Ajuda a fazer um bom design de código
  50. Conclusões • Filosofia: ◦ Passos curtos ◦ Primeiro fazer, depois

    melhorar ◦ Consciência de onde você está em cada momento ◦ Ciclo vermelho-verde-refatora Verde Refatora Vermelho
  51. Obrigado! • Envie sua opinião sobre o minicurso! • Contato:

    ◦ André Willik Valenti ◦ [email protected] ◦ https://awvalenti.wordpress.com ◦ https://youtube.com/awvalenti ◦ https://www.linkedin.com/profile/view?id=46798771 ▪ (se for me adicionar, diga que foi ao minicurso)