Test Driven Development Eloi Rocha Neto, 06/10/2007

  • View
    108

  • Download
    0

Embed Size (px)

Text of Test Driven Development Eloi Rocha Neto, 06/10/2007

  • Slide 1
  • Slide 2
  • Test Driven Development Eloi Rocha Neto, 06/10/2007
  • Slide 3
  • 3 Introduo Por que precisamos testar? Como saber se o que fizemos est correto ou no? Como garantir se o que est compilado funciona? Ser que possvel um projeto estar concludo se no tiver sido testado?
  • Slide 4
  • 4 Introduo Como testamos nosso cdigo? testes manuais? e quando o cdigo fica muito grande? e quando fazemos mudanas no nosso cdigo, teremos que testar tudo novamente? podemos esquecer de testar algo importante!!! e quando encontramos um bug, o que isso significa?
  • Slide 5
  • 5 Introduo O que queremos? queremos fazer alteraes em nosso cdigo, e saber, ao final, se inserimos algum bug no cdigo no queremos perder conhecimento importante sobre como testar o cdigo queremos testes automticos queremos um boto mgico que roda todos os testes automaticamente e informa se eles passaram ou no!
  • Slide 6
  • 6 Introduo Por que testes automticos so importantes? do coragem para mudar (podem ser alterados sem medo) cdigos frequentemente testados so mais confiveis testes representam patrimnio da empresa testes podem ser interpretados como uma parte da documentao
  • Slide 7
  • 7 Introduo Por que testes automticos so importantes? (cont.) se todos os requisitos do sistema forem transformados em testes, ento o projeto estar pronto, quando todos os testes passarem
  • Slide 8
  • 8 Introduo Existem vrios tipos de testes Testes de Unidade Testes de Regresso Testes de Integrao Testes Funcionais Foco: Testes de Unidade
  • Slide 9
  • 9 Introduo Do que precisamos para comear? Um ferramenta que nos auxilie a desenvolver e testar nossos testes de unidade
  • Slide 10
  • 10 JUnit Um framework para construo / execuo de testes de unidade em Java Como funciona? Criamos uma classe e escrevemos um conjunto de mtodos contendo verificaes Cada verificao avalia se o comportamento do cdigo sendo testado o esperado Exemplo: se o resultado de um mtodo que realizada a soma de 3 + 4 igual a 7.
  • Slide 11
  • JUnit Como funciona? (cont.) Requisitos que um teste deve atender: Cada mtodo de teste deve possuir a anotao @Test Quando for fazer uma assero dentro do mtodo, utilizar um conjunto de mtodos disponibilizados pelo JUnit; entre eles: assertTrue, assertFalse, assertSame, assertNull, assertNotNull, Esses mtodos devem ser importados estaticamente de org.junit.Assert.*
  • Slide 12
  • 12 JUnit Seja a seguinte classe: public class Calculadora { public int somar(int a,int b) { return a + b; }
  • Slide 13
  • 13 JUnit Seja um teste para a classe Calculadora:... import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class MeuPrimeiroTeste { @Test public void somar() { Calculadora calc = new Calculadora(); assertTrue( calc.somar(3,45) == 48 ); assertEquals( 9, calc.dividir(18,2) ); }... @Test public void... }
  • Slide 14
  • JUnit Outras anotaes que tambm podem ser utilizadas em um mtodo de teste: @Before @After @BeforeClass @AfterClass @Test (expected=Exception.class) @Test (timeout=int) @Ignore
  • Slide 15
  • JUnit Exemplo:... @Test(expected=DivisaoPorZeroException.class) public void dividirPorZero() { int n = 2 / 0; } @Before public void zerarConta() { conta = new Conta(); } @After public void fecharConexao() { conexao.close(); }...
  • Slide 16
  • 16 JUnit Comentrios importantes quando testamos, no podemos ter pena do cdigo o cliente no ter! precisamos esquecer um pouco do nosso afeto ao beb!!! precisamos testar: entradas erradas / inconsistentes / nulas precisamos avaliar todas as facetas do cdigo!!! Idealmente, monte um fluxograma contendo tudo a ser testado!
  • Slide 17
  • 17 JUnit Lembrem que da mesma forma que queremos nosso cdigo limpo, nossos testes tambm devem estar Cdigo limpo mais fcil de entender Um teste seguindo boas prticas de programao fica mais claro, permite testar mais com menos linhas de cdigo
  • Slide 18
  • 18 JUnit Como rodamos um teste? Precisamos executar o TestRunner executa todos os mtodos que possuem a anotao @Test se existir um mtodo com a anotao @Before/@After, ele ser executado antes/depois de cada teste se existir um mtodo com a anotao @BeforeClass/@AfterClass, ele ser executado no incio/final do teste (s ser executado uma vez)
  • Slide 19
  • 19 JUnit Usando linha de comando: java -cp junit-4.4.jar;. junit.swingui.Test MeuTest
  • Slide 20
  • 20 JUnit Pergunta: quando escrever os testes? Escrever o cdigo todo e depois testar? Escrever o cdigo e testar ao mesmo tempo? Escrever os testes e depois codificar?!?
  • Slide 21
  • 21 TDD Test Driven Development (TDD) uma tcnica de desenvolvimento de software cujo mantra consiste em escrever um teste, escrever um cdigo simples para fazer o teste passar e, ao final, refatorar o cdigo.
  • Slide 22
  • 22 TDD Mantra do TDD: Escrever um teste Codificar o mnimo o possvel para o teste passar Refatorar
  • Slide 23
  • 23 TDD Testes devem ser feitos em pequenos passos Nunca se codifica sem ter um teste antes! se no, ele volta e pega voc! Quando encontrar um bug, crie um teste antes que prove a existncia do bug, depois corrija-o.
  • Slide 24
  • 24 TDD Testes: documentao executvel! Execute-os periodicamente Use nomes apropriados Mantenha-os simples Todas as asseres do JUnit possui um argumento para descrever o que est sendo testado assertEquals( Saldo no zero!, 0, conta.getSaldo() ); assertNull( Conta no Null!, conta );
  • Slide 25
  • 25 TDD Quando escrevemos um teste antes de codificar estamos pensando em: design teste documentao
  • Slide 26
  • TDD Problema: deseja-se construir um sorteador com os seguintes requisitos: Um jogador poder fazer diversas apostas (cada aposta consiste de quatro nmeros) Custo de uma aposta para o jogador: R$ 10,00 No pode existir nmeros repetidos na aposta Intervalo de nmeros possveis: [1, 2, 3,..., 20] Saldo inicial do sorteador R$100,00 Quando o jogador sorteado, isto , o quarteto apostado o sorteado, todo dinheiro do sorteador passa a ser do jogador. Caso mais de um jogador seja sorteado, o prmio dividido.
  • Slide 27
  • 27 TDD Quando estamos escrevendo testes, o que ns realmente queremos? testes bem focados: queremos testes partes especficas de nossas aplicaes; testes independentes: queremos que nossos testes rodem em qualquer ordem e a qualquer momento; testes rpidos: queremos que nossos testes sejam rodados frequentemente.
  • Slide 28
  • 28 TDD Infelizmente, o mundo cruel e nossas vontades se deparam com as seguintes dificuldades: testes bem focados implicam em uma grande quantidade de testes; torn-los independentes necessite de uma forma eficiente de limpar os objetos utilizados (uma vez que esses objetos podem ser utilizados por outros testes); testar partes isoladas de aplicaes complexas no uma tarefa trivial
  • Slide 29
  • 29 TDD Mock Objects tem o objetivo de simplificar ou amenizar esta problemtica. Mock Objects so utilizados quando difcil ou impossvel criar um determinado estado do sistema sendo testado, ou quando o acesso ao recurso limitado. O princpio bsico atrs de mocks criar objetos leves e controlveis para simplificar a construo de seus testes.
  • Slide 30
  • 30 TDD Devemos criar mocks nas seguintes situaes: Deixar os testes mais focados Fazer com que os testes rodem mais rpidos Simplificar o desenvolvimento de aplicaes que conversam com hardware, dispositivos remotos, ou mesmo, com outras aplicaes.
  • Slide 31
  • 31 TDD Devemos criar mocks nas seguintes situaes (cont.): Promover um desenvolvimento baseado em uma interface Encorajar o uso de composio em vez de herana Testar situaes incomuns
  • Slide 32
  • Muito obrigado pela ateno!